Excel VBA继续';打开文件';即使在取消之后
好的,给你。在过去的3到4个月里,我做了很多编码,学到了很多东西,但是,我不明白为什么在弹出窗口显示过滤后的文件名时,当我最后点击“取消”时,这些代码仍然会打开一个文件。如有任何建议,将不胜感激Excel VBA继续';打开文件';即使在取消之后,excel,vba,Excel,Vba,好的,给你。在过去的3到4个月里,我做了很多编码,学到了很多东西,但是,我不明白为什么在弹出窗口显示过滤后的文件名时,当我最后点击“取消”时,这些代码仍然会打开一个文件。如有任何建议,将不胜感激 Sub OpenByPartialName() ' Returns popup window with only filtered filenames matching ' Partial Filename input Dim WB As Workbook Dim Ans As Str
Sub OpenByPartialName()
' Returns popup window with only filtered filenames matching
' Partial Filename input
Dim WB As Workbook
Dim Ans As String
Dim MyFile As String
Dim path As String
' Folder Path Name for Forms
path = ("S:\Forms Folder\")
Ans = InputBox("Enter Partial filename Filter", "Open File With Partial Name Filter")
MyFile = Dir("S:\Forms Folder\" & "*" & Ans & "*.xls")
MyFilter = path & "*" & Ans & "*.xls"
With Application.FileDialog(msoFileDialogOpen)
.AllowMultiSelect = False
.InitialFileName = MyFilter
If .Show = 1 Then
MyFile = .SelectedItems(1)
End If
End With
On Error Resume Next
Set WB = Workbooks.Open(MyFile)
End Sub
这将是一个肮脏的黑客行为,但如果您在这里有
Else
分支:
If .Show = 1 Then
MyFile = .SelectedItems(1)
Else
MyFile = vbNullString
End If
…实际打开文件的代码可以在尝试之前验证MyFile
是否为空:
On Error Resume Next
If MyFile <> vbNullString Then Set WB = Workbooks.Open(MyFile)
出错时继续下一步
如果MyFile vbNullString,则设置WB=Workbooks.Open(MyFile)
也就是说,我认为您应该在这里至少处理错误53(“未找到文件”),而不是将所有错误都隐藏起来
此外,未使用
WB
参考。也许Sub
应该是一个函数,返回打开的工作簿,或者如果打开失败,则不返回任何内容?这是我用来选择目录的。如果函数返回空字符串,我不会尝试打开该文件
Private Function FolderPicker() As String
'*******************************************
' returns directory path to be printed to
' does not allow multiple selections,
' so returning the first item in selected
' items is sufficient.
'
' returns empty string On Error or if the
' user cancels
'********************************************
On Error GoTo ErrHandler
Const DefaultDirectory As String = "C:Path\to\default\directory\"
With Application.FileDialog(msoFileDialogFolderPicker)
.AllowMultiSelect = False
.Title = "Choose Directory to Print to"
.InitialFileName = DefaultDirectory
.InitialView = msoFileDialogViewSmallIcons
If .Show <> -1 Then
FolderPicker = vbNullString
Else
FolderPicker = .SelectedItems(1)
End If
End With
Exit Function
ErrExit:
FolderPicker = vbNullString
Exit Function
ErrHandler:
MsgBox "Unexpected Error: " & Err.number & vbCrLf & "Source: " & Err.Source & _
"Description: " & Err.Description, vbCritical, "ERROR!"
Resume ErrExit
End Function
私有函数FolderPicker()作为字符串
'*******************************************
'返回要打印到的目录路径
'不允许多选,
'因此,返回选定区域中的第一个项目
"项目就够了。
'
'错误时返回空字符串,或者
'用户取消
'********************************************
关于错误转到错误处理程序
Const DefaultDirectory As String=“C:Path\to\default\directory\”
使用Application.FileDialog(msoFileDialogFolderPicker)
.AllowMultiSelect=False
.Title=“选择要打印到的目录”
.InitialFileName=DefaultDirectory
.InitialView=msoFileDialogViewSmallIcons
如果.Show-1那么
FolderPicker=vbNullString
其他的
FolderPicker=.SelectedItems(1)
如果结束
以
退出功能
错误退出:
FolderPicker=vbNullString
退出功能
错误处理程序:
MsgBox“意外错误:&Err.number&vbCrLf&”源:&Err.Source&_
描述:“&Err.Description,vbCritical,”错误
恢复错误退出
端函数
所以,你可以这样称呼它
MyFile = FolderPicker
If MyFile <> vbNullString Then
Set WB = Workbooks.Open(MyFile)
End If
MyFile=FolderPicker
如果MyFile vbNullString,则
设置WB=Workbooks.Open(MyFile)
如果结束
后来,我流了很多血、汗水和眼泪(认真上网、拼凑代码并重新测试),我找到了一个答案,在任何时候按“取消”都不会有任何问题
Sub OpenAuditPartialName()
' Returns popup window with only filtered
' filenames matching input criteria.
' Filenames are saved from another code that uses 3 variables to generate a _
' filename 'Filename part1_Filename part2_Filename part3 Forms.xls'
Dim WB As Workbook
Dim Ans As String
Dim MyFile As String
Dim path As String
' Folder path for Forms
path = ("S:\Forms Folder\")
Ans = InputBox("Enter any part of the filename to search by." & vbCrLf & vbCrLf & _
"Full or Partial information is OK." & vbCrLf & vbCrLf & "Filename part1" _
& vbCrLf & "Filename part2" & vbCrLf & "Filename part3", "Enter Partial Filename Filter")
' Exits on 'Cancel' as it should
If Ans = "" Then
Exit Sub
End If
MyFile = Dir(path & "*" & Ans & "*.xls")
MyFilter = path & "*" & Ans & "*.xls"
'*******************************************
With Application.FileDialog(msoFileDialogOpen)
.AllowMultiSelect = False
.InitialFileName = MyFilter
' Now accepts the 'Cancel' instead of continuing to open the first file
' in the filtered list when pressed
If .Show = 0 Then
ElseIf Len(Ans) Then
MyFile = .SelectedItems(1)
On Error Resume Next
Set WB = Workbooks.Open(MyFile)
Else
Exit Sub
End If
'*******************************************
End With
End Sub
因为你没有检查是否应该打开文件?那是我的一次尝试。但它只是导致代码无法以任何方式打开文件。改为使用MyFile=“”,但仍无法正常工作。