【问题标题】:Fully reference a worksheet by codename按代号完全引用工作表
【发布时间】:2019-05-11 18:47:04
【问题描述】:

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

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

我想像这样:

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

其中WsSummary 是工作表的代号。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    通过代号引用工作表始终意味着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 中的工作表。

    【讨论】:

    • 在我的 Mac 上使用此功能时出现错误“无法运行宏。此工作簿中可能没有该宏,或者所有宏都可能被禁用”
    【解决方案2】:

    您可以通过添加第二个工作簿作为参考并通过 VBA 项目名称调用工作簿来完成此操作。

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

    我通过创建两个新工作簿来测试这一点,每个工作簿都有一个工作表,单元格 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
    

    【讨论】:

    • 酷,我不知道这是可能的!但是如何从工作簿参考中获取 VBA 项目呢?
    • 是的,很酷!不过,您的答案更好,它避免了以编程方式添加引用,您可能不知道 VB 项目名称...
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      Sheet1.Cells(1, 1) = "Sheet1 in ThisWorkbook" 没有 ThisWorkBook 前缀可以正常工作,无需任何额外方法

      【讨论】:

        【解决方案5】:
        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 现在将包含对其他工作簿中具有所需代号的工作表的引用,而没有用户可更改的依赖项

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-06
          相关资源
          最近更新 更多