В настоящее время я разделяю строки, содержащие 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
0
InternInNeed 8 Сен 2016 в 09:12

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
2
14 Сен 2016 в 09:36

Вы можете использовать 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
3
Shai Rado 8 Сен 2016 в 06:29

Просто используйте

ws4.Range("B" & NextRow).Resize(, UBound(myElements)).Value = myElements
1
user3598756 8 Сен 2016 в 06:34