【发布时间】:2015-07-30 20:11:29
【问题描述】:
我有一个 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_”工作簿的情况下运行宏,我将不胜感激。
【问题讨论】:
-
这不起作用的原因是“For Each wb In Workbooks”会查看仅打开工作簿以查看其中哪个名称中有 Rfq。如果 RFQ_ 工作簿总是在同一个地方,您可以专门针对目标,打开文件,然后运行您在此处的代码。
-
如果您不知道工作簿的名称,那么我建议您遍历所有打开的工作簿并让用户选择必须运行宏的工作簿
-
@Grade'Eh'Bacon:所有三个工作簿都已打开,包括名称中带有“RFQ”的工作簿。
-
@SiddharthRout:我很欣赏这个建议,这是个好主意。但是,我希望尽可能使这个过程自动化。
-
我其实不明白你的问题……你能帮我改一下吗?