在excel中添加新行而不破坏使用Range.Value的vba宏

时间:2012-05-18 20:40:19

标签: excel vba range

我在VBA中编写了一个宏,它只是从该表中的另一个单元格填充给定单元格的值。我为表格中的大量单元格执行此操作,我这样做:

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

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

如何对宏进行编码,以便在插入新行或列时自动更新单元格引用?

3 个答案:

答案 0 :(得分:3)

我的建议是确保你想要检索值的ROW中有一个唯一的值,你可以随时使用.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)

答案 1 :(得分:1)

尝试为范围指定名称。如果按名称引用范围,Excel将搜索该范围并检索定义它的行。添加新行时,范围名称会更新其定义。

除此之外,我认为本教程说明了我的观点: http://www.homeandlearn.co.uk/excel2007/excel2007s7p6.html这是定义范围名称的方法。

本教程解释了如何在宏和vba上使用它: http://excel.tips.net/T003106_Using_Named_Ranges_in_a_Macro.html

我希望这会有所帮助:D

答案 2 :(得分:1)

这不是答案,而是替代方案。

命名您的范围是Shiin建议的方式,但如果您有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个单元格并在代码中使用它们要好得多。

如果您打算只使用一次宏(即一次使用),请提前预读

如果您担心当用户插入行时,单元格不会更新,那么您可以代替分配值而不是分配公式。

例如

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

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

HTH