当循环遍历数组excel VBA时,下标超出范围

时间:2017-11-22 06:54:12

标签: arrays excel vba loops

我正在尝试在excel中拆分一个字符串,然后将字符串的每个元素写入另一个工作表的一列但是我似乎无法完成循环,然后才能获得超出范围错误的下标。

Sub S1()

Dim Wb As Workbook
Dim rowValue() As String
Dim i As Variant

For i = 2 To 15500
With Worksheets(1)
    Value2 = Worksheets(1).Cells(i, 1)
    rowValue = Split(Worksheets(1).Cells(i, 1).Value, " ")
    rowValue(11) = rowValue(11) & " " & rowValue(12) & " " & rowValue(13)
    arraySize = UBound(rowValue) - LBound(rowValue) + 1
    If arraySize > 3 Then
        For x = 0 To arraySize
            'Place the split values into 1 column each
        Worksheets("Sheet2").Cells(i, x + 1).Value = rowValue(x)

        Next x
    Else
        'do nothing
    End If
End With
Next i

以上是我的代码,第一张表中有大约15500行。从1-29行开始,一切正常,但之后我得到了运行时错误9,下标超出了范围。

任何人都知道为什么循环会在29行后停止?

3 个答案:

答案 0 :(得分:2)

这是您的新代码:

Sub S1()
    Dim i As Integer, arr_Split() As String
    For i = 2 To 15500
        arr_Split = Split(Sheets(1).Cells(i, 1), " ")
        Range(Sheets(1).Cells(i, 2), Sheets(1).Cells(i, 2 + UBound(arr_Split))) = arr_Split
    Next i
End Sub

尝试取代整个潜艇。 Excel用户经常做事困难,而不是检查是否已经为同一任务创建了内置功能。<​​/ p>

原始子程序的一些问题:

  • 您将Wb声明为工作簿但不使用它。

  • 您没有声明Value2但是您使用它。

  • 您没有声明arraySize但是您使用它。

  • 您没有声明x但是您使用它。

  • 您无缘无故地使用With / End With语句(因为您未在.With之间引用End With

  • With / End With声明开始&amp;结束 14,998次。 (见下文。)

  • 你硬编码11,12,13,除非所有原始值都是9 words长,否则可能会出现问题。

  • 如果(例如)您的数组有5个项目,arraySize将计算为3.(如果数组有5个项目,则编号为0到4,并且您的公式计算为{{1} }为4减1。

  • 由于上述错误,您的arraySize行不正确。

  • 您正在使用Variant(If arraysize>3)严格计算整数。

  • i / For循环使用Next的不正确值。

  • x不正确,因为它开始在第1列写入(替换源文本)。

  • If X=0 then Cells(i, x + 1)是不必要的,因为Else 'do nothing语句是可选的。

  • 行号是硬编码的,这意味着您将始终处理14,998行。

  • 没有Else。 (我假设复制/粘贴错误)

  • 您没有使用End Sub(这就是为什么您没有注意到未声明的变量)。

  • 此刻还有一些我忘记的事情。 给我一点时间列出代码中的所有错误......:)

我遗漏了这些行,因为(没有样本数据)不清楚他们做了什么。如果我知道他们做了什么,我很肯定有更好的方法来编码(可能没有硬编码值)。

  • Option Explicit

  • rowValue(11) = rowValue(11) & " " & rowValue(12) & " " & rowValue(13)

如果需要,请重新添加它们,但要确保声明变量并且硬编码值无法导致问题,否则可能会导致您拥有或将要拥有的任何可能数据出现问题。

答案 1 :(得分:1)

这是一个问题:

For x = 0 To arraySize

大小为10(下限= 0)的数组的上限为9,因此会有(例如)没有rowValue(10)

使用边界检查重做:

Sub S1()

    Dim Wb As Workbook, rowValue, i As Long, ub As Long

    For i = 2 To 15500

        rowValue = Split(Worksheets(1).Cells(i, 1).Value, " ")
        ub = UBound(rowValue)

        If ub >= 13 Then
            rowValue(11) = rowValue(11) & " " & rowValue(12) & " " & rowValue(13)
        End If

        If ub > 2 Then
            Worksheets("Sheet2").Cells(i, 1).Resize(1, ub + 1).Value = rowValue
        End If

    Next i

End Sub

答案 2 :(得分:0)

使用On Error Resume Next

Sub S1()

    Dim Wb As Workbook
    Dim rowValue() As String
    Dim i As Variant

    For i = 2 To 15500
        With Worksheets(1)
            Value2 = Worksheets(1).Cells(i, 1)
            On Error Resume Next ' USE THIS
            rowValue = Split(Worksheets(1).Cells(i, 1).Value, " ")
            rowValue(11) = rowValue(11) & " " & rowValue(12) & " " & rowValue(13)
            arraySize = UBound(rowValue) - LBound(rowValue) + 1
            If arraySize > 3 Then
                For x = 0 To arraySize
                    'Place the split values into 1 column each
                Worksheets("Sheet2").Cells(i, x + 1).Value = rowValue(x)

                Next x
            Else
                'do nothing
            End If
            On Error GoTo 0  ' USE THIS
        End With
    Next i

End Sub