当通过数组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
语句(因为您在With
和End 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