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"。
有没有办法在没有全名的情况下为 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"。