首页 > 解决方案 > 将范围转换为数组

问题描述

我知道很多关于这个主题的线程已经存在,但我仍然找不到在这种情况下有效的解决方案。以下两个潜艇不断给我一个“下标超出范围”错误。

Sub test1()
    Dim Arr() As Variant
    Arr= Range("A1:A10")

    MsgBox Arr(0)

End Sub

Sub test1()
    Dim Arr As Variant
    Arr= Range("A1:A10").Value

    MsgBox Arr(0)

End Sub

标签: excelvba

解决方案


为清楚起见,根据以下评论进行编辑。

将范围的值分配给 Variant 变量将导致变量包含按行和列(按此顺序)索引的基于 1 的 Variants 二维数组,或者如果它是 1 单元格范围,则包含范围的实际值。

在您的特定情况下,这将起作用:

Sub test1()
    Dim Arr As Variant
    Dim row As Long
    Dim col As Long

    row = 1
    col = 1

    Arr = Range("A1:A10").Value

    MsgBox Arr(row, col)
End Sub

在更一般的方法中,如果您的下游代码希望处理一个数组,但您的范围有可能覆盖单个单元格,即使在这种情况下,您也可以强制使用数组,沿着这些思路:

Sub test2()
    Dim rng As Range
    Dim Arr As Variant
    Dim row As Integer
    Dim col As Integer

    row = 1
    col = 1

    Set rng = Range("A1:A1") '<== 1 cell only!

    Arr = rng.Value

    'Ensure we're dealing with an array even in this case.
    If Not IsArray(Arr) Then
        ReDim Arr(1 To 1, 1 To 1) As Variant
        Arr(1, 1) = rng.Value
    End If

    MsgBox Arr(row, col)
End Sub

推荐阅读