我目前正在从工作表1中拆分包含3个元素(a / b / c)的字符串,并在不同的列中粘贴工作表2上的每个部分。这是通过循环完成的。
然而,如果 字符串 只有2个元素,那么上面的“c”为空,我得到运行时错误9:“索引超出范围”。
字符串可以并且有时只有1或2个元素而不是全部3.有什么方法可以避免这个错误吗?
我的研究让我尝试了If Len(Trim())= vbnullstring和Len()= 0但没有任何效果。
非常感谢任何帮助!
For Each IDrow In wsInput.Range(IDcolLetter & "2:" & IDcolLetter & lastRow)
'Fourthly, get the respective row-number for each skill
IDrowNumber = Split(IDrow.Address, "$")(2)
'Fifthly, split the strings in 3 parts
Dim myElements() As String
myElements = Split(wsInput.Range(IDcolLetter & IDrowNumber).value, "\")
'Sixthly, for every skill of that supplier, copy the ID in A, CG in B, Category in C and Product in D
NextRow = ws4.Range("A" & Rows.Count).End(xlUp).row + 1
If Len(myElements(2)) = 0 Then <<<<<<<<<<<<<<<<<<<<<ERROR HERE<<<<<<<<<<<<<<<<<<<<<<<
wsInput.Range(IDcolLetter & "1").Copy Destination:=ws4.Range("A" & NextRow) 'ID
ws4.Range("B" & NextRow) = myElements(0) 'Commodity Group
ws4.Range("C" & NextRow) = myElements(1) 'Category
Else
wsInput.Range(IDcolLetter & "1").Copy Destination:=ws4.Range("A" & NextRow) 'ID
ws4.Range("B" & NextRow) = myElements(0) 'Commodity Group
ws4.Range("C" & NextRow) = myElements(1) 'Category
ws4.Range("D" & NextRow) = myElements(2) 'Product
End If
Next IDrow
答案 0 :(得分:3)
您可以使用UBound(myElements)
获取Split
后 myElements 数组中的元素数量。
将以下代码添加到现有代码中:
'Fifthly, split the strings in 3 parts
Dim myElements() As String
myElements = Split(wsInput.Range(IDcolLetter & IDrowNumber).Value, "\")
Dim arrCount As Long
' count the upper bound limit of myElements array
arrCount = UBound(myElements)
' if there is an Element 3 (from Split function)
If arrCount >= 2 Then
' add the rest of your code here...
End If
答案 1 :(得分:2)
这是一个代码审查,因为它是一个答案。
IDrow是一个范围对象。假设IDrow.Address = "A100"
则
Split(IDrow.Address, "$")(2) = 100
IDrow.Row = 100
这两个值也是相同的
wsInput.Range(IDcolLetter & IDrowNumber).value
IDrow.value
最好通过调整范围大小以匹配元素的数量来分配myElements的值。这更具可读性;因为它清理了大量重复的代码。
ws4.Range("B" & NextRow).Resize(1, UBound(myElements) + 1) = myElements
这两行都做同样的事情。我试图推广后来的模式,因为我感觉更清洁,更容易阅读。
For Each IDrow In wsInput.Range(IDcolLetter & "2:" & IDcolLetter & lastRow)
For Each IDrow In wsInput.Columns(IDcolLetter).Rows("2:" & lastRow)
Dim myElements() As String
With wsInput
For Each IDrow In wsInput.Columns(IDcolLetter).Rows("2:" & lastRow)
'Fifthly, split the strings in 3 parts
myElements = Split(IDrow.Value, "\")
'Sixthly, for every skill of that supplier, copy the ID in A, CG in B, Category in C and Product in D
NextRow = ws4.Range("A" & Rows.Count).End(xlUp).Row + 1
.Range(IDcolLetter & "1").Copy Destination:=ws4.Range("A" & NextRow)
ws4.Range("B" & NextRow).Resize(1, UBound(myElements) + 1) = myElements
Next IDrow
End With
答案 2 :(得分:1)
只需使用
ws4.Range("B" & NextRow).Resize(, UBound(myElements)).Value = myElements