有没有一种简单的方法来更改Excel VBA中的单元格引用?

时间:2014-01-08 17:32:27

标签: excel excel-vba 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

2 个答案:

答案 0 :(得分: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,并为它们分配列号而不是数字。引用范围可能更容易,但您必须在任何地方使用字符串连接。

答案 1 :(得分: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)"