VBA 上的 .GetOpenFileName 进行多选选择时出错

问题描述 投票:0回答:3

我在 excel 2010 VBA (7.0) 上创建了一个

Userform
,它将传输用户通过
.GetOpenFileName
属性选择的文件。然后将所选文件的文件路径插入到
ListBox

我的问题是目前我正在尝试使用

MultiSelect
,但是当我给
.GetOpenFileName
Multiselect
属性以将文件路径发送到我的
ListBox
(启用了多行)时,我会看到一个
GetOpenFileName
代码行显示类型不匹配错误。代码示例如下:

Private Sub CommandButton1_Click ()
Dim strFilePath As String

StrFilePath = Application.GetOpenFilename (,,,, MultiSelect:= True)
If strFilePath = "False" Then Exit Sub

FilesFrom.Value = strFilePath

End Sub

FilesFrom 是我想要进入的文件路径的列表框。我的代码允许用户选择单个文件并传输该文件,但它不允许我用多个文件路径填充此列表框。

有关如何允许用户选择多个文件并将文件路径插入名为 FilesFrom 的列表框的任何想法?

vba excel listbox
3个回答
2
投票

问题是

MultiSelect
返回
Array

下面的代码应该正是您想要的。它适合多选或单选。

 Private Sub CommandButton1_Click()
      'GetOpenFile MultiSelect will return an Array if more than one is selected
      Dim FilePathArray As Variant
      FilePathArray = Application.GetOpenFilename(, , , , MultiSelect:=True)

      If IsArray(FilePathArray) Then

           Dim ArraySize As Long
           ArraySize = UBound(FilePathArray, 1) - LBound(FilePathArray, 1) + 1

           Dim ArrayPosition As Long
           For ArrayPosition = 1 To ArraySize

                If Not FilePathArray(ArrayPosition) = Empty Then
                'Replace "UserForm1" with the name of your Userform
                UserForm1.FilesFrom.AddItem (FilePathArray(ArrayPosition))
                End If

           Next ArrayPosition

      ElseIf FilePathArray <> False Then

           'Replace "UserForm1" with the name of your Userform
           UserForm1.FilesFrom.AddItem (FilePathArray)

      End If
 End Sub

0
投票

Application.GetOpenFilename 对我来说似乎有点受限。我通常使用以下代码片段的变体。它将所有选定的文件名复制到 astrFiles() 中,然后您可以根据需要进行处理。

Private Sub CommandButton1_Click()

    Dim astrFiles() As String

    Dim i As Integer
    Dim varSelectedItem as Variant
    Dim objFileSelect As FileDialog
    Set objFileSelect = Application.FileDialog(msoFileDialogOpen)

    objFileSelect.AllowMultiSelect = True
    ' Skip if user clicks cancel on dialogue
    If objFileSelect.Show = True Then
        ' Copy from Variant() to String()
        ReDim astrFiles(objFileSelect.SelectedItems.Count - 1)
        For Each varSelectedItem In objFileSelect.SelectedItems
            astrFiles(i) = varSelectedItem
            i = i + 1
        Next
    End If

    Set objFileSelect = Nothing
End Function

然后,您可以使用以下命令将结果加载到文本框或类似内容中:

FilesFrom.Value = Join(astrFiles,vbCr)

0
投票

GetOpenFilename - 多选

使用变体变量

  • 当使用
    GetOpenFilename
    并将
    MultiSelect
    设置为
    True
    时,结果是布尔值
    False
    (当对话框取消时)或包含路径的 1D 基于 1 的数组选定的文件。
  • 使用使用字符串类型变量的代码,如果取消对话框,则不会出现错误,因为生成的布尔值 (
    False
    ) 将转换为字符串
    False
    。即使数组只有一个元素,也无法进行类似的转换,因此会出现类型不匹配错误。

在用户表单的代码模块中

Private Sub CommandButton1_Click()
    
    Dim FilePaths As Variant
    FilePaths = Application.GetOpenFilename(, , , , True)
    
    If VarType(FilePaths) = vbBoolean Then
        'FilesFrom.Clear
        'MsgBox "No file selected!", vbExclamation
        Exit Sub
    End If
    
    FilesFrom.List = FilePaths

End Sub
© www.soinside.com 2019 - 2024. All rights reserved.