2017-05-05 23 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