我有一个用于在三个工作簿之间传输数据的Excel宏。其中两个工作簿保持不变,仅仅是模板。第三个工作簿是业务管理系统的输出。它会改变,但总是以“RFQ_”开头。例如; RFQ_14787,RFQ_14839,RFQ_63528。
下面的代码是为了循环打开工作簿,选择以“RFQ_”开头的代码,并将该名称存储在整个代码中使用的变量中。
在测试此代码时,我发现它只有在首先打开名为“RFQ_XXXXX”的工作簿时才有效。
代码的所有功劳归于@Tim Williams以及他对我的其他问题here的回答。
Sub Tester2()
Dim wbName As String, shtSrc As Worksheet, shtDest As Worksheet
wbName = GetRfqWbName("RFQ_")
If Len(wbName) = 0 Then
MsgBox "Didn't find the RFQ workbook!"
Exit Sub
Else
'for example: you can substitute the sheet names instead
Set shtSrc = Workbooks(wbName).Sheets(1)
Set shtDest = Workbooks("Transfer Template.xlsm").Sheets(1)
End If
shtSrc.Range("J51").Copy shtDest.Range("B1")
End Sub
'get the name of the first workbook which begins with sName...
Function GetRfqWbName(sName As String) As String
Dim wb As Workbook
For Each wb In Workbooks
If wb.Name Like sName & "*" Then GetRfqWbName = wb.Name
Exit For
Next wb
End Function
我只是出于好奇而寻找解释,但如果有人有办法在没有打开“RFQ_”工作簿的情况下运行宏,我会很感激。
答案 0 :(得分:2)
不幸的是,我不能发表评论所以我必须回答这个问题,但我认为这个问题很简单:
For Each wb In Workbooks
If wb.Name Like sName & "*" Then GetRfqWbName = wb.Name
Exit For
Next wb
Exit For
不是if
- 子句的一部分,因此每次检查第一个工作簿后它都会中断循环 - 无论是否成功...
修改:按如下方式更改代码以解决问题
For Each wb In Workbooks
If wb.Name Like sName & "*" Then
GetRfqWbName = wb.Name
Exit For
End If
Next wb