Excel VBA变量索引超出范围

Excel VBA变量索引超出范围,excel,vba,Excel,Vba,我是VBA新手,需要展开现有工作表并保留其格式。需要完成7个具有可变长度(行)和14列宽度的部分。所以我想做的是: 找到节开始的行 从每个部分中选择数据并将其保存到一个数组中(我认为这是一个长度为7的数组,每个条目包含一个2-dim.array,其中包含数据) 选择“我的新数据”,并使用该新数据展开现有阵列(在上一步中创建) 使用新创建的阵列替代当前图纸 添加格式 我成功地完成了步骤1,目前正在努力完成步骤2:我需要创建一个长度可变的数组,以便插入数据 到目前为止,我的代码是: ' this

我是VBA新手,需要展开现有工作表并保留其格式。需要完成7个具有可变长度(行)和14列宽度的部分。所以我想做的是:

  • 找到节开始的行
  • 从每个部分中选择数据并将其保存到一个数组中(我认为这是一个长度为7的数组,每个条目包含一个2-dim.array,其中包含数据)
  • 选择“我的新数据”,并使用该新数据展开现有阵列(在上一步中创建)
  • 使用新创建的阵列替代当前图纸
  • 添加格式
我成功地完成了步骤1,目前正在努力完成步骤2:我需要创建一个长度可变的数组,以便插入数据

到目前为止,我的代码是:

' 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