2014-01-08 108 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)" 
相关问题