arrays - 在 msoFileDialogFilePicker 之后从 SelectedItems 创建数组

标签 arrays excel vba ms-office

尝试创建一个文件数组,稍后我可以“循环”以从每个文件中提取信息(文件的布局相同/在 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 中选择的文件。

最佳答案

您不需要像这样嵌套循环来复制它们。你得到溢出是因为你有一个 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而是循环。调整数组大小一次( as @TimWilliams suggested ),然后在 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

关于arrays - 在 msoFileDialogFilePicker 之后从 SelectedItems 创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54410854/

相关文章:

php - 如何删除数组键中的前缀

javascript - 无法获取数组内的对象

vba - 跳过循环中的空单元格

vba - 合并功能在VBA中不起作用

java - 随机化牌组

java - 有效地删除 Java 中 arraylist 中每个数组的第一个元素

c# - EPPlus 和图形

excel - 加载过程中以下区域出现问题: Table

javascript - 从 Morningstar.com 获取上行/下行捕获率

vba - 比较 double 返回 false