填充阵列一旦工作,就不再了(下标超出范围)

时间:2012-12-06 14:53:31

标签: excel-vba vba excel

我曾经用于添加/删除行组(需求)的代码。我需要修改代码,以便如果组的第一行符合某些标准(即,要求不是我们想要考虑的那个),(1)我们不会计算它和(2),我们会隐藏组(当前和后续2行)。一切正常。

问题在于,现在我将这些更改合并,我在代码的另一部分出现错误,而对于我的生活,我无法弄清楚原因。我已经介入了这个并且非常沮丧。我正在寻求帮助,希望有人能看到我的错误(!)

我们计算分组中的开始和结束行数,并将这些计算存储在名为“Start”和“Finish”的数组中。我使用ReDim语句初始化我的数组,因为我认为这可能是问题的一部分,但没有。

任何关于为什么我的“下标超出范围”的见解将不胜感激。我已经跟踪了逻辑,调查了这个错误,并阅读了有关VBA数组的语法/用法。我不知道还能做什么。提前致谢。以下是相关部分:

Sub Button1_Click()
    Cells.Select
    Selection.ClearOutline
    If Cells.EntireRow.Hidden Then Cells.EntireRow.Hidden = False
    Dim Start() As Integer
    Dim Finish() As Integer
    Dim p As Integer, q As Integer
    ReDim Start(0, 50)
    ReDim Finish(0, 50)

以下内容嵌入在循环遍历电子表格中所有行的逻辑中:

i = 1

    For Row = 4 To Cells(1, 6).Value - 1
        If Begin Then
            If Cells(Row, 3).Interior.ColorIndex = 44 Then
                Start(i) = Row + 1
                j = Cells(Row, 2).Value
                Begin = False
            End If
        Else
            If Cells(Row, 2).Value = j + 1 Or Cells(Row, 2).Interior.ColorIndex = 37 Then
                Finish(i) = Row - 1
                Begin = True
                i = i + 1
                Row = Row - 1
            End If
        End If
    Next

我更改的块如下(我添加的代码是我尝试隐藏行的最后一个块)。它先于前一个。我想知道我的改变会如何影响上述(?!)

   If Cells(Row, 5).Value = "Requirement" Then
        Range(Cells(Row, 4), Cells(Row, 4)).Interior.ColorIndex = 40
        Rows(Row).Font.Bold = True
        Rows(Row).Font.Italic = False
        Rows(Row).Font.ColorIndex = 1 'Black
        If Cells(Row - 3, 4).Value = "" Then 'this is requirement #1
            Cells(Row, 4).Value = 1
            Else
            Cells(Row, 4).Value = Cells(Row - 3, 4).Value + 1
        End If

        p = Row
        q = p + 2
        Rows(p & ":" & q).Select
        If Cells(p, 19).Value = "4" Then
           Selection.EntireRow.Hidden = True
        Else
           Selection.EntireRow.Hidden = False
        End If

1 个答案:

答案 0 :(得分:0)

Redim Start(0,50)生成数组维0 to 0, 0 to 50,即2d数组。

这意味着当您调用数组时,您需要为两个维度提供参数I.E:Start(0,i)Finish(0,i)。调用Start(i)会导致您提到的错误。

摆脱错误的最简单方法是将Redim行更改为

ReDim Start(50)
ReDim Finish(50)

这是我假设你首先要做的事情。

注意:根据您使用的格式,您最初可能需要Start(0 to 50)Finish(0 to 50)。尺寸标注中的逗号表示另一个维度,而不是下限和上限之间的分隔。