繁体   English   中英

从 Range 转换的数组上的“下标超出范围”

[英]“Subscript out of range” on array converted from Range

我在这些方面看到了很多问题/答案,但是在阅读了一堆之后,我仍然感到困惑。 很抱歉,如果这是 nᵗʰ 次询问此变体。

我无法弄清楚为什么此代码在 VBA(Excel for Mac v16.38)中出现“下标超出范围”错误而在第 5 行死掉:

Public Function array_test()
    Dim arr As Variant
    Dim array_slice As Variant
    arr = Range("TestData!B27:F32").Value2
    array_slice = arr(2)  'dies here with error 9
    array_test = array_slice
End Function

查看值窗格,arr 显然是具有所有预期数据的 Variant/Variant(1 到 6, 1 到 5)。 单元格没有什么特别之处,只是非公式数据。

即使我将声明更改为 arr() 和 array_slice() 或删除“.Value2”,我也会得到相同的结果。 即使尝试 Application.WorksheetFunction.Index(arr, 2) 而不是 arr(2) 也让我无处可去。

我错过了什么?

PS我通常是C / Python程序员,所以我在考虑arrays。

通常人们会为它的元素循环一个二维数组,但是,由于你特别提到你想通过 VBA 将它切片,你可以使用Application.Index 例如尝试:

array_slice = Application.Index(arr, 2, 0) 'Slice 2nd row into 1D-array.

这里的想法是向Application.Index提供一个 static '2' 代表感兴趣的行。 以同样的方式,您可以对感兴趣的特定列进行切片,但如果您需要将其作为一维数组,则需要使用Application.Transpose ,但是此方法有一些限制:

With Application
    array_slice = .Transpose(.Index(arr, 0, 2)) 'Slice 2nd column into 1D-array.
End With

当您从 Range 复制数据并且 Range 包含多个单元格时,无论如何都会得到 n 个二维数组(即使您只有一行或一列)。

要访问该数组中的单个值,您必须提供两个索引,例如arr(2, 1) 但是,如果您想获得一个包含(第一个索引)或(第二个索引)的所有值的维数组,您需要自己创建该数组 - VBA 中没有slice function。 您可以在运行时使用ReDim -命令对数组进行标注:

Dim array_slice(), i As Long
ReDim array_slice(LBound(arr, 1) To UBound(arr, 1))
For i = LBound(arr, 1) To UBound(arr, 1)
    array_slice(i) = arr(i, 2)
Next i

要获取列的值,请使用

Dim array_slice(), i As Long
ReDim array_slice(LBound(arr, 2) To UBound(arr, 2))
For i = LBound(arr, 2) To UBound(arr, 2)
    array_slice(i) = arr(2, i)
Next i

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM