VBA recognizing workbook by partial name

后端 未结 2 660
悲哀的现实
悲哀的现实 2021-01-03 10:10

Is there a way to specify a workbook for a sheet without having the full name? For example, If the workbook name is MyWorbook2015 and the 2015 may change to 2016 in the futu

相关标签:
2条回答
  • 2021-01-03 10:58

    Yes you can use the LIKE Operator with a wildcard "*". Here is an example. I am assuming that the workbook is open.

    Sub Sample()
        Dim wb As Workbook
        Dim wbName As String
    
        '~~> "MyWorkbook2015"
        wbName = "MyWorkbook"
    
        For Each wb In Application.Workbooks
            If wb.Name Like wbName & "*" Then
                Debug.Print wb.Name
    
                With wb.Sheets("My_Sheet_Name_That_Does_Not_Change")
                    '~~> Do something
                End With
            End If
        Next wb
    End Sub
    

    EDIT

    Here is a way where you can use it as a function

    Dim wbName As String
    
    Sub Sample()
        '~~> "MyWorkbook2015"
        wbName = "MyWorkbook"
    
        If Not GetWB Is Nothing Then
            Debug.Print GetWB.Name
            With GetWB.Sheets("My_Sheet_Name_That_Does_Not_Change")
                '~~> Do something
            End With
        Else
            MsgBox "No workbook with that name found"
        End If
    End Sub
    
    Function GetWB() As Workbook
        Dim wb As Workbook
    
        For Each wb In Application.Workbooks
            If wb.Name Like wbName & "*" Then
                Set GetWB = wb
                Exit Function
            End If
        Next wb
    End Function
    
    0 讨论(0)
  • 2021-01-03 10:59

    A slightly more reliable alternative to doing a partial match on Workbook.Name is to do an equivalency match on WorkBook.CodeName. The default CodeName for a Workbook is "ThisWorkbook", but you can change that by selecting the "ThisWorkbook" code page in the Project Explorer window and then open the Properties Window (Key: F4) and change the Name property for the code page.

    Then following the example that Siddharth has shown but redefining then "GetWB" function like this:

    Function GetWB() As Excel.Workbook
        Const wbCodeName As String = "MySecretWorkbookName"   ' change to the CodeName you choose
    
        Dim wb As Workbook
        For Each wb In Application.Workbooks
            If wb.CodeName = wbCodeName Then
                Set FindWorkbook = wb
                Exit For
            End If
        Next wb
    End Function
    

    Note that changing the CodeName allows you to use the new CodeName in places where you would have used "ThisWorkbook", but you can still use "ThisWorkbook" as well.

    0 讨论(0)
提交回复
热议问题