【问题标题】:Nested macros not looping嵌套宏不循环
【发布时间】:2017-03-16 17:04:42
【问题描述】:

我有一个项目不断发展壮大。我在最后一点,它没有循环。我不明白为什么。我在它们自己的宏中拥有这些元素,并且它们完美无缺,直到我尝试将它们组合成一个运行它们的超级宏。这个想法是“主”工作簿 (XLSM) 将运行自己的更新,然后打开同一文件夹中的所有其他 XLSM 文件并运行他们的更新,将数据推送到其他 XLSX 文件。现在每个 XLSM 文件都运行一个可以完美运行的宏 子 EndofDay () 调用步骤 1 调用第 2 步 结束子 我对 SuperMacro 使用了相同的“Do while”结构,它打开了其他书籍并称它们为“EndofDay”。它通过了几个 XLSM 文件,然后在 MyFiles = Dir 上出现错误而停止。以下语法应该运行主更新和一个其他代码字符串,然后打开文件夹中的所有其他 XLSM 文件。为什么在this下的level下它突然在这个level下不行了。

Sub SuperMacroEOD_Trans()

    Dim MyFiles As String
        Call EndofDayTransfer 'Do this Workbook Transfer first then:
'Step 2: Specify a target folder/directory.
    MyFiles = Dir("C:\Users\ME\Desktop\QA VBA Project\*.xlsm")

'Dont try to open this workbook and do anything.
    Do While MyFiles <> "" And MyFiles <> "C:\Users\ME\Desktop\QA VBA Project\Update_Master.xlsm"
'Step 3: Open Workbooks one by one
    Workbooks.Open "C:\Users\ME\Desktop\QA VBA Project\" & MyFiles

    Call EndofDayTransfer 'Call same macro you ran and run in the other workbooks (they contain it).

    ActiveWorkbook.Close SaveChanges:=True

'Step 4: Next File in the folder/Directory
      Loop
    MyFiles = Dir <------------Gets stuck here or editor turns it yellow.


End Sub

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    您的代码中有一些逻辑错误。

    1- 在这里,您告诉代码在到达主文件时停止,但您真正想要的是跳过 主文件。你也在比较一个简单的文件名和一个完整的路径名

    Do While MyFiles &lt;&gt; "" And MyFiles &lt;&gt; "C:\Users\ME\Desktop\QA VBA Project\Update_Master.xlsm"

    2- 这应该放在循环内,即之前Loop

    MyFiles = Dir &lt;------------Gets stuck here or editor turns it yellow.

    3- 您正在使用ActiveWorkbook,这非常危险。你应该使用 explicit 引用。此外,由于所有工作簿都有“EndofDayTransfer”过程,包括主 WB,因此必须明确指定“范围”以便运行适当的过程(参见下面代码中的Application.Run

    Sub SuperMacroEOD_Trans()
        Dim MyFiles As String, wb As Workbook
        Call EndofDayTransfer ' Master Workbook Transfer first
    
        MyFiles = Dir("C:\Users\ME\Desktop\QA VBA Project\*.xlsm")
        Do While MyFiles <> ""
            If MyFiles <> ThisWorkbook.Name Then ' skip the master
                ' Always get an explicit reference to any file you open and use it 
                Set wb = Workbooks.Open("C:\Users\ME\Desktop\QA VBA Project\" & MyFiles)
                Application.Run "'" & wb.name & "'!EndofDayTransfer" ' <-- specify scope explicitly to disambiguate
                wb.Close SaveChanges:=True
            End If
    
            MyFiles = Dir ' <-- inside the loop
        Loop
    End Sub
    

    【讨论】:

    • “MyFiles”下的移动循环会产生编译错误并且不会运行任何东西。
    • 其他地方一定有错误。请再次检查文件名和路径。
    • 您是否按原样测试了我的代码?您是否将“ME”替换为您的实际主文件夹?
    • 上面的编辑版本运行良好。测试了几次。呸!这个测试是让你 XLSM 更新到 5 XLSX。现在让它成为现实...... 7 XLSM 更新到 12 个 XLSX 文件......明天。
    • 完整测试正在共享驱动器上运行。 7 个 xlsm 工作簿查找并打开 12 个 XLSX 工作簿,并根据选项卡名称向它们推送数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 2023-03-22
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多