VBA 通过部分名称识别工作簿

VBA recognizing workbook by partial name

有没有办法在没有全名的情况下为 sheet 指定工作簿? 比如工作簿名称是MyWorbook2015,以后2015可能会变成2016,我需要根据MyWorkbook识别工作簿,忽略2015。类似这样:

With Workbooks("MyWorkbook2015").Sheets("My_Sheet_Name_That_Does_Not_Change")
     'do something
End With

在上面的代码示例中,我需要它来识别工作簿而不考虑日期?这可能吗?如果是,我该怎么做?

是的,您可以使用带有通配符“*”的 LIKE 运算符。这是一个例子。我假设工作簿是打开的。

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

编辑

这是一种可以将其用作函数的方法

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

在 Workbook.Name 上进行部分匹配的一种稍微更可靠的替代方法是在 WorkBook.CodeName 上进行等价匹配。工作簿的默认代码名称是 "ThisWorkbook",但您可以通过在项目资源管理器 window 中选择 "ThisWorkbook" 代码页来更改它,然后打开属性 Window(关键: F4) 并更改代码页的名称 属性。

然后按照 Siddharth 展示的示例,然后重新定义 "GetWB" 函数,如下所示:

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

请注意,更改代码名称后,您可以在本应使用 "ThisWorkbook" 的地方使用新代码名称,但您仍然可以使用 "ThisWorkbook"。