我有一个已命名的单元格范围,但单元格不连续(不是矩形范围)
我需要为该范围内的每个单元格分配背景值和颜色。
在宏中,命名是有效的。是否可以在一个语句中为范围内的所有单元格分配背景值和颜色?
不然的话,如果我必须做一个循环,该怎么写呢? (我写的不起作用:
未找到错误属性或方法: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
我尝试了不同的语法来获取行数和列数,但没有任何效果
一行更改整个范围的颜色并不困难:用您想要的范围的
.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
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