2016-10-06 16 views
0

我正在使用必須拆分的列中的單元格。字符串的元素1應該與相同字符串的元素2分開發布,每個元素都在另一個Worksheet上。當檢查字符串是否有兩部分時,VBA運行時錯誤9

字符串「123 ABC」 - >在列d C列和「ABC」,「123」

我正在運行到運行時,錯誤9「索引超出範圍」,如果小區中的一個我檢查只包含「123」或「ABC」,但沒有兩個部分。

我試着按照你在下面的代碼中看到的方式解決它。不用說這不起作用。

更有經驗的Excel-Gurus能幫我一個嗎? 預先感謝您的時間!

enter image description here

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" & Rows.Count).End(xlUp).Row 
wsOutput.Range("A2:G" & 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" & Rows.Count).End(xlUp).Row 

'Get all Information 
For Each Lieferant In wsInput.Columns(1).Rows("2:" & 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" & 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:" & lRowInput).Copy Destination:=wsOutput.Columns(1).Rows("2:" & lRowInput) 'Task Namen 
       wsInput.Columns(2).Rows("2:" & lRowInput).Copy Destination:=wsOutput.Columns(2).Rows("2:" & 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:" & lRowInput).Copy Destination:=wsOutput.Columns(5).Rows("2:" & lRowInput) 'Fehlerarten 

      Else 'Get all wrong inputs on separate Sheet 
       lRowMistakes = wsMistakes.Range("A" & 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" & 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 
+0

使用InStr函數來檢查,如果兩個值都在字符串中然後做分割,如果都返回一個值> 0 – Sorceri

+0

但是,這兩個值是字符串的元素,如果一個超出索引範圍,但它會給我一個錯誤。或者當我嘗試你所說的話時,至少它是這樣做的。你能給一個代碼示例嗎? – InternInNeed

回答

1

此行不會做你覺得它在做什麼:

If IsEmpty(myElements(1)) = True 

首先,指定限制爲Split功能並不意味着你總能得到很多數組中的元素。其次,IsEmpty測試以查看Variant是否爲VT_EMPTY類型,而不是String是否具有值(Split返回強類型數組)。

只是測試UBound代替:

If UBound(myElements) > 0 Then 
+0

你的答案伎倆。謝謝!我需要做的就是將>切換到<= – InternInNeed