【问题标题】:Subscript out of range when looping through array excel VBA循环遍历数组excel VBA时下标超出范围
【发布时间】:2017-11-22 06:54:12
【问题描述】:

我正在尝试在 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 行后停止?

【问题讨论】:

  • 显示您的完整代码,包括变量声明。在哪一行弹出错误?
  • 这取决于:我们看不到第 29 行的内容,也看不到任何与此相关的示例数据!
  • 更新了代码。错误在于行 -> Worksheets("Sheet2").Cells(i, x + 1).Value = rowValue(x)
  • 工作表 2 只是一张空工作表。
  • 我认为第 29 行中的值没有一个长字符串,其中您有 13 个用空格分隔的单词。当代码停止时,右键单击 rowValue 并单击添加监视并检查有多少个值有没有在数组中。

标签: arrays excel vba loops


【解决方案1】:

这是您的新代码:

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 用户经常艰难地做事,而不是检查是否已经为同一任务创建了内置功能。

你原来的子程序的一些问题:

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

  • 你没有声明Value2,但你使用它。

  • 你没有声明arraySize,但你使用它。

  • 你没有声明x,但你使用它。

  • 您无缘无故地使用了With/End With 语句(因为您没有在WithEnd With 之间引用.)。

  • With/End With 语句开始和结束 14,998 次。 (见下文。)

  • 你硬编码 11,12,13,这可能是个问题,除非所有原始值都是 9 words long。

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

  • 由于上述错误,您的If arraysize>3 行将不正确。

  • 您正在使用 Variant (i) 来严格计算整数。

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

  • If X=0 then Cells(i, x + 1) 不正确,因为它从第 1 列开始写入(替换源文本)。

  • Else 'do nothing 不需要,因为Else 语句是可选的。

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

  • 没有End Sub。 (我认为是复制/粘贴错误)

  • 您没有使用Option Explicit(这就是您没有注意到未声明变量的原因)。

  • 还有几件事我现在忘记了。 给我一点时间来列出你的代码的所有错误... :)


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

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

  • If arraySize > 3 Then

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

【讨论】:

  • rowValue(11) = rowValue(11) & " " & rowValue(12) & " " & rowValue(13) 发生了什么?
  • @december(别忘了▲ 点赞有帮助的答案✓+ ▲ 接受支持帮助您解决问题的答案!)
【解决方案2】:

这是个问题:

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 行崩溃?!? (也许第 2 到 29 行只包含 2 个或更少的空格??)
  • 不行-不能少于3个空格,否则行设置位置11会崩溃。
【解决方案3】:

使用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

【讨论】:

  • 当代码本身没有被很好地分解并且没有遵循命名约定时,这很好,隐藏了一个预期的错误。
  • 但是错误不是预期的,否则OP不会问这个问题。
  • “不要担心代码中容易修复的错误”
猜你喜欢
  • 1970-01-01
  • 2014-01-27
  • 2020-12-10
  • 1970-01-01
  • 2021-11-20
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多