Ошибка времени выполнения VBA 9 при проверке, состоит ли строка из двух частей

#string #vba #split #runtime-error

#строка #vba #сплит #время выполнения-ошибка #разделение

Вопрос:

Я работаю с ячейками в столбце, которые должны быть разделены. Предполагается, что элемент 1 строки должен быть размещен отдельно от элемента 2 той же строки, каждый на другом листе.

Строка «123 ABC» -> «123» в столбце C и «ABC» в столбце D

Я сталкиваюсь с ошибкой времени выполнения 9 «Индекс вне диапазона», если одна из ячеек, которые я проверяю, содержит только «123» или «ABC», но не обе части.

Я попытался обойти это так, как вы видите в моем коде ниже. Излишне говорить, что это не работает.

Может ли кто-нибудь из более опытных Excel-гуру помочь мне здесь? Заранее благодарим вас за ваше время!

введите описание изображения здесь

 Application.ScreenUpdating = False

Dim wbInput As Workbook, wbOutput As Workbook
Set wbOutput = ActiveWorkbook
Dim wsInput As Worksheet, wsOutput As Worksheet, wsMistakes As Worksheet
Set wsOutput = wbOutput.Worksheets("FehlerVorkommen")
Set wsMistakes = wbOutput.Worksheets("NichtZuweisbar")
Dim lRowInput As Long, lRowOutput As Long, lRowMistakes As Long
Dim Lieferant As Range
Dim InputFile As String, myElements() As String

lRowOutput = wsOutput.Range("A" amp; Rows.Count).End(xlUp).Row
wsOutput.Range("A2:G" amp; lRowOutput).Clear
wsMistakes.Range("A2:G500").Clear

InputFile = Application.GetOpenFilename()

If InputFile = "Falsch" Then
    Exit Sub
End If

Set wbInput = Workbooks.Open(InputFile)
Set wsInput = wbInput.Worksheets("owssvr")
lRowInput = wsInput.Range("A" amp; Rows.Count).End(xlUp).Row

'Get all Information
For Each Lieferant In wsInput.Columns(1).Rows("2:" amp; lRowInput)

    If wsInput.Columns(3).Rows(Lieferant.Row) <> vbNullString Then

        myElements = Split(wsInput.Columns(3).Rows(Lieferant.Row).Value, " ", 2) 'A maximum of 2 String-Parts to avoid 4-5 splits whenever there is a GmbH or AG or whatever

        If IsEmpty(myElements(1)) = True Then <<<<<<<<<ERROR HERE<<<<<<<<<<<
            lRowMistakes = wsMistakes.Range("A" amp; Rows.Count).End(xlUp).Row
            NextRow = lRowMistakes   1
            wsInput.Columns(1).Rows(Lieferant.Row).Copy Destination:=wsMistakes.Columns(1).Rows(NextRow)
            NextRow = NextRow   1
        Else

            If IsNumeric(wsInput.Columns(1).Rows(Lieferant.Row)) = True And wsInput.Columns(1).Rows(Lieferant.Row) <> vbNullString _
            And IsNumeric(wsInput.Columns(2).Rows(Lieferant.Row)) = True And wsInput.Columns(2).Rows(Lieferant.Row) <> vbNullString Then

                wsInput.Columns(1).Rows("2:" amp; lRowInput).Copy Destination:=wsOutput.Columns(1).Rows("2:" amp; lRowInput) 'Task Namen
                wsInput.Columns(2).Rows("2:" amp; lRowInput).Copy Destination:=wsOutput.Columns(2).Rows("2:" amp; lRowInput) 'Bestellpositionen
                wsOutput.Columns(3).Rows(Lieferant.Row).Value = myElements(0) 'ID
                wsOutput.Columns(4).Rows(Lieferant.Row).Value = myElements(1) 'Name
                wsInput.Columns(3).Rows("2:" amp; lRowInput).Copy Destination:=wsOutput.Columns(5).Rows("2:" amp; lRowInput) 'Fehlerarten

            Else 'Get all wrong inputs on separate Sheet
                lRowMistakes = wsMistakes.Range("A" amp; Rows.Count).End(xlUp).Row
                NextRow = lRowMistakes   1
                wsInput.Columns(1).Rows(Lieferant.Row).Copy Destination:=wsMistakes.Columns(1).Rows(NextRow)
                NextRow = NextRow   1
            End If

        End If

    Else 'Get all wrong input on separate Sheet
        lRowMistakes = wsMistakes.Range("A" amp; Rows.Count).End(xlUp).Row
        NextRow = lRowMistakes   1
        wsInput.Columns(1).Rows(Lieferant.Row).Copy Destination:=wsMistakes.Columns(1).Rows(NextRow)
        NextRow = NextRow   1
    End If

Next Lieferant

wbInput.Close
  

Комментарии:

1. используйте функцию InStr, чтобы проверить, находятся ли оба значения в строке, затем выполните разделение, если оба возвращают значение> 0

2. Но оба значения являются элементами строки, и если одно из них находится вне диапазона индексов, это, тем не менее, выдаст мне ошибку. Или, по крайней мере, это произошло, когда я попробовал то, что ты сказал. Не могли бы вы привести пример кода?

Ответ №1:

Эта строка не делает того, что вы думаете, что она делает:

 If IsEmpty(myElements(1)) = True
  

Во-первых, указание ограничения для Split функции не означает, что вы всегда получаете столько элементов в массиве. Во-вторых, IsEmpty проверяет, имеет ли a Variant тип VT_EMPTY, а не String имеет ли a значение ( Split возвращает строго типизированный массив).

Просто протестируйте UBound вместо этого:

 If UBound(myElements) > 0 Then
  

Комментарии:

1. Ваш ответ сделал свое дело. Спасибо! Все, что мне нужно было сделать, это переключить > на <=