如何提前退出Sub()?

时间:2019-09-03 17:52:13

标签: vba

对于VBA,我是完全陌生的应用程序,我有一些非常基本的问题。我正在创建一个用户窗体,我需要能够提前退出其中之一。当我退出GetOpenFilename窗口而不选择任何工作簿并仅结束子程序时,我根本不想得到调试错误。 其次,当选择“所有文件”过滤器时,我无法获得GetOpenFilename对话框来显示所有其他可用文件名(xls,xlm,xlsx,xlsm)。要使其正常工作,我应该更改什么?

我试图在TempArray IsEmpty时退出sub,但是由于某种原因它不起作用。

   Private Sub cmdAddWorkbooks_Click()

'Variables declarations
Dim FileFilter As String
Dim FilterIndex As Long
Dim Title As String
Dim MultiSelect As Boolean
Dim WorkbookCounter As Long
Dim TempArray() As Variant
Dim SelectedWorkbooksTemp() As Variant

ReDim SelectedWorkbooksTemp(0 To 1, 0 To 1)

'Setting up GetOpenFilename parameteres
FileFilter = "Microsoft Excel Worksheet (*.xlsx),*xlsx," & _
             "Microsoft Excel Worksheet with Macros (*.xlsm),*xlsm," & _
             "Microsoft Excel 97-2003 Worksheet (*.xls),*xls," & _
             "Microsoft Excel 97-2003 Worksheet with Macros (*.xlm),*xlm," & _
             "All Files (.),."
FilterIndex = 5
Title = "Select Workbooks"
MultiSelect = True

'Using GetOpenFilename
On Error Resume Next
TempArray = Application.GetOpenFilename _
    (FileFilter:=FileFilter, _
    FilterIndex:=FilterIndex, _
    Title:=Title, _
    MultiSelect:=MultiSelect)
'exiting doesnt work
On Error GoTo 0
If IsEmpty(TempArray) Then End Sub

WorkbookCounter = UBound(TempArray)
ReDim SelectedWorkbooksTemp(1 To WorkbookCounter, 1 To WorkbookCounter)
For i = 1 To WorkbookCounter
    SelectedWorkbooksTemp(i, 1) = TempArray(i)
    SelectedWorkbooksTemp(i, 2) = Dir(TempArray(i))
Next i

结束子

1 个答案:

答案 0 :(得分:0)

问题出在IsEmpty,而不是Exit SubEnd Sub can't be used like this.

IsEmpty仅在被赋予True时才是Variant/Empty。给出其他任何内容,它将返回False

Application.GetOpenFilename不返回变量数组。它返回一个Variant,它可能是包含一个或多个文件名,或布尔值False的数组,以指示取消。

因此,将其值捕获到Variant()中将在取消时引发类型不匹配错误-您吞下On Error Resume Next的错误...首先将其删除与On Error GoTo 0

重新声明您的结果As Variant,并在使用时给它取一个有意义的名称:

Dim selectedFiles As Variant
selectedFiles = Application.GetOpenFilename(...)

如果对话框已取消,现在要退出过程范围,请验证Variant子类型selectedFiles具有以下内容:

If VarType(selectedFiles) = vbBoolean Then Exit Sub

如果是布尔值,则对话框被取消。否则,您正在查看的是文件名数组...您不知道其界限-因此,请不要假设它是基于1的:

For i = LBound(selectedFiles) To UBound(selectedFiles)
    ...
Next

  

当选择“所有文件”过滤器时,我无法显示GetOpenFilename对话框来显示所有其他可用文件名(xls,xlm,xlsx,xlsm)

AFAIK,您需要明确指定希望“所有文件”过滤器读取的内容,就像其他所有文件过滤器一样。适当使用通配符,并使用点扩展名:

FileFilter = "Microsoft Excel Worksheet (*.xlsx),*.xlsx," & _
             "Microsoft Excel Worksheet with Macros (*.xlsm),*.xlsm," & _
             "Microsoft Excel 97-2003 Worksheet (*.xls),*.xls," & _
             "Microsoft Excel 97-2003 Worksheet with Macros (*.xlm),*.xlm," & _
             "All Files (*.*),*.*"
相关问题