#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. Ваш ответ сделал свое дело. Спасибо! Все, что мне нужно было сделать, это переключить > на <=