VBA использует ahtCommonOpenFileSave с ahtOFN_ALLOWMULTISELECT, ошибка при выборе одного файла - PullRequest
0 голосов
/ 25 февраля 2020

Может быть, я упускаю из виду очевидное, но я не могу понять, как работать с одним результатом в массиве.

Я использую Ken Getz ahtCommonFileOpenSave API в VBA для включите выбор нескольких файлов, используя следующий код:

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. Когда выбрано несколько файлов, все идет хорошо. Но если выбран только один файл, выдается ошибка

13 (несоответствие типов в strFiles)

, поскольку возвращаемое значение ahtCommonFileOpenSave не является массивом. Я могу использовать тип Array, просто добавив фиктивное значение в массив, созданный ahtCommonFileOpenSave, и игнорируя это при обработке имен файлов в форме, но, возможно, есть лучшее решение. У кого-нибудь есть предложение?

1 Ответ

0 голосов
/ 25 февраля 2020

Как я уже говорил, упускать из виду очевидное. Смена типа переменной в вариант сделала свое дело. ahtComminFileOpenSave возвращает полный массив, когда выбрано несколько файлов, и всегда является типом Variant. Предложение Луука тоже работает (тип варианта используется по умолчанию, когда тип переменной опущен). Исправленный (и исправленный) код подобен этому и работает как шарм!

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

End Sub

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...