2015-05-24 251 views
1

下面的vba打開一個excel工作簿,檢查它是否處於只讀模式,如果它正在等待,直到讀/寫處於活動狀態,然後運行代碼。簡單VBA ACCESS - Loop Excel工作簿

我的問題是,我有很多的Excel文件,例如C:\ TEST \ TEST.xlsb,C:\ TEST \ TEST2.xlsb,C:\ TEST \ TEST3.xlsb,C:\ TEST \ TEST4 .xlsb等

我如何獲得VBA通過每個工作簿名稱

救救我運行代碼的時間複製/粘貼代碼多次爲每個工作簿的名稱。

Function test() 

Dim xl As Object 

Set xl = CreateObject("Excel.Application") 

xl.Workbooks.Open ("C:\TEST\Test.xlsb") 

Do Until xl.ActiveWorkbook.ReadOnly = False 

MsgBox ("Workbook in use, waiting till read/write is active") 
Call Pause(5) 
xl.Quit 
xl.Workbooks.Open ("C:\TEST\Test.xlsb") 
If xl.ActiveWorkbook.ReadOnly = False Then Exit Do 
Loop 


If xl.ActiveWorkbook.ReadOnly = False Then 

MsgBox ("read/write active") 

'Run code 
xl.Sheets("Sheet1").Range("G2").Value = 2222 
xl.ActiveWorkbook.Save 
xl.Quit 

End If 

xl.Quit 
Set xl = Nothing 

End Function 

回答

0

你需要一個循環來瀏覽你的文件併爲每個文件調用函數。 如果您的文件名的模式是這樣的C:\ TEST \ TEST.xlsb,C:\ TEST \ TEST2.xlsb,C:\ TEST \ TEST3.xlsb,C:\ TEST \ TEST4.xlsb 那麼你可以例如實現另一個功能打造的文件名作爲參數,並將其設置爲你的函數「測試」

Function goThroughFiles() 
Dim front as String 
Dim ending as String 
Dim i as Integer 
Dim strPath as String 

front = C:\TEST\TEST 
ending = .xlsb 
i = 1 

// start with filename that has no number in it 
strPath = front & ending 

// check if file exists 
Do Until Len(Dir(strPath)) = 0 
    call test(strPath) 
    i = i+1 
    strPath = front & i & ending 
Loop 

你需要改變你原有功能的放慢參數,所以它接受一個參數:

Function test(strPath as String) 

並用您的輸入變量代替使用該路徑的每一行

xl.Workbooks.Open ("C:\TEST\Test.xlsb") 

成爲

xl.Workbooks.Open (strPath) 
+0

不幸的是 – Elixir

+0

你需要找到的,你可以通過代碼生成命名的模式工作簿名稱不測試,Test2的等等這些都是例子..。或者如果名稱更改,則可以將所有工作簿放在一個文件夾中並循環訪問該文件夾的文件。如果名稱發生更改並且文件夾不同並且沒有任何常量,那麼代碼將不會對您有所幫助,並且您需要手動執行此操作。 – pony2deer

+0

一個文件夾中的所有文件,只有變化的是文件名。非常感謝 – Elixir

相關問題