簡體   English   中英

用VBA簡化復雜的excel公式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM