【问题标题】:Excel macro only works when certain workbook is opened firstExcel 宏仅在首先打开某些工作簿时才有效
【发布时间】: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:我很欣赏这个建议,这是个好主意。但是,我希望尽可能使这个过程自动化。
  • 我其实不明白你的问题……你能帮我改一下吗?

标签: vba excel


【解决方案1】:

不幸的是,我不允许发表评论,所以我必须回答这个问题,但据我所知,问题出在:

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

【讨论】:

  • @Wooz - 好眼力。这不是我最初编写该函数的方式。
猜你喜欢
  • 1970-01-01
  • 2012-09-12
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 2014-09-12
相关资源
最近更新 更多