使用VBA

时间:2017-10-31 16:46:29

标签: excel vba excel-vba excel-formula

由于过度使用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])。所有这一切都是引用列I中的最后一个非空单元格。现在我有以下代码返回VBA中最后一个单元格的地址

Sub FormulaTest()
Set lRow = Range("I1").SpecialCells(xlCellTypeLastCell).Address

End Sub

我想弄清楚如何实现这个&#34; lRow&#34;进入公式的VBA代码。任何人都可以引导我朝着正确的方向前进吗?

**编辑1 请参阅下面的费尔南多的评论。他有正确的想法,但解决方案仍然有点偏。我会尝试在几条评论中更好地解释它:首先,第一行始终是标题行,最后一行始终是一个总和行,当前标签是&#34;销售&#34;选项卡,任何给定的销售选项卡中的行数将有所不同(可能是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]&lt;&gt;&#34;&#34; &#34;&#34),C [-1])。

**编辑2 费尔南多的解决方案奏效了。谢谢大家的意见

2 个答案:

答案 0 :(得分:1)

这将返回第I列中的最后一个非空行

with Worksheets("Summary")
lRow = .Cells(.Rows.Count, "I").End(xlUp).Row
end with

所以你的代码将是

sub testy
dim lRow as long
with Worksheets("Summary")
lRow = .Cells(.Rows.Count, "I").End(xlUp).Row
end with

"=IF(ISNA(MATCH(RC[-9],Summary!C[-8],0)),""n"",RC[-1]-_
((RC[-1]/R"&lRow&"C[-1])*VLOOKUP(RC[-9],Summary!R10C7:R902C8,2,FALSE)))"

在您的解决方案中,您使用的是xlCellTypeLastCell。这非常有用,但它会根据UsedRange计算,这可能不是您想要的。有了这个,如果你有数据行n,然后你更新数据,现在你的记录更少,xlCellTypeLastCell的最后一行仍然是n,所以要小心这一点。

答案 1 :(得分:0)

假设您正在活动工作表上完成所有工作,请查看“摘要”表:

Sub fillCol()

    Dim aRow As Long, bRow As Long

    aRow = Cells(Rows.Count, "I").End(xlUp).Row
    bRow = Sheets("Summary").Cells(Rows.Count, "I").End(xlUp).Row

    Range("J2:J" & aRow).FormulaR1C1 = "=IF(ISNA(MATCH(RC[-9],Summary!C[-8],0)),""n"",RC[-1]-" _
                       & "((RC[-1]/" & aRow & ")*VLOOKUP(RC[-9],Summary!R10C7:R" & bRow & "C8,2,FALSE)))"

End Sub

您需要更改包含连续范围的列(以确定最后一行)