在Excel中添加新行而不会破坏使用Range.Value的vbamacros

我已经在VBA中写了一个macros,它只是填充表单中另一个单元格的给定单元格的值。 我在表单中为这个单元格做了很多工作,我这样做:

Range("B3").Value = Range("B200") Range("B4").Value = Range("B201") 'etc. 

现在,我经常通过插入新行来添加值,所以我可能会在B200和B201之间插入一个新行,这会破坏macros,因为在插入新行时它不会自动更新。

我如何编码macros,以便在插入新的行或列时自动调整单元格引用?

我的build议是确保你想要检索值的ROW具有唯一的值,你可以在任何时候findFININD,然后从find的单元格的行的B列中获取你的值。 所以现在你想在B200中获得价值,A200总是有文字: “最终总计” ,这是独一无二的。

 Dim MyRNG As Range Set MyRNG = Range("A:A").Find("Final Total", LookIn:=xlValues, LookAt:=xlWhole) Range("B3").Value = Range("B" & MyRNG.Row) Range("B4").Value = Range("B" & MyRNG.Row + 1) 

这不是一个答案,而是一个select。

命名你的范围是Shiinbuild议的方式,但是如果你有500个单元格,就像我之前提到的那样,命名500个单元格并在你的代码中使用它们可能是非常痛苦的。 另一种方法是使用智能代码。 我们来举个例子

假设你有这样的代码

 Sub Sample() Range("B3").Value = Range("B200") Range("B4").Value = Range("B201") Range("B5").Value = Range("B201") ' And ' So On ' till Range("B500").Value = Range("B697") End Sub 

编写这段代码的最好方法就是这样

 Sub Sample() Dim i As Long For i = 200 To 697 Range("B" & i - 197).Value = Range("B" & i) Next i End Sub 

并说如果你说在第300行插入一行,然后简单地把上面的代码分成两部分

 Sub Sample() Dim i As Long For i = 200 To 299 Range("B" & i - 197).Value = Range("B" & i) Next i For i = 301 To 698 Range("B" & i - 197).Value = Range("B" & i) Next i End Sub 

所以每次插入一行时,只要将for循环分解为一个额外的部分即可。 这看起来很乏味,但比命名500单元格并在代码中使用它们要好得多。

如果您打算只使用一次macros(即1次使用),请继续阅读

如果您担心用户插入行后单元格不会更新,则您可以不指定值,而是指定一个公式。

例如

 Range("B3").Formula = "=B200" 

这将在B3单元格中input公式=B200 。 所以下次当您插入一行以便第200行移动它的位置时,您会注意到公式在B3单元格中自动更新

HTH

尝试给范围命名。 如果您按名称引用该范围,则Excel会search它并检索定义它的行。 范围名称在添加新行时更新其定义。

除了上面的内容,我认为这个教程说明了我的观点: http : //www.homeandlearn.co.uk/excel2007/excel2007s7p6.html这是如何定义范围的名称。

本教程介绍了如何在macros和vba上使用它: http : //excel.tips.net/T003106_Using_Named_Ranges_in_a_Macro.html

我希望这有助于:D