设置等于范围的数组时,下标超出范围VBA错误

时间:2015-06-30 16:21:15

标签: arrays excel vba excel-vba

目前,我有一系列我希望能够输入数组的字符串。但是,我不确定它是否正常工作,每当我尝试对数组做任何事情时,我都会得到一个超出范围错误的下标。我试着做一个Debug.Print来查看值是否进入数组但是导致了相同的错误。这是我到目前为止所拥有的......

UsedRow = ActiveWorkbook.Sheets(3).UsedRange.Rows.Count
Dim ProjectCounter As Long
Dim ArrRange As Range

'This determines the number of entries in the array (I know this part works)
i = UsedRow
ProjectCounter = 0
Do While Cells(i, 1).FormulaR1C1 <> vbNullString
    ProjectCounter = ProjectCounter + 1
    i = i - 1
Loop

'Array should have dimensions that match the number of projects
Dim ProjectArray() As Variant
ReDim ProjectArray(ProjectCounter - 1)

'Set range for array to cover
Set ArrRange = ActiveWorkbook.Sheets(3).Range("A" & UsedRow - ProjectCounter & ":A" & UsedRow)

'Populate array with projects
ProjectArray = ArrRange

For i = LBound(ProjectArray) To UBound(ProjectArray)
Debug.Print ProjectArray(i)
Next

这是设置数组的正确方法吗?如果没有,我做错了什么?感谢。

2 个答案:

答案 0 :(得分:1)

我一直认为将1维范围复制为二维数组的方式是VBA最烦人的事情之一。修复结果下标超出范围错误的一种方法是,而不是记住包含无意义的下标,首先修复数组本身,这样如果数组在概念上是1维的,那么你的代码就可以这样处理它。以下子修改了为变量分配值范围时获得的数组类型。如果真的是二维的话,它就不会采取任何行动:

Sub FixArray(valArray As Variant) 'As Variant
'This sub takes a pseudo 2-dimenional 1-based variant array
'And makes it 1-dimensional

    Dim fixedArray As Variant
    Dim columnVector As Boolean
    Dim i As Long, m As Long, n As Long
    On Error GoTo err_handler

    m = UBound(valArray, 1)
    n = UBound(valArray, 2) 'will throw an error if already 1-dimensional
    If m > 1 And n > 1 Then Exit Sub 'can't be fixed without losing data
    If m > 1 Then
        columnVector = True
    Else
        columnVector = False
        m = n
    End If
    ReDim fixedArray(1 To m)
    For i = 1 To m
        If columnVector Then
            fixedArray(i) = valArray(i, 1)
        Else
            fixedArray(i) = valArray(1, i)
        End If
    Next i
    valArray = fixedArray
err_handler:
    'no action - nothing to fix
End Sub

测试子(在调试模式下运行,本地窗口打开,看看v如何从2维变为1维):

Sub test()
    Dim v As Variant
    v = Range("A1:A3").Value
    FixArray v
    Debug.Print "here" 'convenient breakpoint
End Sub

答案 1 :(得分:0)

您可以将数组读入预设范围而无需重新编辑。声明没有括号的变体。

Dim ProjectArray as Variant
ProjectArray = ArrRange

您收到错误,因为您的数组有2个维度。你需要

for I = 1 to ubound(ProjectArray)
   debug.print ProjectArray(I,1)
next I

当你这样做时,LBound将永远是1。