【问题标题】:Issue with cancelling the selection of txt file取消选择txt文件的问题
【发布时间】:2020-05-29 08:57:52
【问题描述】:

我想使用一个按钮将一个 txt 文件导入到 excel 中。 我有一个对话框可以选择文件夹名称并显示用户选择的文件夹名称。

如果用户选择取消,则由于类型不匹配而发生错误。我已将变量声明为 VARIANT

看看代码:

Sub ImportTXTFiles()
    Dim fso As Object
    Dim xlsheet As Worksheet
    Dim qt As QueryTable
    Dim txtfilesToOpen As Variant, txtfile As Variant

    Application.ScreenUpdating = False
    Set fso = CreateObject("Scripting.FileSystemObject")

    txtfilesToOpen = Application.GetOpenFilename(FileFilter:="Text Files (*.txt), *.txt", _
                  MultiSelect:=True, Title:="Text Files to Open")
    If txtfilesToOpen = "False" Then
            Exit Sub
    End If
        For Each txtfile In txtfilesToOpen
                ' FINDS EXISTING WORKSHEET
                For Each xlsheet In ThisWorkbook.Worksheets
                    If xlsheet.Name = Replace(fso.GetFileName(txtfile), ".txt", "") Then
                        xlsheet.Activate
                        GoTo ImportData
                    End If
                Next xlsheet

                ' CREATES NEW WORKSHEET IF NOT FOUND
                Set xlsheet = ThisWorkbook.Worksheets.Add( _
                                     After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
                xlsheet.Name = Replace(fso.GetFileName(txtfile), ".txt", "")
                xlsheet.Activate
                GoTo ImportData

我的问题是如何在此处处理此异常

If txtfilesToOpen = "False" Then
            Exit Sub
    End If

如果用户取消选择,而变量被声明为变体。

提前致谢。

【问题讨论】:

  • 忽略 If txtfilesToOpen = "False" Then Exit Sub 行之后的所有代码,没有任何问题,对我来说很好。您确定您的代码没有在其他地方中断吗?
  • 您也可以使用 GoTo 语句将其带到例程的末尾,我假设您有 Application.ScreenUpdating = True
  • 是的,我很确定它会在那里中断,并且由于变量类型,它改变了错误发生的原因。
  • 这是一个变种,它应该改变。当您单击取消时,它返回一个Boolean,因此您的Variant 变为Boolean,并且VBA 可以从文本字符串“False”中推断出False,因此它可以正常工作。我的 Excel 2010 运行此代码没有问题,所以我有点困惑,为什么你的代码在这里失败,除非你更早地运行一些东西?
  • 好的,当你选择一个 txt 时,它肯定会在For each 中给你一个错误

标签: excel vba


【解决方案1】:

也许使用这个辅助功能会帮助你:

Option Explicit
Sub Test()

    Dim txtfilesToOpen As String
    txtfilesToOpen = GetFile

End Sub
Private Function GetFile() As String
    Dim fldr As FileDialog
    Set fldr = Application.FileDialog(msoFileDialogFilePicker)
    With fldr
        .Title = "Text Files to Open"
        .AllowMultiSelect = False
        If .Show <> -1 Then
            MsgBox "No file was picked. Please run the macro again."
            End
        End If
        GetFile = .SelectedItems(1)
    End With
End Function

如果用户没有选择文件,则会弹出一个 MsgBox 警告用户,然后完成整个过程。请注意,此过程一次仅适用于一个选定的项目。如果您需要选择多个,请考虑使用文件夹选择器。

【讨论】:

    猜你喜欢
    • 2013-02-26
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2010-12-08
    • 2011-08-16
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多