2014-01-08 106 views
2

我最近開發了一個工作模型,並收到了添加附加功能的請求。有沒有簡單的方法來更改Excel VBA中的單元格引用?

問題不在於添加,因爲大多數情況下只需添加一個或兩個額外的列。但是,每次添加一列時,我都必須逐行瀏覽我的代碼並更改每個公式參考值,例如G到H,H到I,I到J等

有沒有什麼辦法可以讓我自動化這個過程,而不必單獨更改每個配方,或者在構建我的下一個模型時可以牢記的最佳實踐刮?

例如,假設有人要求額外的計算,要求我在D列中插入一個公式。目前我要去每列(下面例子中的H,J,K和L)以及手動更新他們分別爲I,K,L和M.

'Year 1 ASP formula = (Year 1 Bookings)/(Year 1 Units) 
FormulaRange_ASP1 = "H23:H" & NumRows 
Range(FormulaRange_ASP1).Value = "=IFERROR(G23/F23,0)" 
Range(FormulaRange_ASP1).NumberFormat = "0.00" 
Application.ScreenUpdating = False 

'Year 2 AR Units formula = (Year 1 Units) * (Vlookup AR Retention Rate for product in column C) 
FormulaRange_ARUnits2 = "J23:J" & NumRows 
Range(FormulaRange_ARUnits2).Value = "=IF(E23 = 12,VLOOKUP(D23,$B$8:$F$19,4,FALSE),0) * F23 * AR_Opt_In" 
Range(FormulaRange_ARUnits2).NumberFormat = "#,##0_)" 
Application.ScreenUpdating = False 

'Year 2 AR ASP formula = (Vlookup ASP for product in column C) 
FormulaRange_AR_ASP2 = "K23:K" & NumRows 
Range(FormulaRange_AR_ASP2).Value = "=IFERROR(VLOOKUP(D23,$B$8:$F$19,2,FALSE),0)" 
Range(FormulaRange_AR_ASP2).NumberFormat = "0.00" 
Application.ScreenUpdating = False 

'Year 2 AR Bookings formula = (Year 2 Units) * (Year 2 ASP) 
FormulaRange_AR_Bookings2 = "L23:L" & NumRows 
Range(FormulaRange_AR_Bookings2).Value = "=J23 * K23" 
Range(FormulaRange_AR_Bookings2).NumberFormat = "$#,##0_)" 
Application.ScreenUpdating = False 
+0

你能告訴我們一些你的代碼嗎? –

+2

我想知道爲什麼你需要在代碼中創建所有這些公式。如果您只是在工作表(可能是一個模板?)中創建它們,則公式會在添加或刪除列時自動調整。 –

回答

2

我最常做的是添加一些常量到模塊(或單獨的模塊,用於更大的項目)與列號引用的開始。

Const c_Column1 As Integer = 1 
Const c_Column2 As Integer = 2 

所以在整個代碼,你可以這樣做:

For i = 2 to 10 
    ActiveSheet.Cells(i, c_Column1).Value = i 
Next i 

..和永遠不必擔心改變你的代碼,只有常量。

請注意,使用Cells()而不是Range(),因爲它允許將列引用爲數字。要引用一個範圍,你必須使用以下sintax:

With ActiveSheet 
    For i = 2 to 10 
     .Range(.Cells(i, c_Column1), .Cells(i, c_Column2)).Value = i 
    Next i 
End With 

還可以聲明常量,String,並將它們分配列字母而不是數字。引用範圍可能更容易,但是你必須在任何地方使用字符串連接。

+0

優秀點。我沒有想到這一點。謝謝! – sirish59

1

一種可能性是使用相對R1C1參考。

E.g.代替H23指定一個公式:

Range(FormulaRange_ASP1).Value = "=IFERROR(G23/F23,0)" 

您可以將它指定爲:

Range(FormulaRange_ASP1).FormulaR1C1 = "=IFERROR(R[0]C[-1]/R[0]C[-2],0)" 
相關問題