Excel宏仅在首先打开某个工作簿时有效

时间:2015-07-30 20:11:29

标签: excel vba excel-vba

我有一个用于在三个工作簿之间传输数据的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_”工作簿的情况下运行宏,我会很感激。

1 个答案:

答案 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