2014-01-09 8 views
2

У меня есть этот код, чтобы устранить все аномалии в таблице иерархической таблицы denormlaized. Когда я пытаюсь запустить этот макрос со сто строк записей, может быть, от 200 до 300, он работает нормально. Но когда я пытаюсь запустить макрос со всеми моими строками, который составляет около 18 000 строк, он возвращает ошибку «Subscript out the range». Я не уверен, что не так с кодом, потому что кажется, что он отлично работает с сотнями строк. Я использую версию MS Excel 2010. Любая помощь будет оценена, спасибо вам большое.Подкатегория вне диапазона VBA Excel array

Вот мой рабочий код:

Option Explicit 

Sub EliminateAnomaliesDH() 
Sheets("Denorm Hier").Select 
Range("A1").Select 
Dim iCtr As Integer 
Dim arr As Variant 

iCtr = 2 

While Range("B" & iCtr).Value <> "" 
arr = Split(Range("B" & iCtr).Value, "[") 
arr = Split(arr(1), "]") 

Select Case arr(0) 
    Case "L1" 
     Range("F" & iCtr & ":AB" & iCtr & "").Value = "" 
    Case "L2" 
     Range("H" & iCtr & ":AB" & iCtr & "").Value = "" 
    Case "L3" 
     Range("J" & iCtr & ":AB" & iCtr & "").Value = "" 
    Case "L4" 
     Range("L" & iCtr & ":AB" & iCtr & "").Value = "" 
    Case "L5" 
     Range("N" & iCtr & ":AB" & iCtr & "").Value = "" 
    Case "L6" 
     Range("P" & iCtr & ":AB" & iCtr & "").Value = "" 
    Case "L7" 
     Range("R" & iCtr & ":AB" & iCtr & "").Value = "" 
    Case "L8" 
     Range("T" & iCtr & ":AB" & iCtr & "").Value = "" 
    Case "L9" 
     Range("V" & iCtr & ":AB" & iCtr & "").Value = "" 
    Case "L10" 
     Range("X" & iCtr & ":AB" & iCtr & "").Value = "" 
    Case "L11" 
     Range("Z" & iCtr & ":AB" & iCtr & "").Value = "" 
    Case "L12" 
     Range("AB" & iCtr & ":AB" & iCtr & "").Value = "" 
End Select 

iCtr = iCtr + 1 
Wend 

Sheets("Instructions").Select 
MsgBox "Successfully removed all anomalies of the Denormalized hierarchy Table" 
End Sub 
+0

Проверьте, есть ли у вас лист «Denorm Hier» в нужном месте/в другом месте. –

+0

@Charles_Stevens да это – user3175963

ответ

1

Даже если вы не упомянули линию, где вы получаете сообщение об ошибке, это совершенно очевидно. Вероятно, ошибка указана в строке

arr = Split(arr(1), "]") 

И причина очень проста. Потому что у ячейки нет «[», поэтому после разделения нет ar(1).

Вот очень простой способ воспроизвести ошибку.

Sub sample() 
    Dim sString As String 
    Dim myar 

    sString = "Blah Blah" 

    myar = Split(sString, "]") 

    myar = Split(myar(1), "[") '<~~ Error here 

    Debug.Print myar(0) 
End Sub 

Чтобы убедиться, что вы не получите сообщение об ошибке, используйте INSTR(), чтобы проверить, если [ или ] существует, а затем разделить его.

Например

If InStr(1, sString, "]") Then 
     myar = Split(sString, "]") 
    End If 

Followup от комментариев

я переписал свой код. Это то, что вы пытаетесь? Обратите внимание, что я не тестировал его, поэтому дайте мне знать, если вы получите какие-либо ошибки. Я также прокомментировал код в соответствующих частях.

Sub EliminateAnomaliesDH() 
    Dim ws As Worksheet 
    Dim lRow As Long, i As Long 
    Dim tempString As String, sString As String 

    Set ws = ThisWorkbook.Sheets("Denorm Hier") 

    With ws 
     '~~> Get the last row which has data in Col B 
     lRow = .Range("B" & .Rows.Count).End(xlUp).Row 

     '~~> Loop through cells in column B 
     For i = 2 To lRow 
      sString = .Range("B" & i).Value 

      '~~> Check if the cell has both "[" and "]" 
      If InStr(1, sString, "[") And InStr(1, sString, "]") Then 
       tempString = Split(.Range("B" & i).Value, "[")(1) 
       tempString = Split(tempString, "]")(0) 

       '~~> This required so that we do an exact match 
       '~~> For example, " l1", " l1 ", " L1" etc 
       '~~> becomes "L1" 
       tempString = UCase(Trim(tempString)) 

       Select Case tempString 
        Case "L1": .Range("F" & i & ":AB" & i & "").ClearContents 
        Case "L2": .Range("H" & i & ":AB" & i & "").ClearContents 
        Case "L3": .Range("J" & i & ":AB" & i & "").ClearContents 
        Case "L4": .Range("L" & i & ":AB" & i & "").ClearContents 
        Case "L5": .Range("N" & i & ":AB" & i & "").ClearContents 
        Case "L6": .Range("P" & i & ":AB" & i & "").ClearContents 
        Case "L7": .Range("R" & i & ":AB" & i & "").ClearContents 
        Case "L8": .Range("T" & i & ":AB" & i & "").ClearContents 
        Case "L9": .Range("V" & i & ":AB" & i & "").ClearContents 
        Case "L10": .Range("X" & i & ":AB" & i & "").ClearContents 
        Case "L11": .Range("Z" & i & ":AB" & i & "").ClearContents 
        Case "L12": .Range("AB" & i & ":AB" & i & "").ClearContents 
       End Select 
      End If 
     Next i 
    End With 
    MsgBox "Successfully removed all anomalies of the Denormalized hierarchy Table" 
End Sub 
+0

'Если InStr (1, обр, "]") Тогда myar = Split (обр, "]") End If' Правильно ли это? – user3175963

+0

№ Не совсем. :) Позвольте мне посмотреть, могу ли я обновить вышеприведенную запись с полным примером –

+0

@ user3175963: Можете ли вы дать мне примерную строку и что вы пытаетесь извлечь из нее? Вы пытаетесь извлечь то, что находится между '[]'? –

Смежные вопросы