我在 VBA 中编写了一个宏,它只是从该工作表的另一个单元格中填充给定单元格的值。我对工作表中的许多单元格执行此操作,并且这样做是这样的:
Range("B3").Value = Range("B200")
Range("B4").Value = Range("B201")
'etc.
现在,我经常通过插入新行来添加值,所以我可能会在 B200 和 B201 之间插入一个新行,这会破坏宏,因为当我插入新行时它不会自动更新。
如何对宏进行编码,以便在插入新行或列时自动更新单元格引用?
我的建议是确保您要从中检索值的 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)
尝试为范围命名。如果您按名称引用范围,Excel 将搜索它并检索定义它的行。添加新行时,范围名称会更新其定义。
除了以上内容,我认为本教程说明了我的观点: http: //www.homeandlearn.co.uk/excel2007/excel2007s7p6.html这是如何定义范围的名称。
本教程解释了如何在宏和 vba 上使用它:http: //excel.tips.net/T003106_Using_Named_Ranges_in_a_Macro.html
我希望这会有所帮助:D
这不是一个答案,而是一个替代方案。
正如 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
高温高压