过去,我使用变量数组来填充多个Excel单元格。
我想知道,有没有办法用单元格格式做同样的事情?我宁愿不逐个细胞,最好尽量减少获得Excel范围的调用次数......
答案 0 :(得分:4)
我主要做Lance建议的事情。但是,在某些情况下,我将使用我想要设置的格式创建一个单独的隐藏工作表。然后我会
wshHidden.Range("A1:D100").Copy
wshReport.Range("A1:D100").PasteSpecial xlPasteFormats
一下子照顾它。但你确实有隐藏工作表的开销。
答案 1 :(得分:3)
@ExcelHero已经向我指出了如何完成这项工作,所以这就是方法。
如果您的范围是水平的,那么只需输入一个由格式字符串构建的数组:
[a1:c1].NumberFormat = Array("hh:mm", "General", "$#,##0.00")
如果您的范围是垂直的,那么转置该数组,因为Excel认为数组是水平的:
[a1:a3].NumberFormat = WorksheetFunction.Transpose(Array("hh:mm", "General", "$#,##0.00"))
旧答案:
不,您不能单独执行每个单元格,但可以将一种格式批量分配给整个范围。
要分配的范围的属性为.NumberFormat
。如果您创建一个变量数组字符串以指定为格式,然后将其指定给范围,则只应用第一个元素(并将其应用于该范围的所有单元格)。
所以你能做的最好就是循环:
Dim r As Range
Dim v(1 To 3) As Variant
Dim i As Integer
Set r = Range("A1:A3")
v(1) = "hh:mm:ss"
v(2) = "General"
v(3) = "$#,##0.00_);[Red]($#,##0.00)"
For i = 1 to 3
r(i).NumberFormat = v(i)
Next i
答案 2 :(得分:0)
希望我能安全地假设你出于性能原因而这样做。如上所述,它与单元格内容的处理方式不太相同。
但是,如果单元格的格式通常与上次格式化格式相同,则首先检查格式是否需要更改,然后才更改格式要快得多。
这是一个可以做到的功能。在测试(Excel 2003)中,这比总是设置格式快8到10倍,并且关闭了屏幕更新。
Sub SetProperty(ByRef obj As Object, propname, newvalue)
If CallByName(obj, propname, VbGet) <> newvalue Then
Call CallByName(obj, propname, VbLet, newvalue)
End If
End Sub
这样称呼:
Call SetProperty(Cells(1,1).Font, "ColorIndex", 27)
Call SetProperty(Cells(1,1).Borders, "Weight", xlMedium)
etc