Excel VBA - 是否可以通过使用矩阵为某个范围的每个单元格设置属性?

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)

Axe*_*ter 2

根据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部分范围(例如每行中的单元格),在我的测试中性能也不是更好而是更差。

  • “设置字体属性而不必使用`For`循环”到底要实现什么?也许条件格式会是更好的方法? (2认同)