2

Access 2010、WinXP を使用しています。フォルダーのコレクションを反復処理し、各フォルダー内の各 Excel ファイルから値を収集して、データベースのテーブルに追加しようとしています。問題は、ワークブックを毎回閉じている場合でも、十分な速度で閉じる必要がないことです。同じファイル名が 2 つの連続するフォルダーに表示されると、次のエラー メッセージが表示されるためです。

Run-time error '1004':
A document with the name 'someWorkbook.xls' is already open.

これが私のコードです:

sub traverse()

Dim fso As filesystemobject
Dim fObj As File
Dim fldObj As Folder
Dim fCol As Files
Dim xlApp As Excel.Application
dim xlBk as Excel.Workbook

Set xlApp = New Excel.Application
Set fso = New filesystemobject
For Each fldObj In fso.GetFolder("c:\basePath").SubFolders
    Set fCol = fldObj.Files
    For Each fObj In fCol
        If UCase(Left(fso.GetExtensionName(fObj.Name), 3)) = "XLS" Then
           Set xlBk=xlApp.workbooks.open(fObj.path)
           getData(xlBk)
           xlBk.close false
           DoEvents
        End If
    Next
Next

End Sub

For Each fObj次のように、Excel インスタンスを終了し、ループ内で新しいインスタンスを開始しようとしました。

set xlApp=new Excel.Application
Set xlBk=xlApp.workbooks.open(fObj.path)
getData(xlBk)
xlBk.close false
DoEvents
xlApp.quit
DoEvents

しかし、クラッシュしたときにタスクマネージャーを確認したところ、約30個のExcelインスタンスが見つかったため、Excelインスタンスを終了せずに大量に開いただけでした。

.CloseExcel アクションがトリガーされるか完了するまで、コードが続行されないことを保証するために他にできることはあります.Quitか?

4

2 に答える 2

1

@sigilコメントで彼自身の質問に答えました。

問題を見つけました。投稿しなかったコードが原因でした。workbooks.openおよびworkbook.closeの呼び出しは、実際にはgetData内で発生します。ここには、ワークブックを閉じずにgetDataを終了するif-then句があります。終了関数の前にworkbook.closeを追加しましたが、正常に動作しています。コードをそのまま投稿しなくてすみませんが、簡略化した方が助けになりやすいと思いました。次回はもっとよくわかります。

于 2012-07-27T04:22:36.353 に答える