Excel VBA,使用FileDialog打开多个工作簿并引用它们

我正在使用下面的代码来提示用户的工作簿,打开它,从它获得一些信息,然后closures它。 目前,我使用带有索引的工作簿集合(“woorkbooks(2)”)来处理打开的工作簿。 现在我需要打开两个工作簿,而我的问题是,我不知道哪些工作簿将被索引为2,哪些索引为3.所以,我认为必须有一种方法来获得对每个工作簿。

Function openfile() As Boolean Dim fd As FileDialog Dim file_was_chosen As Boolean Set fd = Application.FileDialog(msoFileDialogOpen) With fd .Filters.Clear .Filters.Add "Excel File", "*.xl*" End With file_was_chosen = fd.Show If Not file_was_chosen Then MsgBox "You didn't select a file" openfile = False Exit Function End If fd.Execute openfile = True End Function 

现在我已经看到了解决这个问题的一些解决scheme,包括获取每个工作簿的完整path,但是我宁愿避免使用完整path,因为它包含不同语言的单词(并且工作簿的名称带有问号)。 此外,我更喜欢一个解决scheme,其中用户只提交一次2个文件,而不是两次。

这个版本给用户一个单一的对话框。 请享用。 而谁低估了我的其他答案,请添加一个评论,解释你不喜欢它,它需要一个downvote。

 Function openfile() As Variant Dim aOpen(2) As String, itm As Variant, cnt As Long, lAsk As Long Dim fd As FileDialog Dim file_was_chosen As Boolean Set fd = Application.FileDialog(msoFileDialogOpen) With fd .Filters.Clear .Filters.Add "Excel File", "*.xl*" End With Do file_was_chosen = fd.Show If Not file_was_chosen Or fd.SelectedItems.Count > 2 Then lAsk = MsgBox("You didn't select one or two files, try again?", vbQuestion + vbYesNo, "File count mismatch") If lAsk = vbNo Then openfile = aOpen Exit Function End If End If Loop While fd.SelectedItems.Count < 1 Or fd.SelectedItems.Count > 2 cnt = 0 For Each itm In fd.SelectedItems aOpen(cnt) = itm cnt = cnt + 1 Next openfile = aOpen fd.Execute End Function Sub test() Dim vRslt As Variant Dim wkb As Excel.Workbook, wkb1 As Excel.Workbook, wkb2 As Excel.Workbook vRslt = openfile For Each wkb In Application.Workbooks If wkb.Path & "\" & wkb.Name = vRslt(0) Then Set wkb1 = wkb If wkb.Path & "\" & wkb.Name = vRslt(1) Then Set wkb2 = wkb Next If vRslt(0) = "" Then ' no files MsgBox "No files opened so nothing happens..." ElseIf vRslt(1) = "" Then ' one file was opened MsgBox "One file so do whatever you want for one file" Else ' two files were opened MsgBox "Two files so do whatever you want for two files" End If End Sub 

使用您现有的openfile函数,将布尔返回值更改为Excel.Workbook。 如果他们没有打开工作簿,则将其设置为Nothing而不是false,否则将其设置为刚刚打开的文件的工作簿引用(您将需要修改openfile以获取该引用)。 然后您只需调用它两次,并为每个不是Nothing的调用设置工作簿引用。

下面的示例代码是自由forms的,没有经过testing – 它确实只是美化的伪代码 – 但应该指出正确的大方向。

 sub test dim lAsk as long dim wkb1 as excel.workbook dim wkb2 as excel.workbook do if wkb1 is Nothing then set wkb1 = openfile if wkb1 is Nothing then lAsk = msgbox("you didn't select a first file, try again?",vbyesno,"No file selected") if lAsk = vbNo then exit do end if elseif wkb2 is Nothing then set wkb2 = openfile if wkb2 is Nothing then lAsk = msgbox("you didn't select a second file, try again?",vbyesno,"No file selected") if lAsk = vbNo then exit do end if end if loop while wkb1 is Nothing or wkb2 is Nothing ' do whatever with wkb1 and wkb2 here end sub 

编辑添加:

这是修改后的openfile函数的一个非常基本的形状。 再次,未经testing,但我已经从我自己的一个过程中修改它,所以它应该工作

 Function openfile() As Excel.Workbook Dim sFilter As String Dim sTitle As String Dim vFileName As Variant sFilter = "Excel Files (*.xl*), *.xl*, CSV Files (*.csv), *.csv, All Files (*.*), *.*" sTitle = "Select file to process" vFileName = Application.GetOpenFilename(filefilter:=sFilter, Title:=sTitle) If vFileName = False Then Set openfile = Nothing Else Set openfile = Workbooks.Open(Filename:=vFileName) End If End Function