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

Excel 用可见单元格的行填充动态数组,excel,vba,Excel,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).Spe

当我试图向数组中添加可见单元格(减去标题)的行值时,出现了“下标超出范围”的错误。代码如下:

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还是新手,对数组更是如此。

问题是,尽管您正在声明数组,但尚未使用大小对其进行初始化,因此数组中没有元素,因此下标超出了范围

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

    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

这是一个经过测试的工作示例

问题在于,尽管您正在声明数组,但尚未使用大小对其进行初始化,因此数组中没有元素,因此下标超出了范围

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

    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

这是一个经过测试的工作示例

如前所述,您必须定义数组。您可以在定义它时给它一个固定的大小(
Dim arr(2)为整数)


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

如前所述,您必须定义数组。您可以在定义它时给它一个固定的大小(
Dim arr(2)为整数)


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

此函数工作正常

我不知道你是怎么计算射程的。。。但是这个输出只是超出了范围。。数组是完全动态的

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

此函数工作正常

我不知道你是怎么计算射程的。。。但是这个输出只是超出了范围。。数组是完全动态的

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

您必须初始化数组。如果没有它,引用任何元素都会出现此错误。您必须初始化数组。如果没有它,引用任何元素都会出现此错误。我尝试使用
ReDim
作为
ReDim-arr(1到(ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible.Count/ActiveSheet.AutoFilter.Range.Columns.Count-1))
但我收到了相同的错误。您的索引
I
0
开始,数组的定义范围是从
1到…
我尝试使用
ReDim
作为
ReDim-arr(1到(ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible.Count/ActiveSheet.AutoFilter.Range.Columns.Count-1))
但是我收到了相同的错误。您的索引
I
0开始,数组的定义范围是从
1到…
我尝试使用
Dim arr(Rng.Rows)作为Long
,但我遇到另一个错误:“需要常量表达式”重新发布代码,如果添加新的内容,则说明您做错了什么。我尝试使用
Dim arr(Rng.Rows)作为Long
,但我遇到另一个错误:“需要常量表达式”重新发布您的代码,使用新添加的代码,您正在做一些错误的事情。是的,它与
ReDim Preserve arr(i)
中正常工作,用于。。。下一步
。非常感谢。为了回答您关于如何计算范围的问题,我将使用
UsedRange
并在可见单元格上调整其大小(
SpecialCells(xlCellTypeVisible)
)。我在互联网上的另一篇帖子上找到了这段代码,内容是关于可见单元格的选择。很高兴能提供帮助:)是的,它可以与
中的
ReDim PREVICE arr(I)
配合使用。。。下一步
。非常感谢。为了回答您关于如何计算范围的问题,我将使用
UsedRange
并在可见单元格上调整其大小(
SpecialCells(xlCellTypeVisible)
)。我在互联网上的另一篇帖子上找到了这段代码,内容是关于可见单元格的选择。很高兴为您提供帮助:)