我目前正在使用以下代码来提示用户输入工作簿,打开它,从中获取一些信息然后关闭它。目前,我通过使用工作簿集合和索引(“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
现在我已经看到了解决这个问题的一些方法,包括获取每个工作簿的完整路径,但是我宁愿避免使用完整路径,因为它包含不同语言的单词(并且工作簿的名称带有问号)。此外,我更喜欢一种解决方案,其中用户仅被提示两次文件,而不是两次。
答案 0 :(得分: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
答案 1 :(得分:0)
使用现有的openfile函数,将布尔值的返回值更改为Excel.Workbook。如果他们没有打开工作簿,则将其设置为Nothing而不是false,否则将其设置为刚刚打开的文件的工作簿引用(您需要修改openfile以获取该引用)。然后,您只需调用它两次,并为每个不是Nothing的调用设置工作簿引用。
下面的示例代码是自由格式编写的,未经测试 - 它实际上只是美化伪代码 - 但应指向正确的大方向。
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函数的一个非常基本的形状。再次,未经测试,但我已经从我自己的一个procs修改它,所以它应该工作
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