【发布时间】:2018-04-12 22:06:14
【问题描述】:
由于过度使用 LOOKUP 公式,我有一个通常很慢的宏。我想插入一些 VBA 变量来加快这些速度。我目前正在加快以下公式的速度:在 Excel 中:
=IF(ISNA(MATCH(A2,Summary!B:B,0)),"n",I2-((I2/LOOKUP(2,1/(I:I<>""),I:I))*VLOOKUP(A2,Summary!$G$10:$H$902,2,FALSE)))
在 VBA 中:
"=IF(ISNA(MATCH(RC[-9],Summary!C[-8],0)),""n"",RC[-1]-((RC[-1]/LOOKUP(2,1/(C[-1]<>""""),C[-1]))*VLOOKUP(RC[-9],Summary!R10C7:R902C8,2,FALSE)))"
我需要替换的部分是LOOKUP(2,1/(C[-1]<>""""),C[-1])。所有这一切都是引用第一列中最后一个非空单元格。现在我有以下代码来返回 VBA 中最后一个单元格的地址
Sub FormulaTest()
Set lRow = Range("I1").SpecialCells(xlCellTypeLastCell).Address
End Sub
我试图弄清楚如何将这个“lRow”实现到公式的 VBA 代码中。谁能引导我朝着正确的方向前进?
**编辑 1 请参阅下面费尔南多的评论。他有正确的想法,但解决方案仍然有点偏离。我会尝试在几个 cmets 中更好地解释它:首先,第一行始终是标题行,最后一行始终是总和行,当前选项卡是“销售”选项卡,以及任何给定的行数销售标签会有所不同(可能是 I1:I59,也可能是 I:1:I323)。
在本例中,I1 是行标题,I59 是 I2:I58 的总和。 I2:I58 行是美元金额。我的宏将这个公式放在 J2:J58 中。此公式将每行的美元金额 (I2:I58) 作为总额 (I59) 的百分比,并将其乘以“摘要”选项卡 (VLOOKUP) 上的输入金额。然后从 I 列中的美元值中按比例减去该金额,其中 J 单元格显示结果。
我希望在上面的公式中消除对 LOOKUP 函数(选择最后一个非空单元格)的需要: LOOKUP(2,1/(C[-1]""""),C[-1 ])。
**编辑 2 费尔南多的解决方案奏效了。谢谢大家的意见
【问题讨论】:
-
你把这些公式放在哪里了? "=IF(ISNA(MATCH(RC[-9],Summary!C[-8],0)),""n"",RC[-1]-((RC[-1]/LOOKUP(2, 1/(C[-1]""""),C[-1]))*VLOOKUP(RC[-9],Summary!R10C7:R902C8,2,FALSE)))" 只是在一列?
-
对于单元格 A 与“摘要”选项卡上的相应单元格匹配的任何行,这些公式都放在 J 列中
-
您真的需要工作表上的公式吗?你可能会更好地完成你在 VBA 中所做的任何事情。将您的范围读入一个变体数组;然后通过数组来创建你的结果;然后将其写回工作表。
-
您的问题说您使用的是 INDIRECT,但您的示例中没有 INDIRECT。您还需要提供更多信息才能从该论坛获得最佳结果。公式有什么作用?查找列表中有多少项?目前计算需要多长时间?将逻辑转移到 VBA 可能会加快速度,但我几乎可以肯定,如果您回答我的问题,那么我可以为您提供一个闪电般快速的公式或使用数据透视表的方法,它比 VBA 方法更快、更简单。跨度>
-
另外,您只发布了部分代码。您的慢速症状的一部分可能与您使用这些公式填充工作表的方式有关。您是否一次将公式写入一个单元格?您还可以通过使用
IFERROR来替换对IF(ISNA的需要,从根本上加快公式的速度,并且您可以使用数组公式一次处理整个范围。但同样,您需要进一步详细说明您正在尝试做什么、您的数据布局是什么样的以及其余代码的结构。
标签: vba excel excel-formula