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

有没有一种简单的方法可以在Excel VBA中更改单元格引用?,excel,vba,Excel,Vba,我最近开发了一个工作模型,我收到了添加附加功能的请求 问题不在于添加,因为最简单的方法是添加一个或两个额外的列。然而,每次我添加一列时,我必须逐行检查我的代码,并更改每个公式引用,例如,将H更改为H、将H更改为I、将I更改为J等 有没有什么方法可以使这个过程自动化,而不必单独更改每个公式,或者在从头开始构建下一个模型时可以记住的最佳实践 例如,假设有人要求进行额外的计算,需要我在D列中插入一个公式。目前,我将访问每一列(以下示例中的H、J、K和L),并分别手动将它们更新为I、K、L和M 'Yea

我最近开发了一个工作模型,我收到了添加附加功能的请求

问题不在于添加,因为最简单的方法是添加一个或两个额外的列。然而,每次我添加一列时,我必须逐行检查我的代码,并更改每个公式引用,例如,将H更改为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

我通常做的是在模块的开头添加一些常量(或者对于更大的项目,添加一个单独的模块),并引用列号

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
,并将它们指定为列字母而不是数字。引用范围可能更容易,但您必须在任何地方使用字符串连接。

一种可能性是使用相对R1C1引用

Const c_Column1 As Integer = 1
Const c_Column2 As Integer = 2
例如,不是在H23中指定公式,而是:

Range(FormulaRange_ASP1).Value = "=IFERROR(G23/F23,0)"
您可以将其指定为:

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

你能给我们看看你的一些代码吗?我想知道为什么你需要在代码中创建所有这些公式。如果您只是在工作表(可能是模板?)中创建了这些公式,则在添加或删除列时,这些公式将自动调整。