假设在 A1 中我有“=ROW()”。单元格显示“1”,因为它是工作表中的第一行。
现在在 A2 中,我输入了“=A1”。不幸的是,这引用的是 A1 的值,而不是公式。如果它引用了公式,那么 A2 会给出“2”的值(这正是我想要的)。
如果我随后继续更改 A1 中的公式,那么 A2 的值也会改变,因为它依赖于 A1 中的公式。
我该怎么办?
答案1
Excel 工作表函数无法原生实现此操作。如果您需要此功能,则必须使用 VBA。
您可以使用 Worksheet_Change() 事件。当单元格内容发生变化时,该事件将触发,但简单的重新计算不会触发。它有一个参数,指示已更改的单元格;您可以使用它来查看是否需要执行任何操作。此代码需要放在您正在使用的工作表的代码区域中。(使用 Alt+F11 打开 VBA;在左侧面板中,双击工作表。您应该看到类似“Microsoft Visual Basic -文件名-[工作表名称(代码)]”。)
显然,根据以下代码的要求更新工作表名称和范围。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim test As Range, src As Range, dest As Range
Set src = Worksheets("Sheet1").Range("A1")
Set dest = Worksheets("Sheet1").Range("A2")
Set test = Intersect(Target, src)
If Not (test Is Nothing) Then
dest.Formula = src.Formula
End If
End Sub
上述代码将准确复制公式 - 如果您在单元格 A1 中引用单元格 F3,则在单元格 A2 中也会引用单元格 F3。如果您不希望发生这种情况,请将 If 语句中的行更改为dest.FormulaR1C1 = src.FormulaR1C1
。这将适当地更改公式中的任何相对引用。
dest
如果您想根据单元格 A1 中的公式一次设置一堆单元格,您可以更改为更大的范围。
需要注意的是,如果您更改了单元格,这不会自动恢复单元格中的公式 - 即,如果您更改了 A2 中的公式,这不会自动将其恢复,因为我们仅在单元格 A1 更改时进行更新。如果您想防止这种情况发生,请更改行
Set test = Intersect(Target, src)
到
Set test = Intersect(Target, Union(src, dest))