arrays - 下标超出范围 VBA Excel 数组

标签 arrays excel vba

我有这段代码来消除去规范化层次结构表中的所有异常。当我尝试用一​​百行记录运行这个宏时,可能大约 200 到 300 行,它工作得很好。但是,当我尝试使用所有行(大约 18,000 行)运行宏时,它会返回“下标超出范围”错误。我不确定代码有什么问题,因为它似乎可以正常处理数百行。我正在使用 MS Excel 2010 版本。任何帮助将不胜感激,非常感谢。

这是我的工作代码:

    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

最佳答案

即使你没有提到你得到错误的那一行,它也很明显。错误很可能在线

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

关于arrays - 下标超出范围 VBA Excel 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21012962/

相关文章:

php - 如何在 PHP 中从字符串数组创建对象

javascript - Javascript 中的 Excel ROUND 函数

vb.net - 无法将公式分配给 Excel 中的单元格区域

excel - 如何将事件添加到 Excel VBA 用户窗体中动态创建的控件(按钮、列表框)

sql - 双重嵌套 array_agg(row_to_json())

python - 垂直连接两个 NumPy 数组

excel - 多列Excel范围中的最长列(在单个公式中)?

vba - 如何列出给定文件夹的所有文件(通过子文件夹递归)?

vba - Excel VBA获取真实的文件夹路径长度(不包括波浪号)

c++ - 如何确保数组中没有其他内容