【问题标题】:How to exit Sub() early?如何提前退出 Sub()?
【发布时间】:2020-01-06 15:36:52
【问题描述】:

我对 VBA 应用程序完全陌生,我有一些非常基本的问题。我正在创建一个用户表单,我需要能够提前退出其中一个潜艇。当我退出 GetOpenFilename 窗口而不选择任何工作簿并结束 sub 时,我根本不想出现调试错误。 其次,我无法获取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

结束子

【问题讨论】:

  • End Sub 仅用作Sub 的结束语。你需要的是Exit Sub
  • 有关更多信息,请阅读链接问题中已接受答案的后半部分。
  • 我尝试在 TempArray IsEmpty 时退出 sub,但由于某种原因它不起作用。 - IsEmptyVariant 子类型时返回 TrueVariant/Empty:对于不是Variant/Empty 的任何东西,它总是False。不要使用IsEmpty 来验证数组是否包含元素。为此使用UBound,在GetOpenFilename 的情况下,On Error Resume Next 在对话框被取消时吞下 type mismatch 错误。删除它,然后执行If VarType(tempArray) = vbBoolean Then Exit Sub - 如果对话框被取消,该函数返回False
  • IOW 问题出在IsEmpty,而不是Exit Sub

标签: vba


【解决方案1】:

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

IsEmpty 只有在被赋予Variant/Empty 时才会成为True。给定其他任何内容,它都会返回 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对话框,以显示“所有文件”过滤器选择 em>

时显示所有其他可用的文件名(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 (*.*),*.*"

【讨论】:

  • 谢谢你的帮助,我明白了。您是否知道如何修改 FileFilter 以使“所有文件”选项正常工作?
猜你喜欢
  • 2019-07-04
  • 2015-12-27
  • 2021-01-11
  • 2011-03-20
  • 1970-01-01
  • 2015-08-18
  • 2019-10-04
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多