代码之家  ›  专栏  ›  技术社区  ›  Jon Fournier

用数组设置Excel区域格式

  •  5
  • Jon Fournier  · 技术社区  · 14 年前

    我想知道,有没有一种方法可以对单元格格式做同样的事情?我不想一个单元格一个单元格地去,最好是尽量减少调用的次数来获得一个Excel范围。。。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Lance Roberts    5 年前

    @ExcelHero已经向我指出了如何完成这项工作,下面是方法。

    如果您的范围是水平的,则只需向其提供一个由格式字符串构建的数组:

    [a1:c1].NumberFormat = Array("hh:mm", "General", "$#,##0.00")   
    

    [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
  •  4
  •   Dick Kusleika    14 年前

    wshHidden.Range("A1:D100").Copy
    wshReport.Range("A1:D100").PasteSpecial xlPasteFormats
    

    一下子就搞定了。但是你有隐藏床单的头顶。

        3
  •  0
  •   Bbb    11 年前

    希望我可以放心地假设您这样做是出于性能原因。正如上面所回答的,它实际上不可能像处理单元格内容那样。

    但是,如果单元格的格式通常与上次格式化时的格式相同,则先检查格式是否需要更改,然后再更改格式要快得多。

    这里有一个函数可以做到这一点。在tests(excel2003)中,这比通常设置格式快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