2014-01-09 257 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:你能给我一个示例字符串,你想从中提取什么?你是否试图提取'[]'之间的内容? –