vba - VBA 使用 ahtCommonOpenFileSave 和 ahtOFN_ALLOWMULTISELECT,选择单个文件时出错
问题描述
也许我忽略了显而易见的事情,但我不知道如何处理数组中的单个结果。
我在 VBA 中使用Ken Getz ahtCommonFileOpenSave API来启用选择多个文件,使用以下代码。
Private Sub btn_openfiles_Click()
Dim strFilter As String
Dim strInputFileName As String
Dim strFiles() As String
Dim a As Long
strFilter = ahtAddFilterItem(strFilter, "Images (*.PNG)", "*.PNG")
strFiles = ahtCommonFileOpenSave( _
Filter:=strFilter, _
OpenFile:=True, _
InitialDir:="T:\DTP\Programs\Default\", _
DialogTitle:="Please select an input file...", _
Flags:=ahtOFN_EXPLORER + ahtOFN_ALLOWMULTISELECT)
If IsArray(strFiles) Then
For a = 0 To UBound(strFiles)
Me.test_filenames = Me.test_filenames & strFiles(a) & vbCrLf
Next a
Else
Me.test_filenames = strFiles
End If
End Sub
我知道结果是一个数组,因为我正在设置 ahtOFN_ALLOWMULTISELECT 标志。When multiple files are selected, this goes well. 但如果只选择了一个文件,则
抛出错误 13(strFiles 上的类型不匹配)
因为 ahtCommonFileOpenSave 的返回值不是数组。我可以通过向 ahtCommonFileOpenSave 生成的数组添加一个虚拟值来强制使用 Array 类型,并在处理表单中的文件名时忽略它,但也许有更好的解决方案。有人有建议吗?
解决方案
正如我已经提到的,忽略显而易见的。将变量类型更改为变体就可以了。ahtComminFileOpenSave 在选择多个文件时返回完整的数组,并且始终为 Variant 类型。Luuk 的建议也有效(当省略变量类型时,默认使用变体类型)。更正(和修改)的代码就像这样,就像一个魅力!
Private Sub btn_openfiles_Click()
Dim strFilter As String
Dim strInputFileName As String
Dim varFiles As Variant
Dim a As Long
strFilter = ahtAddFilterItem(strFilter, "Images (*.PNG)", "*.PNG")
Me.test_filenames = ""
varFiles = ahtCommonFileOpenSave( _
Filter:=strFilter, _
OpenFile:=True, _
InitialDir:="T:\DTP\Programs\Default\", _
DialogTitle:="Please select an input file...", _
Flags:=ahtOFN_EXPLORER + ahtOFN_ALLOWMULTISELECT)
If IsArray(varFiles) Then
For a = 0 To UBound(varFiles)
Me.test_filenames = Me.test_filenames & varFiles(a) & vbCrLf
Next a
Else
Me.test_filenames = varFiles
End If
结束子
推荐阅读
- python - 根据其他列中的值返回列的状态
- java - Gradle 7,extendFrom 不适用于自定义模块
- docker - 自动删除多阶段 Dockerfile 中使用的 FROM 映像
- ios - Flutter App 在模拟器(Iphone 12 mini)上完美运行,但在设备上崩溃(Iphone 8 plus)
- python - ValueError:视图未返回 HttpResponse 对象
- java - 使用 JAVA 计算每个字符串段中出现的邮件数量最多
- navigation-drawer - 在我现有的扩展活动中实现 android 导航抽屉
- php - Oxygen Builder (Easy post Template php) - 从自定义 php 中删除 url 链接
- javascript - 使用带有返回 null 的内置字符串参数的 RegExp
- c++ - 如果我们在 c 的 switch case 中首先使用 Default 会怎样