2017-10-05 158 views
0

我写了波纹管代码,它在即时窗口中打印210将范围的值分配给数组

Sub RangeToArr() 
    Dim data() As Variant 
    data = Range("Salary[EmpNum]").Value 
    Debug.Print UBound(data) 
End Sub 

当我使用波纹管时,将显示Subscript out of range运行时错误消息。

Sub RangeToArr() 
    Dim data() As Variant 
    data = Range("Salary[EmpNum]").Value 
    Debug.Print data(210) 
End Sub 

如果data是一个数组,这是什么问题,否则,如何可以访问分配到一个数组范围的值,如上面?

+0

还用断点检查局部窗口中的数据范围,它只是一个维度吗?即使列数据的范围可以是(1到210,1到1)。再看看这个,假设你想要数据来表示范围,从赋值行中删除'.Value'部分。 – Zerk

+0

超出范围,是过滤表格范围的列。范围是6到215 – mgae2m

+0

什么是薪水[EmpNum]? – Vityata

回答

2

如果您尝试返回数据(210),则将其引用为单维数组,则转换为数组的范围将创建2维数组。您可以通过返回

data(210, 1) 

我只能假设,为什么它迫使一个2维数组的原因得到该范围内的第210单元格的值。我的猜测是因为如果你的范围包括额外的列它将是2维数组。即使您只有一列,创建2维数组的行为也意味着处理数据的方法保持不变。这是一个例外 - 如果您的范围是单个单元格,VBA将仅将该值填充为单个维度。

+0

如果Salary [EmpNum]是单列,则数组大小应该是数据(1到210,1)。我不介意纠正我的答案,如果它是错误的,但我需要了解我的假设中有什么错,所以我可以相应地更新。 – Dave

1

为确保您的示例有效,请确保您的表格示例中有210行。


在一般情况下,尝试这样的事情来获得阵列和范围的想法:

  • 木箱与多列和多行
  • 把一个简单的命名范围MyNamedRange在它的一些价值观
  • 运行这个,看看你在即时窗口中得到什么:

Sub RangeToArr() 

    Dim arrVar As Variant 
    arrVar = Range("MyNamedRange") 
    Debug.Print arrVar(1, 2) 

End Sub 

更改(1,2)值有点想法。