VBA配方太长,要缩短的办法

Goodafternoon所有,

目前面临一个VBA的问题,“loggingmacros”function的工作,但当我尝试重新运行,它给了我1004错误。 我记得我可以做三件事情:

  1. 将公式分成几部分,然后参考公式中的下一部分(即第2部分= abc + def + ghi,所以公式为123 + 3456 + ____,然后用第2部分replace____)
  2. (公式为“a1”)。value(?)+ cell(“b2”)。value(?)
  3. 给部分代码一个特定的名字,这样就会缩短公式(即abc ='INPUT-MOTC!'然后参考公式中的abc

特别是第二部分是我可以使用一些帮助,因为我不知道确切的参考,我总是可以回顾在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)" 

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

(小背景下,我想将星期六和星期日的值加上星期五的值,所以如果星期几是6,那么这样做)。

提前致谢 :)

你可以像这样缩短公式:

 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))" 

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

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

我build议在VBA中移动所有的计算。

  • 单独的input单元需要被命名的范围

名称

  • 将值拉到VBA中, x = Range("OrderDate").Value2
  • 如果你有一个表,而不是你知道的大小,你可以把值拉到一个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