保留工作表宏以链接具有工作表名称更改的单元格

时间:2018-04-24 19:05:21

标签: excel-vba worksheet vba excel

我在名为“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个或更多个链接的单元格时,这个问题变得更加引人注目。

由于

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关联符合:

enter image description here

如果有多个包含链接单元格的工作表,并且删除了任何工作表,则 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