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

有没有一种方法来指定工作簿的工作表,而没有全名? 例如,如果工作簿名称是MyWorbook2015,并且2015年可能会更改为2016年,则需要基于MyWorkbook识别工作簿,而忽略2015.类似于此:

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

在上面的代码示例中,无论date如何,我都需要它来识别工作簿? 这可能吗? 如果是这样,我该怎么做呢?

是的,您可以使用带有通配符“*”的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上进行等同性匹配。 工作簿的默认CodeName是“ThisWorkbook”,但是您可以通过在Project Explorer窗口中select“ThisWorkbook”代码页,然后打开属性窗口(Key:F4)并更改代码页的Name属性来更改。

然后按照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 

请注意,更改CodeName允许您在使用“ThisWorkbook”的地方使用新的CodeName,但仍然可以使用“ThisWorkbook”。