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