[英]Simplifying complex excel formula with VBA
由於過度使用 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
我想弄清楚如何將這個“lRow”實現到公式的 VBA 代碼中。 任何人都可以引導我朝着正確的方向前進嗎?
**編輯 1 請參閱下面費爾南多的評論。 他的想法是正確的,但解決方案仍然有點偏離。 我會嘗試在一些評論中更好地解釋它:首先,第一行始終是標題行,最后一行始終是總和行,當前選項卡是“銷售”選項卡,以及任何給定的行數銷售標簽會有所不同(可能是 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])。
**EDIT 2 Fernando 的解決方案有效。 謝謝大家的意見
這將返回 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
,所以要小心。
假設您正在活動工作表上完成所有工作,查找“摘要”工作表:
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
您需要更改包含連續范圍的列(以確定最后一行)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.