VBA中的数组切片,如何为整行赋值?
Posted
技术标签:
【中文标题】VBA中的数组切片,如何为整行赋值?【英文标题】:Array slicing in VBA, how can I assign a value to a whole row? 【发布时间】:2018-01-26 09:14:46 【问题描述】:我想计算一个数组,其中每一行都是前面行和某个矩阵的矩阵乘法。我知道VBA不能直接处理切片,所以我尝试了Excel函数index
如下:
Dim my_array()
my_array = Range("some.range")
For i = 2 to 100
Application.WorksheetFunction.Index(my_array, i, 0) = _
Application.WorksheetFunction.MMult( _
Application.WorksheetFunction.Index(my_array, i-1, 0), Range("some.matrix"))
Next i
但它没有用。所以我尝试了一些更简单的方法:
WorksheetFunction.index(my_array, 1, 0) = 1
但它也没有工作。我什至可以使用Index
切片为my_array
分配值吗?
【问题讨论】:
一句话,没有。您可以使用它来提取数据,但不能用于写入。 VBA 可以使用自定义函数处理切片。它不是内置的。 【参考方案1】:这是一些自定义切片函数,它获取要切片的数组的第一个和最后一个索引。查看 TestMe
函数中的 cmets 以了解它是如何被切片的。这就是它的作用:
Array(1, 2, 3, 4, 5, 67)
SliceMe arr, 1, 4
Array(2, 3, 4, 5)
一般情况下,fromIndex
和toIndex
可以设为可选值,以使函数更加健壮。
Sub SliceMe(myArr As Variant, fromIndex As Long, toIndex As Long)
Dim cnt As Long
Dim newArr As Variant
Dim realIndex As Variant
ReDim newArr(toIndex - fromIndex)
For cnt = fromIndex To toIndex
newArr(realIndex) = myArr(cnt)
realIndex = realIndex + 1
Next cnt
myArr = newArr
End Sub
Sub TestMe()
Dim arr As Variant
arr = Array(1, 2, 3, 4, 5, 67)
Debug.Print arr(0) '1
Debug.Print arr(UBound(arr)) '67
SliceMe arr, 1, 4
Debug.Print arr(0) '2
Debug.Print arr(UBound(arr)) '5
End Sub
【讨论】:
以上是关于VBA中的数组切片,如何为整行赋值?的主要内容,如果未能解决你的问题,请参考以下文章
如何为具有不同颜色的每一行绘制某个 DataFrame 的切片?