2017-05-05 20 views
1

早上好!Get.OpenFilename數組+'For Each'或'Do While'?

我一直在學習VBA一週現在...就像從瀑布喝酒一樣。儘管研究我似乎無法把它放在一起。本小節將打開多個選定的工作表,根據需要進行編輯,直到編輯完所有工作表。

我使用GetOpenFilename捕捉多個文件,然後我想已經打開,並通過我的StandaloneReportEdit宏觀運行 - 我不確定爲什麼我不能調用創建陣列,或者我應該研究,以找出答案:

Dim my_FileName As Variant 

my_FileName = Application.GetOpenFilename(_ 
    filefilter:="Excel Files,*.xl*;*.xm*", _ 
    Title:="Select Excel File to Open", _ 
    MultiSelect:=TRUE) 

If my_FileName = False Then End 

Set wb = Workbooks.Open(my_FileName, False, False) 

Call StandaloneReportEdit 'Sub to very thoroughly edit reports 

我會在哪裏使用'For Each'(或者可能是Do While),我無法完全弄清楚要引用什麼......會是這樣的工作嗎?

For Each my_FileName 'Call StandaloneReportEdit here 

或者我應該用「不要當」在下面:

Do While my_FileName = True 

    If my_FileName = False Then End 

Set wb = Workbooks.Open(my_FileName, False, False) 

Call StandaloneReportEdit 

Loop 

這個問題可能不那麼徹底,你都可能會喜歡,和我道歉,我想我的思念並且只是指向正確的方向將不勝感激。非常感謝您的時間!

+0

避免'結束'。使用'Exit Sub'來代替整個執行上下文。目前還不清楚你想用'my_FileName'來迭代什麼,也不清楚你的問題是什麼。請[edit]澄清。 –

+0

如果您正在獲取多個文件名,並且您正在嘗試對它們進行迭代,則可以很容易地將您的帖子改述爲如此。不要道歉,只需修復它! ;-) –

+0

@ Mat'sMug - 我試圖捕獲從上面的.GetOpenFilename中選擇的文件的數組,以便我可以通過調用其中的子來運行所有這些文件。我將進行編輯以澄清,我認爲儘管如此,我完全失去了。 – dduz

回答

1

For Each是最簡單的,但您需要另一個變量來從數組中獲取名稱。 False的測試對於Variant類型的變量(儘管文檔suggests it)不起作用。最好使用IsArray()那個:

Sub doIt() 
    Dim myFileName As Variant 
    Dim myFileNames As Variant 
    Dim wb As Workbook 

    myFileNames = Application.GetOpenFilename(_ 
     filefilter:="Excel Files,*.xl*;*.xm*", _ 
     Title:="Select Excel File to Open", _ 
     MultiSelect:=True) 

    If Not IsArray(myFileNames) Then Exit Sub 

    For Each myFileName In myFileNames 
     Set wb = Workbooks.Open(myFileName, False, False) 
     StandaloneReportEdit() 'Sub to very thoroughly edit reports 
    Next 

End Sub 
+0

哦!我想我看到...我將創建的數組指定爲變量?根據文件的總體選擇,每個文件在數組中都是「可變的」,並且對於每個選定的文件,它將在宏中運行,直到完成並結束爲止。 – dduz

+0

儘管數組*可以用For Each來迭代,並且這顯然不會成爲性能瓶頸(除非'StandaloneReportEdit'完全沒有效率,否則'Workbooks.Open'應該是Big One),迭代一個數組用'For'循環給出(很多)更好的性能;使用For Each來迭代對象集合,使用For來迭代數組。 –

+0

@dduz,你說的有點奇怪,但是,當循環迭代它時,變量'myFileName'接受'myFileNames'數組變量中每個字符串的值。 – trincot