libreoffice calc 如何在命名范围内循环

问题描述 投票:0回答:2

我有一个已命名的单元格范围,但单元格不连续(不是矩形范围)

我需要为该范围内的每个单元格分配背景值和颜色。

在宏中,命名是有效的。是否可以在一个语句中为范围内的所有单元格分配背景值和颜色?

不然的话,如果我必须做一个循环,该怎么写呢? (我写的不起作用:

未找到错误属性或方法:GETROWS

谢谢您的帮助

sub addColorToNameGameBoard()

Dim myDocument As Object
Dim zoneOfNames As Object
Dim gameRangeName As String
Dim gameRangeNameCoordinates As String
Dim oCellAdress As New com.sun.star.table.CellAddress

myDocument = Thiscomponent

gameRangeNameCoordinates = "Feuille1.$B$5:$C$7~Feuille1.$D$4:$H$8" 

gameRangeName = "plateauDeJeu" 

zoneOfNames = myDocument.NamedRanges 
If zoneOfNames.hasByName(gameRangeName) then 
    zoneOfNames.removeByName(gameRangeName) 
end If
zoneOfNames.addNewByName(gameRangeName, gameRangeNameCoordinates ,oCellAdress,0)'


Dim myGameBoard as Object
myGameBoard = zoneOfNames.getByName(gameRangeName)
'KO myGameBoard.BackColor = rgb(255,0,0)
'myGameBoard.CellBackColor = RGB(100, 0 ,100)
Dim ReferredCells as Object
Dim aRangeAddress as Object

oReferredCells = myGameBoard.getReferredCells()
aRangeAddress = oReferredCells.getRangeAddress()

Dim oSheet As Object
oSheet = myDocument.getSheets().getByName("Feuille1") 'Sheet1
Dim oCellRange As Object    
oCellRange = oSheet.getCellRangeByName(gameRangeName) 

Dim myCell as Object
Dim i as long, j as long
For i = 0 To oCellRange.getRows().getCount()-1
    For j = 0 To oCellRange.getColumns().getCount()-1
        myCell = oCellRange.getCellByPosition(i,j)
        myCell.setValue(4)
        myCell.cellbackcolor = RGB(50,60,70) 
    Next j
Next i

End Sub

我尝试了不同的语法来获取行数和列数,但没有任何效果

libreoffice named-ranges calc contiguous
2个回答
0
投票

一行更改整个范围的颜色并不困难:用您想要的范围的

.CellStyle
属性的设计指定某种样式的名称,整个范围将立即重新绘制。为每个单元格分配特定值时情况会更糟。正如这个答案中所解释的 - Libreoffice calc - 如何将相同的值写入范围,您将必须使用行和列循环。您使用波浪号描述的范围的情况非常糟糕 - 没有用于处理此类结构的内置工具。这意味着您必须单独处理地址的每个部分。一般来说,解决方案代码可能如下所示:

sub nommerAireDeJeu()

Dim monDocument As Object
Dim zoneDeNoms As Object
Dim nomDeLaPlageDeJeu As String
Dim coordonneesDeLaPlageDeJeu As String
Dim oCellAdress As New com.sun.star.table.CellAddress

monDocument = Thiscomponent

coordonneesDeLaPlageDeJeu = "Feuille1.$B$5:$C$7~Feuille1.$D$4:$H$8" 
nomDeLaPlageDeJeu = "plateauDeJeu" 

zoneDeNoms = monDocument.NamedRanges 
If zoneDeNoms.hasByName(nomDeLaPlageDeJeu) then 
    zoneDeNoms.removeByName(nomDeLaPlageDeJeu) 
end If
zoneDeNoms.addNewByName(nomDeLaPlageDeJeu, coordonneesDeLaPlageDeJeu ,oCellAdress,0)'

Dim oStyleFamilies As Variant
Dim nouveauStyle As Variant
    oStyles = monDocument.getStyleFamilies().getByName("CellStyles")
    If Not oStyles.hasByName(nomDeLaPlageDeJeu) Then
        nouveauStyle = monDocument.createInstance("com.sun.star.style.CellStyle")
        nouveauStyle.ParentStyle = oStyles.getByIndex(0).getName() ' "Default"
        oStyles.insertByName(nomDeLaPlageDeJeu, nouveauStyle)
        nouveauStyle.setPropertyValue("CellBackColor", RGB(50,60,70) )
    EndIf

Dim aAdresses As Variant 
Dim aRanges As Variant, aRange As Variant, aRngData As Variant
Dim i As Long, j As Long, m As Long, n As Long
    aAdresses = Split(coordonneesDeLaPlageDeJeu, "~")
    For i = LBound(aAdresses) To UBound(aAdresses)
        aRanges = monDocument.getSheets().getCellRangesByName(aAdresses(i))
        For j = LBound(aRanges) To UBound(aRanges)
            aRange = aRanges(j)
            aRngData = aRange.getData()
            For m = LBound(aRngData) To UBound(aRngData)
                For n = LBound(aRngData(m)) To UBound(aRngData(m))
                    aRngData(m)(n) = 12345
                Next n
            Next m
            aRange.setData(aRngData)
            aRange.CellStyle = nomDeLaPlageDeJeu
        Next j
    Next i
End Sub

0
投票
doc = ThisComponent
sheet = doc.CurrentController.ActiveSheet
group = doc.createInstance("com.sun.star.sheet.SheetCellRanges")
Dim indexColumn as long, indexLine as long

range1 = sheet.getCellRangeByName("Feuille1.$B$5:$C$7")
range2 = sheet.getCellRangeByName("Feuille1.$D$4:$H$8")

group.addRangeAddress(range1.RangeAddress, False)
group.addRangeAddress(range2.RangeAddress, False)

MsgBox group.RangeAddressesAsString 
For Each individualRange In group
     For indexLine = 0 To individualRange.getRows().getCount()-1
        For indexColumn = 0 To individualRange.getColumns().getCount()-1
            myCell = individualRange.getCellByPosition(indexColumn,indexLine )
            myCell.setValue(4)
            myCell.cellbackcolor = RGB(50,60,70) 
        Next indexColumn
    Next indexLine 
Next individualRange
© www.soinside.com 2019 - 2024. All rights reserved.