【问题标题】:VBA formula too long, ways to shorten itVBA公式太长,缩短它的方法
【发布时间】:2016-11-17 13:50:21
【问题描述】:

大家下午好,

目前面临一个 VBA 问题,其中“记录宏”功能确实有效,但是当我尝试重新运行它时,它给了我 1004 错误。 我记得我可以做三件事:

  1. 将公式拆分成部分,然后参考公式中的下一部分(即第2部分= abc+def+ghi,因此公式为123+3456+____,然后将__替换为第2部分)
  2. 将公式作为文本放在不同的单元格中,然后引用公式中的那些单元格(公式为 cell("a1").value(?) + cell("b2").value(?)
  3. 为代码的某些部分指定一个特定名称,以便缩短公式(即 abc = 'INPUT - MOTC!' 然后在公式中引用 abc

尤其是第 2 部分,我可以使用一些帮助,因为我不知道确切的参考,而且我总是可以在 excel 中查看公式,而不是转到 VBA。

公式本身是:

ActiveCell.FormulaR1C1 = _
    "=IF(WEEKDAY(RC2)=6,COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2)" & _
    "+COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2+1)" & _
    "+COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2+2)" & _
    ",COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2)"

是我做错了什么,还是公式太长了?

(小背景,我想把saturday&sunday的值加到friday的值上,所以如果weekday是6,那就加吧)。

提前致谢:)

【问题讨论】:

  • 你为什么在你的公式中混合了 R1C1 样式和 common 样式?
  • 使用 VBA 将公式放入单元格中,您应该只使用 R1C1 样式
  • R1C1 风格到底是什么意思?我在哪里不使用它?抱歉,这个主题相对较新。
  • 啊,谢谢你的解释。这里的 C90 实际上是指第 90 列,'INPUT -MOTC'!$CL:$CL,所以我仍然遵守 R1C1 规则吗?
  • 是的,你是 - C90 是正确的。

标签: vba excel


【解决方案1】:

这个公式是完全不可维护的。永远不要再这样做了!

我个人从不使用 VBA 在单元格中设置公式。我总是在 VBA 中进行计算,并且只在单元格中显示结果。这样做的缺点是不是“实时”计算并且需要触发(如按下按钮),但更易于维护。

我建议将所有计算移到 VBA 中。

  • 单个输入单元格需要命名范围

  • 使用x = Range("OrderDate").Value2将值拉入VBA
  • 如果您有一个比您知道大小的表,您可以将这些值拉入一个 VBA 数组。

例如一张 100×7 的桌子:

Dim table_values() as Variant
table_values = Range("top_left_cell").Resize(100,7).Value2
' to loop through values
For i=1 to 100
    table_values(i,7) = ...
Next i
' Replace the values with new calculated values
Range("top_left_cell").Resize(100,7).Value2 = table_values
  • 让您将复杂的计算分步使用 cmets

例如:

Set r = Range("table_name")
For i = 1 To n
    'Find the column with the date
    d = r.Offset(i - 1, 2).Value2
    If WorksheetFunction.Weekday(d) Then
        ' If weekday count items with ...
        n_confirmed = WorksheetFunction.CountIfs( '...
        n_shipped = WorksheetFunction.CountIfs( '...
    Else
        ' otherwise count  ...
        n_confirmed = WorksheetFunction.CountIfs( '...
        n_queue = WorksheetFunction.CountIfs( '...
    End If
    ' Fill the result
    r.Offset(i - 1, 3).Value2 = n_confirmed + n_shipped + n_queue
Next i

【讨论】:

    【解决方案2】:

    你可以像这样缩短公式:

    ActiveCell.FormulaR1C1 = _
        "=IF(WEEKDAY(RC2)=6,SUM(COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2+{0,1,2}))" & _
        ",COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2))"
    

    【讨论】:

    • 绝对废话。任何能胜任的 excel 用户都应该能够理解这一点。 (长度与复杂度不同)。我会忽略我不人道的暗示。
    • 因为你不知道代码还在做什么,或者任何情况,你不能合理地做出这样的断言。
    • 我刚刚编辑了代码 - 公式末尾缺少右括号。
    • 否 - 宏记录器有问题。当它试图将长公式分成多行时,最终会用换行所需的附加字符替换部分实际公式,因此公式不再正确。
    • 正确 - 它有效地创建了一个 COUNTIFS 公式数组,然后该数组由添加的 SUM 函数求和。
    猜你喜欢
    • 1970-01-01
    • 2014-10-19
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2018-06-06
    • 2021-05-05
    相关资源
    最近更新 更多