В настоящее время я разделяю строки, содержащие 3 элемента (a / b / c) из рабочего листа 1, и вставляю каждую часть на листе 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
3 ответа
Это как обзор кода, так и ответ.
- Лучше всего объявить все свои переменные в начале процедуры.
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
Вы можете использовать UBound(myElements)
, чтобы получить количество элементов в массиве myElements после Split
.
Добавьте следующий код к существующему коду:
'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
Просто используйте
ws4.Range("B" & NextRow).Resize(, UBound(myElements)).Value = myElements
Похожие вопросы
Новые вопросы
string
Строка - это конечная последовательность символов, обычно используемая для текста, хотя иногда для произвольных данных.