VBA配方太长,要缩短的办法
Goodafternoon所有,
目前面临一个VBA的问题,“loggingmacros”function的工作,但当我尝试重新运行,它给了我1004错误。 我记得我可以做三件事情:
- 将公式分成几部分,然后参考公式中的下一部分(即第2部分= abc + def + ghi,所以公式为123 + 3456 + ____,然后用第2部分replace____)
- (公式为“a1”)。value(?)+ cell(“b2”)。value(?)
- 给部分代码一个特定的名字,这样就会缩短公式(即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