Excel VBA变量索引超出范围
我是VBA新手,需要展开现有工作表并保留其格式。需要完成7个具有可变长度(行)和14列宽度的部分。所以我想做的是:Excel VBA变量索引超出范围,excel,vba,Excel,Vba,我是VBA新手,需要展开现有工作表并保留其格式。需要完成7个具有可变长度(行)和14列宽度的部分。所以我想做的是: 找到节开始的行 从每个部分中选择数据并将其保存到一个数组中(我认为这是一个长度为7的数组,每个条目包含一个2-dim.array,其中包含数据) 选择“我的新数据”,并使用该新数据展开现有阵列(在上一步中创建) 使用新创建的阵列替代当前图纸 添加格式 我成功地完成了步骤1,目前正在努力完成步骤2:我需要创建一个长度可变的数组,以便插入数据 到目前为止,我的代码是: ' this
- 找到节开始的行
- 从每个部分中选择数据并将其保存到一个数组中(我认为这是一个长度为7的数组,每个条目包含一个2-dim.array,其中包含数据)
- 选择“我的新数据”,并使用该新数据展开现有阵列(在上一步中创建)
- 使用新创建的阵列替代当前图纸
- 添加格式
' this should create the array with the 7 entries
' "myArray" contains the row-numbers where the sections start
Function GenerateSheetArray(sheet As Worksheet, myArray As Variant) As Variant
Dim finalArray As Variant
Dim myInt As Integer
'here each entry should be filled
For i = 0 To 6
myInt = myArray(i)
finalArray(i) = GenerateArrayPart(sheet, myInt)
Next
GenerateSheetArray = finalArray
End Function
'This should fill each entry with the data of corresponding section
Function GenerateArrayPart(sheet As Worksheet, headline As Integer) As Variant
Dim leftIndex As Integer, rightIndex As Integer, rowcount As Integer
Dim sheetArray() As Variant
rowcount = 0
leftIndex = 1
rightIndex = 14
i = headline + 1
Do While sheet.Cells(i, 1) <> ""
rowcount = rowcount + 1
i = i + 1
Loop
If (rowcount > 0) Then
For colIndex = leftIndex To rightIndex
For rowIndex = 1 To rowcount
Row = headline + rowIndex
sheetArray(rowIndex - 1, colIndex - 1) = sheet.Cells(Row, colIndex)
Next
Next
End If
GenerateArrayPart = sheetArray
End Function
VBA说:
索引超出范围
在方法generateAryPart
中。
这怎么会发生?我认为
variant
几乎可以是所有东西,也不需要使用边界 数组中没有任何值。因此,数组只被声明,没有被标注尺寸
试试这个:
Dim finalArray As Variant
Redim finalArray(6)
现在,数组中有7个值。从0到6。使用数组sheetArray
时,在函数generatarraypart中也会发生相同的错误。在这里,您需要将数组声明为多维数组。例如,Redim sheetArray(N,M)
要查看一些小的工作示例,请查看以下代码:
Sub TestMe()
Dim finalArr As Variant
ReDim finalArr(6)
Dim i As Long
For i = LBound(finalArr) To UBound(finalArr)
finalArr = GenerateArrPart(i)
Next i
For i = LBound(finalArr) To UBound(finalArr)
Debug.Print i; finalArr(i, i)
Next i
End Sub
Public Function GenerateArrPart(a As Long) As Variant
Dim i As Long
Dim arrReturn As Variant
ReDim arrReturn(a + 1, a + 1)
For i = LBound(arrReturn) To UBound(arrReturn)
arrReturn(i, i) = a * i
Next i
GenerateArrPart = arrReturn
End Function
这是输出:
0 0
1 6
2 12
3 18
4 24
5 30
6 36
7 42
你的意思是每次我添加新值以扩展范围时都应该使用“redim”?由于
Redim sheetArray(N,M)
需要两个常量,我需要像列表一样工作,在这种情况下,我不能在一开始就使用它一次function@Rüdiger-每次扩展阵列时,都必须重新定义,是的。如果要保留旧值,请使用单词Preserve
。如Redim Preserve finalArray(100)
@Rüdiger-如果您不喜欢每次Redim
,则集合
对象可供您使用。
0 0
1 6
2 12
3 18
4 24
5 30
6 36
7 42