当通过数组excel VBA循环时,下标超出范围

我想在Excel中拆分一个string,然后将string的每个元素写入另一个工作表的一列,但我似乎无法完成循环之前,它得到下标超出范围的错误。

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行后?

这是你的新代码:

 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用户通常难以做到这一点,而不是检查是否有为同一项任务创build的内置function。

原始子程序的一些问题:

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

  • 您不声明Value2但是您使用它。

  • 你不声明arraySize但你使用它。

  • 你不要声明x但你使用它。

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

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

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

  • 如果(例如)你的数组有5个项目, arraySize会计算为3.(如果一个数组有5个项目,它们被编号为0到4,而你的公式计算arraySize为4减1。

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

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

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

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

  • Else 'do nothing ,因为Else陈述是可选的。

  • 行号是硬编码的,这意味着你将总是处理14,998行。

  • 没有End Sub 。 (我假设一个复制/粘贴错误)

  • 你没有使用Option Explicit (这就是为什么你没有注意到未声明的variables)。

  • 还有一些我现在忘记的东西。 给我一点时间列出你的代码错误的所有东西… 🙂


由于(没有样本数据),我不清楚他们做了什么。 如果我知道他们做了什么,我肯定有一个更好的方法来编码(可能没有硬编码的值)。

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

  • If arraySize > 3 Then

如果需要,将它们添加回来,但要确保variables已声明,并且硬编码的值不会导致问题会导致任何可能的数据有问题。

这是个问题:

 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 

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