使用可见单元格行填充动态数组

时间:2017-09-04 08:12:40

标签: excel excel-vba vba

我收到错误的"下标超出范围"当我试图将可见单元格的行值(减去标题)添加到数组时。代码下方:

Dim Rng As Range
Dim r As Range
Dim i as Long
Dim arr() As Long

        Set Rng = ActiveSheet.UsedRange.Resize(ActiveSheet.UsedRange.Rows.Count - 1, ActiveSheet.UsedRange.Columns.Count).Offset(1, 0).SpecialCells(xlCellTypeVisible)

        i = 0
        For Each r In Rng.Rows
            'Debug.Print r.Row
            arr(i) = r.Row
            i = i + 1
        Next

我忘记了什么吗?我还是VBA的新手,对阵列来说更是如此。

3 个答案:

答案 0 :(得分:1)

问题在于,虽然你声明了数组,但你还没有用大小初始化它,所以数组中没有元素,因此下标超出了范围。

您的代码应该阅读,请注意您将遇到的另一个问题是如何解决该范围,我已在下面更正:

    Dim Rng As Range, r As Range
    Dim i as integer
    Dim ary() as Long

    Set Rng = ActiveSheet.UsedRange.Resize(ActiveSheet.UsedRange.Rows.Count - 1, ActiveSheet.UsedRange.Columns.Count).Offset(1, 0).SpecialCells(xlCellTypeVisible)
    Redim ary(Rng.Rows.Count)
    i = 0
    For Each r In Rng.Rows
        'Debug.Print r.Row
        arr(i) = CLng(r.Row)
        i = i + 1
    Next

这是一个经过测试和运作的例子

答案 1 :(得分:1)

正如已经指出的那样,你必须定义数组。您可以在定义它时给它一个固定的大小(Dim arr(2) as Integer)。

可以使用ReDim制作动态范围。使用Preserve时,它会在重新定义大小时保存数组中的值。 (注意:您只能ReDim数组的最后一个维度

答案 2 :(得分:1)

这个功能很好......

Input Sheet

Output from this code

我没有得到你如何计算范围......但是这个输出只是在范围之外..数组是完全动态的

Sub foo()


Dim Rng As Range
Dim r As Range
Dim i As Long
Dim arr() As Variant

        Set Rng = ActiveSheet.UsedRange.Resize(ActiveSheet.UsedRange.Rows.Count - 1, ActiveSheet.UsedRange.Columns.Count).Offset(1, 0).SpecialCells(xlCellTypeVisible)

        i = 1
        For Each r In Rng.Rows
            ReDim Preserve arr(i)
            arr(i) = r.Row
            Debug.Print arr(i)
            i = i + 1
        Next



End Sub