当我使用CodeName属性引用Excel工作表时,如何完全限定它们,包括工作簿引用?
我想要防止打开两个不同工作簿的情景和两个具有相同CodeName的工作表。我使用ThisWorkbook
因为我想引用代码运行的工作簿。
我想象这样的事情:
Dim tgWs As Worksheet
Set tgWs = ThisWorkbook.WsSummary
tgWs.Cells(1,1).Value = "Test"
其中WsSummary
是工作表的代号。
答案 0 :(得分:13)
通过代号表引用工作表始终隐含ThisWorkbook
中的工作表,即包含您正在执行的代码的工作簿。
似乎没有直接的方法可以使用其代号完全限定不同工作簿中的工作表。
此功能可以帮助您完成此操作:
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"
因为,如上所述,通过代号来指代工作表总是意味着ThisWorkbook
中的工作表。
答案 1 :(得分:9)
您可以通过添加第二个工作簿作为参考,并通过VBA项目名称调用工作簿来完成此操作。
显然,从默认的' VBAProject'
中更改 VBA项目名称是一个好主意。我通过创建两个新工作簿来测试它,每个工作簿都有一个工作表,单元格A1中的值为1或2。 VBA项目名为' Proj1'和' Proj2'以及工作表' CodeNames保留为' Sheet1'。
这是我使用的代码:
Sub test()
Debug.Print Proj1.Sheet1.Cells(1, 1)
Debug.Print Proj2.Sheet1.Cells(1, 1)
End Sub
产生输出:
1
2
答案 2 :(得分:2)
当代码在同一工作簿中时,工作表可以通过其代号引用,因此不需要完全符合条件。您不能通过代号直接引用其他工作簿表,除非您循环每个工作表并检查代号
所以这就足够了,无需创建变量
with WsSummary
.Cells(1,1).Value = "Test"
end with
答案 3 :(得分:0)
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
现在将包含对其他工作簿中工作表的引用,并具有所需的代号,而无需用户更改依赖项
希望这会有所帮助
答案 4 :(得分:-1)
Sheet1.Cells(1, 1) = "Sheet1 in ThisWorkbook"
前缀的 ThisWorkBook
无需任何额外方法即可正常工作