2012-05-05 185 views
2

使用Access 2010,WinXP。我試圖遍歷一組文件夾,從每個文件夾中的每個Excel文件中收集值以添加到我的數據庫中的表中。問題是,即使我每一次關閉工作簿,它不能被關閉速度不夠快,因爲如果相同的文件名出現在連續的兩個文件夾中,我得到一個錯誤信息:如何等待Workbook.Close完成?

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 

我試圖退出Excel實例,並開始在For Each fObj循環一個新的,如下:

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

,但只有結束了開幕一大堆Excel實例沒有退出,就像它崩潰時一樣,我檢查了任務管理器,發現大約30個Excel實例。

是否還有別的方法可以保證我的代碼不會繼續執行,直到由.Close.Quit觸發的Excel操作完成?

+2

我發現了這個問題。這是由於我沒有發佈一段代碼;對'workbooks.open'和'workbook.close'的調用實際發生在'getData'內部,其中有一個if-then子句在不關閉工作簿的情況下退出'getData'。我在'exit function'之前添加了一個'workbook.close',它現在運行正常。對不起,我沒有發佈代碼,我認爲如果我簡化它會更容易得到幫助。下次我會更好地瞭解。 – sigil

+0

Sigil需要發佈他們的答案並將其標記爲已接受。看起來他們仍然是一個活躍的成員。 – JackOrangeLantern

回答

1

@sigil在評論中回答了他自己的問題。

我發現了這個問題。這是由於我沒有發佈一段代碼;對workbooks.open和workbook.close的調用實際上發生在getData內部,其中有一個if-then子句在不關閉工作簿的情況下退出getData。我在退出函數之前添加了一個workbook.close,現在它正常運行。對不起,我沒有發佈代碼,我認爲如果我簡化它會更容易得到幫助。下次我會更好地瞭解。