使用数组设置Excel范围格式

时间:2010-10-04 14:14:13

标签: excel vba

过去,我使用变量数组来填充多个Excel单元格。

我想知道,有没有办法用单元格格式做同样的事情?我宁愿不逐个细胞,最好尽量减少获得Excel范围的调用次数......

3 个答案:

答案 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