我在名为“Sheet1”和“Sheet2”的工作表中分别有两个名为 INPUT_A_1 和 INPUT_A_2 的单元格,我正在链接(更改一个单元格会触发相同的更改)在另一个)与下面的表格宏工作得非常好:
在Sheet1中:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If (Target.Address = Range("INPUT_A_1").Address) Then
Sheets("Sheet2").Range("INPUT_A_2") = Target.Value
End If
Application.EnableEvents = True
End Sub
并在Sheet2中:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If (Target.Address = Range("INPUT_A_2").Address) Then
Sheets("Sheet1").Range("INPUT_A_1") = Target.Value
End If
Application.EnableEvents = True
End Sub
我的问题是由于语法Sheets( sheetname )。Range( rangename ),如果我决定重命名其中一个或两个工作表,那么我必须改变相应的宏。是否有某种解决方法,不涉及通过相应的工作表名称召唤单元格?当我在不同的工作表中有3个或更多个链接的单元格时,这个问题变得更加引人注目。
由于
答案 0 :(得分:0)
“解决方法”是使用工作表的codename代替
使用工作表的代码名称
访问工作表的最佳方法是使用代码名称。 每个工作表都有一个工作表名称和一个代码名称。工作表名称是 显示在Excel中的工作表选项卡中的名称。
更改工作表名称不会更改代码名称 通过代码名称引用工作表是一个好主意。
答案 1 :(得分:0)
根据Storax上面提出的出色建议,以下是我实施的修复方法:
在第一个工作表中(可以随意重命名):
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If (Target.Address = Range("INPUT_A_1").Address) Then
SheetFromCodeName("Sheet2").Range("INPUT_A_2") = Target.Value
End If
Application.EnableEvents = True
End Sub
和第二个工作表(也可以随意重命名):
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If (Target.Address = Range("INPUT_A_2").Address) Then
SheetFromCodeName("Sheet1").Range("INPUT_A_1") = Target.Value
End If
Application.EnableEvents = True
End Sub
最后,在任何模块中:
Public Function SheetFromCodeName(CodeName$) As Worksheet
Dim sh As Worksheet
For Each sh In ThisWorkbook.Sheets
If sh.CodeName = CodeName Then
Set SheetFromCodeName = sh
Exit For
End If
Next sh
End Function
SheetName和CodeName关联符合:
如果有多个包含链接单元格的工作表,并且删除了任何工作表,则 On Error Resume Next 应该可以正常工作。
答案 2 :(得分:0)
事实上,可以使用Sheet Index,从而完全不需要 SheetFromCodeName 例程。
本例中第一张和第二张中的语法是
Worksheets(2).Range("INPUT_A_2") = Target.Value
和
Worksheets(1).Range("INPUT_A_1") = Target.Value