通过代号完全引用工作表

时间:2014-08-08 12:08:01

标签: excel vba

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

我想要防止打开两个不同工作簿的情景和两个具有相同CodeName的工作表。我使用ThisWorkbook因为我想引用代码运行的工作簿。

我想象这样的事情:

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

其中WsSummary是工作表的代号。

5 个答案:

答案 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无需任何额外方法即可正常工作