【问题标题】:How to reduce the number of repetitions for formatting many tables?如何减少格式化多个表格的重复次数?
【发布时间】:2019-10-17 09:27:43
【问题描述】:

我有一个很好的表格,里面有一个 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)

提前致谢!

【问题讨论】:

  • “我想过创建一个我会调用的函数,但我必须给它所有相同的信息,所以,我想这毫无意义......”这不是真的。您只需编写一次 fromatting 函数,然后使用您需要的参数调用该函数。这是要走的路,更少的代码,更高的效率
  • @Damian 我编辑我的问题以详细说明这个主题;)
  • 对于“有时不需要的参数”,您在参数之前有Optional,使其成为可选的,因此您可以提供或不提供。
  • 是的,但是如果我将我的函数定义为 FormatFunction(optional HorizAlign, optional VertAlign, optional InterColour) 并且我只想使用颜色参数,我必须将其编写为 vbaFormatFunction( , , RGB(whatever)) 或 @987654327 @ ...在我看来,两者都比标准 VBA 格式效率低:/

标签: excel vba optimization formatting


【解决方案1】:

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

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

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

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

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

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

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

例如,当用作属性时:

myButton.State = isOn

或者一个方法:

SetButtonState myButton, isDisabled, "Not Available"

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

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

【讨论】:

  • 好吧,我不是在谈论按钮 ^^,但我明白你的意思... 将一次又一次重复的东西聚集在一起,只在一个指令中。这可以让事情变得更轻,是的......
  • @zepeu 是的,不是你在说什么,但仍然完全相关。同样适用于范围、图表、工作表或几乎任何可编辑对象。
  • 嗯,我明白了;这似乎是一个很好的方法,但在我的情况下,对于 3 件静态且一直重复的事情,我想标准解决方案是最好的解决方案......它真的效率不高......或者我应该做一次完成所有内容,所有单元格同时具有相同的格式,最后...看起来问题来了^^,谢谢!
  • @zepeu 另一个要考虑的选项是模板表。如果您创建具有不同区域格式的工作表,那么您可以将格式复制并粘贴到您需要的位置。您还可以将工作表设为xlVeryHidden,使其对用户不可见。
  • 你的意思是,有一种隐藏的模板文件,并且在 VBA 中只是对模板进行“复制 - 过去”而不是格式化每一行?但我担心,在我的情况下,它不会有用,因为我构建的文件是一个列表,并且这个列表中的项目(文件)的数量会增加......如果我是对的,如果我这样做像你说的模板,我必须格式化整个列,Excel会将这些视为“填充列”,因此创建一个 100mo 的文件....对吗?这不是很有效,但我会牢记这个想法,以便何时生成具有固定格式的表格:)
猜你喜欢
  • 2017-03-03
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多