excel - 如何减少多个表格的重复格式化次数?

标签 excel vba optimization formatting

我有一个很好的表格,其中有一个 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

等等,等等......

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

我想过创建一个我要调用的函数,但我必须给它所有相同的信息,所以,我想这是毫无意义的...... 例如,如果我采用此格式 block :

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)

提前致谢!

最佳答案

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

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

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

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

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

例如,我有一个按钮状态,它们可以是:开、关、空闲或加载。每个州都与其他州截然不同。我首先将所有可能的基本属性定义为常量或枚举器(如颜色、字体大小等)。然后我定义一个属性数据类型来保存它们。此数据类型适用于每个按钮(如背景颜色、前景色等),我将这些数据类型向上滚动到表示特定状态(打开、关闭等)的另一种数据类型。我为每个状态创建一个该类型的变量。应用程序初始化时会填充数据类型,我使用一个类将它们整齐地组合在一起。

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

例如,当用作属性时:

myButton.State = isOn

或者一个方法:

SetButtonState myButton,isDisabled,“不可用”

设置它并不完全是微不足道的,但它并不难,我认为这是值得的。

旁注:如果这些数据类型我可以使用类来代替,但我认为类在项目资源管理器中列出了宝贵的空间,不值得关注这些细节。

关于excel - 如何减少多个表格的重复格式化次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58429272/

相关文章:

c - Flow/Job Shop 到 bool 可满足性 [多项式时间缩减] 第 2 部分

vba - Excel VBA 文本转列

vba - 如何使用 Split 来使用换行符作为分隔符来标记文本文件

excel - 我需要在 Excel 工作表中获取 2 列,并将它们转换为以第 1 列作为标题的数据范围

c++ - C++表达式模板的标准设计步骤,如何设计?

algorithm - 子数组查询

用于积分负指数的 VBA 代码

javascript - 运算符 '<' 无法通过 Excel 加载项应用于类型 'number' 和 'Promise<void>'

excel - 用于练习的基于时间的 VBA 脚本

.net - 无法使用证书通过 Windows 10 1809 中的 com-interop 登录网站