Arrays 在msoFileDialogFilePicker之后从SelectedItems创建数组

Arrays 在msoFileDialogFilePicker之后从SelectedItems创建数组,arrays,excel,vba,ms-office,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

尝试创建一个文件数组,我可以稍后“循环”以从每个文件中提取信息(文件在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
循环,因此会出现溢出:

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
        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

您可以在进入循环之前使用
ReDim arFiles(1到.SelectedItems.Count)
。你知道你有多少项,所以你可以避免循环中重复的redim语句。你的循环嵌套不正确(缩进它会使事情变得更清楚)。在SelectedFile=”“循环之前,您从未更新
SelectedFile
中的
Do。Tim,当我这样做时,我得到的“9”下标超出范围?这是因为您的循环仍然嵌套不正确。如果只调整数组的大小一次,则在索引器溢出之前,不会增加数组的大小。我建议你用调试器来处理这个问题——你会明白我说的是什么。你是个圣人,谢谢你让我摆脱了自己的陷阱!是的,它确实像我希望的那样返回数组中的项目。再次感谢这真的很有帮助。谢谢我选择了两者的混合。将阵列重新分配到正确的前端大小。然后使用For Each循环,因为所有帐户都会更快地通过集合。
    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