簡體   English   中英

使用 Excel VBA Dir() 函數循環並打開文件目錄提前退出

[英]Looping through and opening a directory of files with Excel VBA Dir() function quitting early

在這里發布以防萬一有人遇到類似的問題。 不是真的在尋找答案,只是發布以防有人需要解決類似問題。 如果有人對正在發生的事情或進一步緩解問題的方法有一些經驗,我會勾選他們的答案。

我需要遍歷一個 .csv 文件目錄,從每個文件中檢索一條信息,然后編譯成一個新的 .xlsx 文件。 我的解決方案基於此線程:

遍歷文件夾中文件的VBA代碼

我遇到的問題是 Dir() 函數在循環遍歷所有文件之前很好地保釋(我有 500 個文件......它在隨機位置停止,有時在第 18 個,有時在第 90 個,有時在第 97 個)。 我花了一段時間才弄清楚發生了什么。 顯然,當這個函數正在執行時,我正在做的其他事情(我假設它是我正在編寫的 Word 文檔)正在告訴宏停止並且沒有錯誤代碼。 它只是退出循環(我正在使用 while -> wend 循環),留下函數訪問的最后一個文檔打開而不執行 close 語句。 我通過關閉所有內容並在沒有打開任何其他內容的情況下運行宏來確認這一點,並完成了執行。

因此,如果在檢查目錄中的每個文件之前 Dir() 函數停止執行時遇到問題,請關閉其他微軟應用程序。 他們可能會干擾。

為避免Dir錯誤,請先收集文件,然后再處理它們。 不要在調用Dir之間做任何與辦公室相關的事情。

Option Explicit

' Get the files specified
Function GetFiles(MyFolder As String) As Variant
    Dim MyFile As Variant, Files As Variant
    Dim NumFiles As Long, Idx As Long
    
    ' Collect files only and ignore folders
    MyFile = Dir(MyFolder)
    NumFiles = 0
    Do While MyFile <> ""
        NumFiles = NumFiles + 1
        If NumFiles = 1 Then
            ReDim Files(1 To 1)
        Else
            ReDim Preserve Files(1 To NumFiles)
        End If
        Files(NumFiles) = MyFile
        MyFile = Dir()
    Loop
    GetFiles = Files
End Function

Sub ProcessFiles(MyFolder As String)
    Dim MyFile As Variant
    Dim Files As Variant
    Dim Idx As Long
    
    Files = GetFiles(MyFolder)
    If Not IsEmpty(Files) Then
        For Idx = LBound(Files) To UBound(Files)
            MyFile = Files(Idx)
            ' Process the file here
            Debug.Print MyFile
        Next Idx
    Else
        Debug.Print "No files found for Dir(""" & MyFolder & """)"
    End If
End Sub

Sub TestProcessFiles()
    ProcessFiles "C:\windows\*.*"
End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM