首页 > 解决方案 > 如何减少格式化多个表格的重复次数?

问题描述

我有一个很好的表格,里面有一个 VBA 代码,可以自动填充并格式化它(我一直在研究这个问题)。

它非常好,速度快,工作良好,但是当我查看代码时,有几十行只是关于单元格的格式......

有没有办法对此进行优化,使其对人眼/大脑更容易忍受?

我让你看看:

Application.DisplayAlerts = False                                           'Deactivate the alerts in case the cell is filled
    With Range("A" & PosStartLine + (TPICode * 3) - 3 & ":A" & PosStartLine + (TPICode * 3) - 1)
        .Select
        .Value = FullTPICode
        .Interior.Color = RGB(220, 230, 241)
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .Borders.LineStyle = xlContinuous
        .Font.Size = 11
        .Font.Bold = True
        .Merge       'Merging the 3 cells
        .EntireRow.Borders(xlEdgeTop).Weight = xlMedium
        .EntireRow.Borders(xlEdgeBottom).Weight = xlMedium
    End With
    Application.DisplayAlerts = True

    'Writes down the details on the next column (as we're there... why not?)
    With Worksheets(RealData).Range("B" & PosStartLine + (TPICode * 3) - 3)
        .Select
        .Value = "Nb cars done"
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlCenter
        .Interior.Color = RGB(216, 228, 188)
        .Borders.LineStyle = xlContinuous
        .Font.Size = 11
    End With

    With ActiveCell.Offset(1, 0)
        .Value = "Nb cars left"
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlCenter
        .Interior.Color = RGB(217, 217, 217)
        .Borders.LineStyle = xlContinuous
        .Font.Size = 11
    End With

    With ActiveCell.Offset(2, 0)
        .Value = "Price"
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlCenter
        .Interior.Color = RGB(252, 213, 180)
        .Borders.LineStyle = xlContinuous
        .EntireColumn.AutoFit
        .Font.Size = 11
    End With

别的地方 :

    Worksheets(RealDataReg).Activate
    With Worksheets(RealDataReg).Range(Split(Cells(1, PosStartColumn).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3 & ":" & _
    Split(Cells(1, PosStartColumn + 61).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3)
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlCenter
        .Interior.Color = RGB(235, 241, 222)
        .Borders.LineStyle = xlContinuous
        .Font.Size = 11
    End With

    With Worksheets(RealDataReg).Range(Split(Cells(1, PosStartColumn).Address, "$")(1) & PosStartLine + (TPICode * 3) - 2 & ":" & _
    Split(Cells(1, PosStartColumn + 61).Address, "$")(1) & PosStartLine + (TPICode * 3) - 2)
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlCenter
        .Interior.Color = RGB(242, 242, 242)
        .Borders.LineStyle = xlContinuous
        .Font.Size = 11
    End With

    With Worksheets(RealDataReg).Range(Split(Cells(1, PosStartColumn).Address, "$")(1) & PosStartLine + (TPICode * 3) - 1 & ":" & _
    Split(Cells(1, PosStartColumn + 61).Address, "$")(1) & PosStartLine + (TPICode * 3) - 1)
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlCenter
        .Interior.Color = RGB(253, 233, 217)
        .Borders.LineStyle = xlContinuous
        .Font.Size = 11
    End With

'Putting the calculation in the last cell of the table
    With Worksheets(RealDataReg)
            .Cells(PosStartLine + (TPICode * 3) - 3, PosStartColumn + 61).Formula = "=SUM(" & _
            .Cells(PosStartLine + (TPICode * 3) - 3, PosStartColumn + 1).Address(False, False) & ":" & _
            .Cells(PosStartLine + (TPICode * 3) - 3, Split(Cells(1, PosStartColumn + 60).Address, "$")(1)).Address(False, False) & ")"
    End With
'Formatting the cells with the calculations
    With Worksheets(RealDataReg).Range(Split(Cells(1, PosStartColumn + 61).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3)
            .HorizontalAlignment = xlRight
            .VerticalAlignment = xlCenter
            .Interior.Color = RGB(216, 228, 188)
            .Borders.LineStyle = xlContinuous
            .Font.Size = 11
            .Select
    End With

等等等等...

有人知道让所有这些格式更高效的聪明方法吗?更好?正如您可能看到的,格式每次都非常相似,但出现了细微的差异(颜色、边框、范围等)

我想过制作一个我会调用的函数,但我必须给它所有相同的信息,所以,我想这毫无意义......例如,如果我采用这个格式化块:

With Worksheets(RealDataReg).Range(Split(Cells(1, PosStartColumn).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3 & ":" & _
Split(Cells(1, PosStartColumn + 61).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3)
    .HorizontalAlignment = xlRight
    .VerticalAlignment = xlCenter
    .Interior.Color = RGB(235, 241, 222)
    .Borders.LineStyle = xlContinuous
    .Font.Size = 11
End With

它会变成这样:

Call FormatFunction( Worksheets(RealDataReg), Range(Split(Cells(1, PosStartColumn).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3 & ":" & _
Split(Cells(1, PosStartColumn + 61).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3), xlRight, xlCenter, (235, 241, 222), xlContinuous, 11))

但是当然,在某些情况下会有一些不需要的参数,所以我在传递参数时必须“瞄准好的参数”......我猜使用标准 VBA 格式更容易做到这一点...

我想有一种标准的聪明方法可以做到这一点,但我在谷歌上找不到任何东西(它只是给了我关于如何格式化表格的结果,但我已经知道了:D)

提前感谢!

标签: excelvbaoptimizationformatting

解决方案


也许有人会证明我错了(如果他们这样做那就太好了),但我不相信你的问题有任何“正确”的答案。

也许最简单和最不冗余的方法是从识别经常一起出现的两种或多种格式开始。然后定义一个自定义数据类型来传递带有一个变量的格式。

或者,您可以创建一个设置相同格式的子例程,并将被格式化的对象作为参数传递。虽然这不是我真正推荐的东西,但工作量太大,收效甚微,而且有点混乱。

后期编辑:您可以尝试添加隐藏的模板表来复制和粘贴格式,而不是每次都重新制作它们。

我个人的选择实际上要复杂一些,但我觉得它更优雅,更容易维护和修改。长话短说:常量和枚举器被堆叠成用于由类设置的类别的数据类型。

例如,我有一个按钮状态,它们可以是:on、off、idle 或 loading。每个状态都与另一个状态大相径庭。我首先将所有可能的基本属性定义为常量或枚举器(如颜色、字体大小等)。然后我定义一个属性数据类型来保存它们。此数据类型适用于每个按钮(如背景颜色、前景色等),我将这些数据类型提升到另一个表示特定状态(开、关等)的数据类型。我为每个状态创建一个该类型的变量。数据类型在应用程序初始化时填充,我使用一个类将它们整齐地组合在一起。

进行设置的所有工作都不是白费的。任何数量的格式都可以在一行中更改而无需重复,同时确保一个位置的一次更改适用于每个对象。这允许更清晰的自我记录代码,易于编写和维护,同时还可以在整个项目中为对象提供一致性。

例如,当用作属性时:

myButton.State = isOn

或者一个方法:

SetButtonState myButton, isDisabled, "Not Available"

设置它并不是微不足道的,但它并不难,我认为值得付出努力。

旁注:如果这些数据类型,我可以使用类来代替,但我认为类在项目浏览器中列出了有价值的房地产,不值得这样细枝末节。


推荐阅读