首页 文章

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

提问于
浏览
0

我分别在名为"Sheet1"和"Sheet2"的工作表中有两个名为 INPUT_A_1INPUT_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

    "workaround"将使用工作表的codename代替

    使用工作表的代码名称访问工作表的最佳方法是使用代码名称 . 每个工作表都有一个工作表名称和一个代码名称 . 工作表名称是Excel中工作表选项卡中显示的名称 . 更改工作表名称不会更改代码名称,这意味着通过代码名称引用工作表是个好主意 .

  • 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 应该有效 .

  • 0

    实际上,可以使用Sheet Index代替,从而完全不需要 SheetFromCodeName 例程 .

    在这种情况下,第一张和第二张中的语法将是

    Worksheets(2).Range("INPUT_A_2") = Target.Value
    

    Worksheets(1).Range("INPUT_A_1") = Target.Value
    

相关问题