Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA继续';打开文件';即使在取消之后_Excel_Vba - Fatal编程技术网

Excel VBA继续';打开文件';即使在取消之后

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

好的,给你。在过去的3到4个月里,我做了很多编码,学到了很多东西,但是,我不明白为什么在弹出窗口显示过滤后的文件名时,当我最后点击“取消”时,这些代码仍然会打开一个文件。如有任何建议,将不胜感激

 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=“”,但仍无法正常工作。