[英]“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.