Excel VBA 迭代文件 - 陷入循环

标签 excel vba

我正在尝试执行以下操作:

  1. 指定一个文件夹(包含 *.xlsm 文件)
  2. 遍历所有文件
  3. 打开每个文件,运行宏,关闭并保存文件
  4. 移至下一个文件,直到完成所有操作。

下面的代码可以工作,但是循环永远不会结束...就好像每次我保存刚刚处理过的文件时,它都会在要浏览的文件列表中显示为一个新项目。

我做错了什么?

谢谢。

Sub runMe()

    Dim objFSO As Object
        Dim objFolder As Object
        Dim objFile As Object
        Dim MyPath As String
        Dim wb As Workbook
        Dim myDir As String

    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
        .EnableEvents = False
    End With

    myDir = "\templates"
    Debug.Print ActiveWorkbook.Path
    MyPath = ActiveWorkbook.Path & myDir

    Set objFSO = CreateObject("Scripting.FileSystemObject")

    'Get the folder object associated with the directory
    Set objFolder = objFSO.GetFolder(MyPath)

    'Loop through the Files 

    For Each objFile In objFolder.Files
        If InStr(objFile.Name, "~") = 0 And InStr(objFile.Name, ".xlsm") <> 0 Then
            Set wb = Workbooks.Open(objFile, 3)
            Application.Run "'" & wb.Name & "'!doMacro"
            wb.Close SaveChanges:=True
           ' Gets stuck in this loop
           ' WHY DOES IT KEEP LOOPING?
        End If
    Next

    With Application
        .ScreenUpdating = True
        .DisplayAlerts = True
        .EnableEvents = True
    End With

End Sub

最佳答案

Sub runMe()
    Dim FSO As New Scripting.FileSystemObject
    Dim File As Scripting.File
    Dim path As String

    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
        .EnableEvents = False
    End With

    path = ActiveWorkbook.Path & "\templates"

    For Each File In FSO.GetFolder(path).Files
        If InStr(File.Name, "~") = 0 _
           And LCase(FSO.GetExtensionName(File.Name)) = "xlsm" _
        Then
            With Workbooks.Open(File.Path, 3)
                Application.Run "'" & .Name & "'!doMacro"
                .Close SaveChanges:=True
            En With
        End If
    Next

    With Application
        .ScreenUpdating = True
        .DisplayAlerts = True
        .EnableEvents = True
    End With
End Sub

根据定义,您的 For Each 循环不能永远运行,错误一定是在其他地方,大概是在 doMacro 所做的任何事情中。

主观笔记:

  • 在您的 VBA 项目中包含对 scrrun.dll 的引用。这对于早期绑定(bind) (New Scripting.FileSystemObject) 很有用,并且可以为您提供这些对象的代码完成。
  • GetExtensionName() 对于获取文件扩展名很有用。
  • 放弃匈牙利表示法,无论如何,您都不会一致地使用它。
  • For Each 不需要辅助变量。
  • 您可以使用 With block 来替换其他辅助变量 (wb)。

关于Excel VBA 迭代文件 - 陷入循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18079481/

相关文章:

mysql - 在 vba 中从 QUery 填充数组,然后将数据插入表中

excel - 如何从 Excel 生成一封电子邮件,其中考虑到选择了多少行

VBA 编译错误 : Procedure too long

excel - DoCmd.TransferSpreadsheet 无法识别工作表名称

vba - 带有用户数据选择的excel图表

excel - 有没有更聪明的方法来解决几个列

VBA 计数错误 1004

vba - CreateObject ("Excel.Application") .Workbooks.Open 和 Workbooks.Open 之间的区别

javascript - 如何导出具有超过 20000 个数组的 json 文件(数据)以使用 angular js 进行 excel?

vba - Excel VBA 用户定义类型未定义-