VBA公式太长,如何缩短它

VBA公式太长,如何缩短它,vba,excel,Vba,Excel,大家下午好 目前面临一个VBA问题,“record macro”函数确实起作用,但当我尝试重新运行它时,它给出了1004错误。 我记得我可以做三件事: 将公式分成若干部分,然后参考公式中的下一部分(即第2部分=abc+def+ghi,因此公式为123+3456+_______________;,然后用第2部分替换) 将公式作为文本放在不同的单元格中,然后引用公式中的单元格(公式为单元格(“a1”)。值(?)+单元格(“b2”)。值(?) 为部分代码指定一个特定的名称,以便缩短公式(即abc='I

大家下午好

目前面临一个VBA问题,“record macro”函数确实起作用,但当我尝试重新运行它时,它给出了1004错误。 我记得我可以做三件事:

  • 将公式分成若干部分,然后参考公式中的下一部分(即第2部分=abc+def+ghi,因此公式为123+3456+_______________;,然后用第2部分替换)
  • 将公式作为文本放在不同的单元格中,然后引用公式中的单元格(公式为单元格(“a1”)。值(?)+单元格(“b2”)。值(?)
  • 为部分代码指定一个特定的名称,以便缩短公式(即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)"
    
    ActiveCell.FormulaR1C1=_
    
    “=如果(工作日(RC2)=6,COUNTIFS('INPUT-MOTC'!C90”,“已确认”,“INPUT-MOTC'!C101”,“1”,“INPUT-MOTC'!C74”,“500”,“INPUT-MOTC'!C86”,“C”,“INPUT-MOTC'!C47,”您可以这样缩短公式:

    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))"
    
    ActiveCell.FormulaR1C1=_
    
    “=如果(工作日(RC2)=6,和('INPUT-MOTC'!C90”,“已确认”,“INPUT-MOTC'!C101”,“1”,“INPUT-MOTC'!C74”,“500”,“INPUT-MOTC'!C86”,“C”,“INPUT-MOTC'!C47,”您可以这样缩短公式:

    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))"
    
    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)”,此公式完全无法维护。请不要再这样做

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

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

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

    • 使用
      x=Range(“OrderDate”)将值拉入VBA。值2
    • 如果您有一个比您知道的大小更大的表,您可以将值拉入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
    
    • 让您的复杂计算与注释分步进行
    例如:

    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
    

    这个公式是完全无法维护的。再也不要这样做了

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

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

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

    • 使用
      x=Range(“OrderDate”)将值拉入VBA。值2
    • 如果您有一个比您知道的大小更大的表,您可以将值拉入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
    
    • 让您的复杂计算与注释分步进行
    例如:

    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
    


    为什么在你的公式中混合了R1C1样式和普通样式?要使用VBA将公式放入单元格,你应该只使用R1C1样式你到底是什么意思?我在哪里没有使用它?对不起,这是一个相对较新的主题。啊,谢谢你的解释。这里的C90实际上是指第90列“输入-MOTC”!$CL:$CL,那么我仍然是adh吗遵守R1C1规则?是的,你是-
    C90
    是正确的。你为什么在你的公式中混合使用R1C1样式和普通样式?要使用VBA将公式放入单元格,你应该只使用R1C1样式。R1C1样式的确切含义是什么?我在哪里不使用它?对不起,这是一个相对较新的主题。啊,谢谢你的解释。这里是C90lly指的是第90列,'INPUT-MOTC'!$CL:$CL,那么我仍然坚持R1C1规则吗?是的,你是-
    C90
    是正确的。绝对是胡说八道。任何有一半能力的excel用户都应该能够理解这一点。(长度与复杂性不同)。我将忽略我是非人道的含义。因为你不知道代码在做什么,或者任何情况,你不能合理地做出这样的断言。我刚刚编辑了代码-它在公式末尾缺少一个结束括号。不-宏记录器有错。当它试图将长公式分解为mu时在多行中,它最终用换行符所需的附加字符替换了实际公式的一部分,因此公式不再正确。正确-它有效地创建了COUNTIFS公式数组,然后通过添加的求和函数对该数组进行求和。完全是胡说八道。任何有能力的excel用户都应该能够理解这一点。(长度与复杂性不同)。我将忽略我是非人道的含义。因为你不知道代码在做什么,或者任何情况,你不能合理地做出这样的断言。我刚刚编辑了代码-它在公式末尾缺少一个结束括号。不-宏记录器有错。当它试图将长公式分解为mu时在多行中,它最终用换行符所需的附加字符替换了实际公式的一部分,因此公式不再正确。正确-它有效地创建了COUNTIFS公式数组,然后通过添加的求和函数对该数组求和。