2

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

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

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

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

4

3 回答 3

5

我的建议是确保您要从中检索值的 ROW 中具有唯一值,您可以随时 .FIND 查找,然后从找到的单元格行的 B 列中获取您的值。所以现在你想在 B200 中获得一个值,而 A200 中总是有文本:“Final Total”,这是独一无二的。

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)
于 2012-05-19T00:41:41.133 回答
1

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

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

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

我希望这会有所帮助:D

于 2012-05-18T20:45:36.190 回答
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 个单元格并在代码中使用它们要好得多。

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

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

例如

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

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

高温高压

于 2012-05-18T22:40:09.617 回答