Nol*_*884 5 excel vba matrix excel-vba cells
我最近发现可以使用单个命令在一个范围的每个单元格内设置值,如:
Worksheet.Range(Worksheet.Cells(Row1, Column1), Worksheet.Cells(Row2, Column2)) = MyMatrix
Run Code Online (Sandbox Code Playgroud)
MyMatrix2D矩阵在哪里,尺寸为:Row2-Row1和Column2-Column1.
显然,如果我将相同的属性应用于每个单元格(让我们说.Font.Bold- 何时MyMatrix是布尔矩阵),它不起作用:
Worksheet.Range(Worksheet.Cells(Row1, Column1), Worksheet.Cells(Row2, Column2)).Font.Bold = MyMatrix
Run Code Online (Sandbox Code Playgroud)
上面的命令使整个范围"粗体闪烁"几分之一秒,然后没有任何反应.怎么会?
我肯定想避免For循环,因为在我的代码中它需要太长时间.
更新:如果我填的是同一个甚至不工作MyMatrix与串"normal"并"bold",然后写:
Worksheet.Range(Worksheet.Cells(Row1, Column1), Worksheet.Cells(Row2, Column2)).Font.FontStyle = MyMatrix
Run Code Online (Sandbox Code Playgroud)
我也试过(它不起作用):
Worksheet.Range(Worksheet.Cells(Row1, Column1), Worksheet.Cells(Row2, Column2)).Cells.Font.FontStyle = MyMatrix
Run Code Online (Sandbox Code Playgroud)
根据Range.Value 属性 (Excel)的文档,此“返回或设置Variant代表指定范围值的值”。该Variant值可以是一个值,也可以是一组值。所以
With ActiveSheet
.Range("A1:B3").Value = [{1,2;3,4;5,6}]
aValues = .Range("A1:B3").Value
End With
Run Code Online (Sandbox Code Playgroud)
将工作。
但是Range.Font 属性 (Excel) “返回一个Font表示指定对象字体的对象。”。这意味着一个 Font对象而不是一组Font对象。所以
...
aFonts = .Range("A1:B3").Font
...
Run Code Online (Sandbox Code Playgroud)
不管用。两者都不
...
.Range("A1:B3").Font = aFonts
...
Run Code Online (Sandbox Code Playgroud)
将工作。
一个人可以做
...
Set oFont = .Range("A1:B3").Font
...
Run Code Online (Sandbox Code Playgroud)
但这oFont也将成为整个系列的一个目标。 Font
所以
...
oFont.FontStyle = "bold italic"
...
Run Code Online (Sandbox Code Playgroud)
或者
...
oFont.Bold = True
...
Run Code Online (Sandbox Code Playgroud)
总是会影响整个范围。
解决方案:
最好的想法确实是@SteveES 的想法。它使用的范围是所有单元格的联合,应为粗体。但这种方法只有在 的长度strRange低于 256 时才有效。可以使用以下命令轻松测试此限制:
Dim strRange As String
For r = 1 To 125 Step 2
strRange = strRange & "A" & r & ","
Next
strRange = Left(strRange, Len(strRange) - 1)
MsgBox Len(strRange)
With ActiveSheet
.Range(strRange).Font.Bold = True
End With
Run Code Online (Sandbox Code Playgroud)
这将失败,.Range(strRange).Font.Bold = True因为Len(strRange)是 259 。如果循环r仅从 1 到 124,则Len(strRange)= 254 即可工作。
因此,如果要求具有随机数量的单元格,这些单元格应设置为粗体,并且无法使用条件格式确定,那么对我来说,性能最佳的解决方案实际上是对所有具有Application.ScreenUpdating = Falsewhile 循环和设置粗体的单元格进行循环。
Sub setRangeValuesWithStyles()
lRows = 100
lCells = 100
ReDim aValues(1 To lRows, 1 To lCells) As Variant
ReDim aFontBolds(1 To lRows, 1 To lCells) As Boolean
For r = 1 To lRows
For c = 1 To lCells
Randomize
iRnd = Int((100 * Rnd()) + 1)
aValues(r, c) = IIf(iRnd < 50, "T" & iRnd, iRnd)
Randomize
iRnd = Int((100 * Rnd()) + 1)
aFontBolds(r, c) = IIf(iRnd < 50, True, False)
Next
Next
lStartRow = 5
lStartCol = 5
With ActiveSheet
Set oRange = .Range(.Cells(lStartRow, lStartCol), .Cells(lStartRow + lRows - 1, lStartCol + lCells - 1))
oRange.Value = aValues
Application.ScreenUpdating = False
For r = 1 To lRows
For c = 1 To lCells
oRange.Cells(r, c).Font.Bold = aFontBolds(r, c)
Next
Next
Application.ScreenUpdating = True
End With
End Sub
Run Code Online (Sandbox Code Playgroud)
即使使用Union部分范围(例如每行中的单元格),在我的测试中性能也不是更好而是更差。