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

Posted

技术标签:

【中文标题】保留工作表宏以链接具有工作表名称更改的单元格【英文标题】:Preserve Sheet Macro to Link Cells with Sheet Name Change 【发布时间】:2018-04-24 19:05:21 【问题描述】:

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

谢谢

【问题讨论】:

【参考方案1】:

“解决方法”是改用工作表的codename

使用工作表的代码名称

访问工作表的最佳方法是使用代码名称。 每个工作表都有一个工作表名称和一个代码名称。工作表名称是 Excel 工作表选项卡中显示的名称。

更改工作表名称不会更改代码名称,这意味着 通过代号引用工作表是个好主意。

【讨论】:

太棒了!谢谢。像魅力一样工作!我从未更改过 CodeName,也不打算更改,所以这是理想的。如果我出于任何原因删除了一张工作表,那么接下来应该可以使用简单的错误恢复。【参考方案2】:

按照上面 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 应该可以工作。

【讨论】:

【参考方案3】:

事实上,可以使用工作表索引,从而完全不需要 SheetFromCodeName 例程。

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

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

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

【讨论】:

以上是关于保留工作表宏以链接具有工作表名称更改的单元格的主要内容,如果未能解决你的问题,请参考以下文章

XSLT可通过工作表单击的单元格单元格

excel或者vba,怎样将工作簿内所有橙色单元格公式转换为数值?

当单元格被公式更改时,VBA 代码不运行

单元格(范围内)更改后创建新工作表

超链接到具有相同名称/值的单元格范围 - Google 表格

如何快速搜索出excel工作表中哪些单元格链接到其他数据源?