首页 > 解决方案 > 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 类型,并在处理表单中的文件名时忽略它,但也许有更好的解决方案。有人有建议吗?

标签: vbams-access

解决方案


正如我已经提到的,忽略显而易见的。将变量类型更改为变体就可以了。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

结束子


推荐阅读