【问题标题】:Subscript out of range VBA Excel array下标超出范围 VBA Excel 数组
【发布时间】:2014-01-27 13:48:34
【问题描述】:

我有这段代码来消除去规范化层次结构表中的所有异常。当我尝试用一​​百行记录运行这个宏时,可能大约 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

【问题讨论】:

  • 检查您是否在正确的位置/位置放置了“Denorm Hier”表。
  • @Charles_Stevens 是的

标签: arrays excel vba


【解决方案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

来自 cmets 的跟进

我重写了你的代码。这是你正在尝试的吗?请注意,我尚未对其进行测试,因此如果您遇到任何错误,请告诉我。我也对相关部分的代码进行了注释。

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

【讨论】:

  • If InStr(1, arr, "]") Then myar = Split(arr, "]") End If 正确吗?
  • 没有。不完全是。 :) 让我看看我是否可以用一个完整的例子来更新上面的帖子
  • @user3175963:你能给我一个示例字符串吗?你想从中提取什么?您是否要提取 [] 之间的内容?
  • 实际上我正在尝试从 Denorm Hier 表中提取。从 A 到 AB 的列
  • @user3175963:是的,我知道了,但是你从单元格中提取了什么?类似于来自Blah Blah [L1] Blah Blah的“L1”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多