2014-01-09 253 views
2

我有這段代碼來消除denormlaized層次表中的所有異常。當我試圖用一百行記錄來運行這個宏時,大概200到300,它工作得很好。但是,當我嘗試使用大約18,000行的所有行運行宏時,它會返回「下標超出範圍」錯誤。我不確定代碼有什麼問題,因爲它似乎可以在數百行中正常工作。我正在使用MS Excel 2010版本。任何幫助將不勝感激,非常感謝。下標超出範圍VBA Excel數組

這是我的工作代碼:

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 

跟進我改寫了你的代碼。這是你正在嘗試的嗎?請注意,我沒有測試過,所以如果你有任何錯誤,請告訴我。我已經在相關部分上評論了代碼。

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,arr,「]」)然後 myar = Split(arr,「]」) End If' 這是正確的嗎? – user3175963

+0

不是。 :)讓我看看是否可以通過完整的示例更新上面的帖子 –

+0

@ user3175963:你能給我一個示例字符串,你想從中提取什麼?你是否試圖提取'[]'之間的內容? –