将单元格范围存储到数组

时间:2016-11-18 03:39:24

标签: arrays vba excel-vba excel

我正在使用数组而且我很抱歉,但我有点新鲜并且仍然感到困惑。我已经有了这个代码来将值存储在一个数组的范围内,如果我运行它,它就是空的。

attPresent = ws.Range("H4:H" & lastrow)
    ReDim attPresent(1 To UBound(attPresent))
    For k = LBound(attPresent) To UBound(attPresent)
        MsgBox attPresent(k)
    Next

有人可以告诉我哪里错了吗?我已阅读任何其他帖子并收集一些想法,但仍无效。

3 个答案:

答案 0 :(得分:3)

你可以这样

Dim attPresent as Variant
attPresent = ws.Range("H4:H" & lastrow).Value '<-- this will automatically size the array to a 2dimensional array of as many rows as the range ones and one column
For k = LBound(attPresent,1) To UBound(attPresent,1)
    MsgBox attPresent(k,1)
Next

或者

Dim attPresent as Variant
attPresent=Application.Transpose(Range("H4:H" & lastrow).Value) '<-- this will automatically size the array to a 1dimensional array of as many elements as the range
For k = LBound(attPresent) To UBound(attPresent)
    MsgBox attPresent(k)
Next

答案 1 :(得分:2)

参考MSDN: ReDim Statement (Visual Basic)

当您Redim数组时,您正在删除所有值。使用ReDim Preserve调整数组的最后一个维度,并保留数组的值。

在分配动态数组后(第一次使用Redim),您只能调整数组的最后一个维度,并且无法更改维数。在你的代码中,你试图将2维数组转换为1维数组,你不能这样做。

你应该看完这个完整的系列:Excel VBA Introduction。这是相关视频:Excel VBA Introduction Part 25 - Arrays

答案 2 :(得分:0)

    'Try this code example to suit your case
Sub StoreRangeofCellsToAnArray()
        'presumes optionbase=0
        'presume Range("a1:c3") contain number 1 to 9
        Dim MyRange, MyArray(9), n
        n = 0
        For Each c In Range("a1:c3")
        MyArray(n) = c
        n = n + 1
        Next

        'testing: reprint array
        For n = 0 To 8
        Debug.Print MyArray(n)
        Next
    End Sub