Создать массив из SelectedItems после msoFileDialogFilePicker - PullRequest
0 голосов
/ 29 января 2019

Попытка создать массив файлов, которые я позже смогу «пролистать» для извлечения информации из каждого файла (файлы выложены одинаково / формы в Excel).Получение ошибки переполнения '6', подозрение, что это ошибка, вызванная моим циклом?

Sub WorkOrderList()
'This compiles an array of Files by picking from the folder
Dim objFileDialog As Office.FileDialog
Dim SelectedFile As Variant
Dim arFiles() As Variant
Dim myCount As Integer
Set objFileDialog = Application.FileDialog(msoFileDialogFilePicker)
With objFileDialog
.AllowMultiSelect = True
.ButtonName = "Select"
.Title = "Work Order Picker"
If (.Show > 0) Then
End If
If (.SelectedItems.Count > 0) Then
For Each SelectedFile In .SelectedItems
Do Until SelectedFile = ""
myCount = myCount + 1
ReDim Preserve arFiles(1 To myCount)
arFiles(myCount) = SelectedFile
Loop
Next SelectedFile
Else
End If
End With
Set objFileDialog = Nothing
End Sub

Я ожидаю, что результирующий массив arFiles с каждым элементом массива будет файлом, выбранным из msoFileDialogFilePicker.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вам не нужно вложить эти циклы, чтобы скопировать их.Вы получаете переполнение, потому что у вас есть цикл Do, из которого невозможно выйти:

        For Each SelectedFile In .SelectedItems
            Do Until SelectedFile = ""      '<-- This will never be true.
                myCount = myCount + 1
                ReDim Preserve arFiles(1 To myCount)
                arFiles(myCount) = SelectedFile
            Loop
        Next SelectedFile

Это будет увеличивать значение myCount до тех пор, пока оно не переполнится.Учитывая, что размер массива всегда будет соответствовать количеству выбранных элементов, я бы предложил вместо этого использовать простой цикл For.Измените размер массива один раз (, как предложил @TimWilliams ), затем просто используйте индексатор на SelectedItems, чтобы скопировать их:

    myCount = .SelectedItems.Count
    If myCount > 0 Then
        ReDim arFiles(1 To myCount)
        Dim idx As Long
        For idx = 1 To myCount
            arFiles(idx) = .SelectedItems(idx)
        Next
    End If
0 голосов
/ 29 января 2019
With objFileDialog
    .AllowMultiSelect = True
    .ButtonName = "Select"
    .Title = "Work Order Picker"
    .Show
    If (.SelectedItems.Count > 0) Then
        ReDim Preserve arFiles(1 To .SelectedItems.Count)
        For Each SelectedFile In .SelectedItems
            myCount = myCount + 1
            arFiles(myCount) = SelectedFile
        Next SelectedFile
    End If
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...