我在 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 的列表框的任何想法?
问题是
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
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)
使用变体变量
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