这似乎是这个主题的第百万个问题,但是搜索并没有帮助我。
我正在尝试调整二维数组的最后一个维度的大小,但是在ReDim Preserve行中总是出现“索引越界”错误。
Dim arrCurrentDataset As Variant
For i = 0 To UBound(fileNames) - 1
strPath = fileNames(i)
Set wkbSource = Workbooks.Open(Filename:=strPath, UpdateLinks:=xlUpdateLinksNever, ReadOnly:=True, Notify:=True)
Set wksSource = wkbSource.Sheets(1)
Dim lngRows As Long
lngRows = wksSource.UsedRange.SpecialCells(xlCellTypeLastCell).Row
'Store dataset to array and afterwards increase second dimension by 2 -> create space to add Materialart and Beschaffungsart
arrCurrentDataset = wksSource.Range("A4:I" & lngRows).value
ReDim Preserve arrCurrentDataset(UBound(arrCurrentDataset, 1), UBound(arrCurrentDataset, 2) + 2)
'...
next i
我的声明有问题吗?我是否隐式尝试更改数据类型?
非常感谢您的帮助!
答案 0 :(得分:2)
您的数组维数基于1,但是默认值是0(除非您有Option Base 1
语句),因此必须在Redim
中指定:
ReDim Preserve arrCurrentDataset(1 to UBound(arrCurrentDataset, 1), 1 to UBound(arrCurrentDataset, 2) + 2)
答案 1 :(得分:0)
当您将变量声明为Variant时,它可以是任何东西。它可以是数组,也可以是二维数组,但也可以是对象,字符串或其他东西。
因此,当您希望它成为数组时,必须使用Redim
命令。但是,当您第一次点击Redim
时,您还没有数组,因此Ubound
将会失败(仅对数组有效)-并且因为它不是数组,所以也有什么都没保留。
您可以通过在实际工作开始之前初始化数组或添加检查变量是否包含数组来解决此问题
If isArray(arrCurrentDataset) Then
ReDim Preserve arrCurrentDataset(1 to UBound(arrCurrentDataset, 1), 1 to UBound(arrCurrentDataset, 2) + 2)
Else
' You have to make up your mind about the initial size of the array
ReDim arrCurrentDataset(1 to 10, 1 to 10)
End If