【问题标题】:Open, run embedded macro, save, close, repeat for folder of .xslm files打开、运行嵌入的宏、保存、关闭、重复 .xslm 文件的文件夹
【发布时间】:2014-10-09 23:23:51
【问题描述】:

我正在尝试运行嵌入在 100 个文件中的每个文件中的宏,而无需手动打开、运行、保存和关闭它们。宏仅在我想运行的“目标”文件中。

我找到了这个SO question,了解如何做到这一点并让它在本地工作。

Sub ProcessFiles()
    Dim Filename, Pathname As String
    Dim wb As Workbook

    Pathname = ThisWorkbook.Path
    Wildcard = "Target*.xlsm"
    Filename = Dir(Pathname & "\" & Wildcard)
    Do While Filename <> ""
        Set wb = Workbooks.Open(Pathname & "\" & Filename)
        DoWork wb
        wb.Close SaveChanges:=True
        Filename = Dir()
    Loop
End Sub

Sub DoWork(wb As Workbook)
    With wb
        'Do your work here
        .Worksheets(1).Range("A1").Value = "Goodbye World!"
    End With
End Sub

我将这个 VBA 脚本放在“Controller.xlsm”中,然后我可以在名称为“Target1.xlsm”、“Target2.xlsm”等目标文件的文件夹上运行DoWork() 宏。但我想用仅在每个目标中的宏替换DoWork()(所有相同的宏,它调用这台机器上的软件)。我尝试将DoWork() 替换为OtherMacroFilename!OtherMacro 之类的东西,但都不起作用(其中OtherMacro 是每个“Target*.xlsm”文件中的相同宏)。

这可能吗?我可以在循环使用“Controller.xlsm”中的宏的同时运行“Target*.xlsm”中的宏吗?

似乎还可以选择在“Target*.xlsm”中运行宏,而其他宏则处于打开状态。如果“Target*.xlsm”文件中的宏需要运行 2 小时,这会导致问题吗?也就是说,“Controller.xlsm”中的macr会在工作完成之前尝试保存并关闭“Target*.xlsm”吗?谢谢!

【问题讨论】:

  • 从工作表外部调用工作表特定宏:stackoverflow.com/a/2303436/212869 将其与循环一起使用应该可以工作
  • @NickSlash - 谢谢。我应该想到的。我现在出门了,但今天下午我会试试你的解决方案。谢谢!

标签: excel vba


【解决方案1】:

我认为您不需要指定宏所在的模块。这应该可以:

Application.Run "'" & wb.name & "'!DoStuff"

请注意,工作簿名称必须用单引号括起来。而且我认为目标工作簿中的宏必须是 Public。

【讨论】:

  • 谢谢,我已经出门了,不过我今天下午试试。
  • 如果宏是公开的,它可能会有所帮助,但我可以让它与 Application.AutomationSecurity = msoAutomationSecurityLow 一起工作。谢谢。
【解决方案2】:

我对作为评论添加的链接进行了尝试,它可以工作,但确实需要您更改安全权限。如果您知道宏的名称及其位置(模块名称),您应该可以使用Application.Run

我尝试不指定模块名称,但它一直给我一个错误。

Sub ProcessFiles()
    Dim Filename, Pathname As String
    Dim wb As Workbook

    Pathname = ThisWorkbook.Path
    Wildcard = "Target*.xlsm"
    Filename = Dir(Pathname & "\" & Wildcard)
    Do While Filename <> ""
        Set wb = Workbooks.Open(Pathname & "\" & Filename)
        Application.Run wb.name & "!Module1.DoStuff"
        wb.Close SaveChanges:=True
        Filename = Dir()
    Loop
End Sub

我确定Application.Run 的工作方式与任何其他 VBA 子程序一样,并且它会在执行下一个命令之前等待它完成,但由于似乎没有办法返回一个值,它可能不是吗? (您正在同一个 excel 实例中打开一个新工作簿,所以我认为应该没问题)

只需重新阅读您的问题,我认为您也有同样的问题,如果可以修改您的宏,您可以删除循环并改用队列。让宏要么返回一个值以指示其完成,要么使用上面的代码调用主表中的子表来执行下一项。

【讨论】:

  • 谢谢,我已经出门了,但我今天下午试试。我希望它可以在没有太多修改的情况下工作——我才刚刚开始。 :)
  • 我无法让它与模块名称一起使用(但我才刚刚开始,还不了解模块和子之间的关系)。我用Application.AutomationSecurity = msoAutomationSecurityLow 修复了权限问题。这样做之后,土豚的方法效果很好。
猜你喜欢
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多