Excel 按代码名完全引用工作表

Excel 按代码名完全引用工作表,excel,vba,Excel,Vba,当我使用CodeName属性引用Excel工作表时,如何完全限定它们(包括工作簿引用) 我想防止出现这样一种情况:打开两个不同的工作簿,两个工作表具有相同的代码名。我使用此工作簿,因为我想引用运行代码的工作簿 我想象这样的情况: Dim tgWs As Worksheet Set tgWs = ThisWorkbook.WsSummary tgWs.Cells(1,1).Value = "Test" 其中,WsSummary是工作表的代码名。当代码在同一工作簿中时,工作表可以通过其代码名引用,

当我使用CodeName属性引用Excel工作表时,如何完全限定它们(包括工作簿引用)

我想防止出现这样一种情况:打开两个不同的工作簿,两个工作表具有相同的代码名。我使用
此工作簿
,因为我想引用运行代码的工作簿

我想象这样的情况:

Dim tgWs As Worksheet
Set tgWs = ThisWorkbook.WsSummary
tgWs.Cells(1,1).Value = "Test"

其中,
WsSummary
是工作表的代码名。

当代码在同一工作簿中时,工作表可以通过其代码名引用,因此不需要完全限定。除非循环每个工作表并检查代码名,否则不能直接按代码名引用其他工作簿工作表

因此,不需要创建变量,这就足够了

with WsSummary
  .Cells(1,1).Value = "Test"
end with

以代码名引用工作表始终意味着
此工作簿中的工作表,即包含您正在执行的代码的工作簿

似乎没有直接的方法可以使用代码名完全限定不同工作簿中的工作表

此功能将帮助您执行以下操作:

Function GetSheetWithCodename(ByVal worksheetCodename As String, Optional wb As Workbook) As Worksheet
    Dim iSheet As Long
    If wb Is Nothing Then Set wb = ThisWorkbook ' mimics the default behaviour
    For iSheet = 1 To wb.Worksheets.Count
        If wb.Worksheets(iSheet).CodeName = worksheetCodename Then
            Set GetSheetWithCodename = wb.Worksheets(iSheet)
            Exit Function
        End If
    Next iSheet
End Function
用法示例:

GetSheetWithCodename("Sheet1", Workbooks("Book2")).Cells(1, 1) = "Sheet1 in Book2"
GetSheetWithCodename("Sheet1", ActiveWorkbook).Cells(1, 1) = "Sheet1 in ActiveWorkbook"
GetSheetWithCodename("Sheet1").Cells(1, 1) = "Sheet1 in ThisWorkbook" 
请注意,最后一行相当于简单地说:

Sheet1.Cells(1, 1) = "Sheet1 in ThisWorkbook" 

因为,如上所述,通过代码名引用工作表总是意味着
此工作簿中的工作表

您可以通过添加第二个工作簿作为引用,并通过VBA项目名称调用工作簿来实现这一点

显然,将VBA项目名称从默认的“VBAProject”更改为“VBA项目”是一个好主意

我通过创建两个新工作簿来测试这一点,每个工作簿有一张工作表,单元格A1中的值为1或2。VBA项目名为“Proj1”和“Proj2”,工作表的代码名保留为“Sheet1”

这是我使用的代码:

Sub test()

    Debug.Print Proj1.Sheet1.Cells(1, 1)
    Debug.Print Proj2.Sheet1.Cells(1, 1)

End Sub
产出:

1
2
Sheet1。单元格(1,1)=“ThisWorkbook中的Sheet1”
不带
ThisWorkbook
前缀,无需任何额外方法即可正常工作

Dim wb as Workbook
Dim ws  as worksheet

Set wb = "Your Workbook full path and name"

For each ws in wb.worksheets
    If ws.codename = "Your Codename" then exit for
    next ws

ws
现在将包含对其他工作簿中工作表的引用,该工作表具有所需的代码名,并且没有用户可更改的依赖项


希望这有帮助

酷,我不知道这是可能的!但是如何从工作簿引用中获取VBA项目呢?是的,它非常酷!不过,您的答案更好,它避免了以编程方式添加引用,而您可能不知道VB项目名称…我在Mac上使用此函数时出错“无法运行宏。该宏可能在此工作簿中不可用,或者所有宏都可能被禁用”