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)

一般情况下,fromIndextoIndex 可以设为可选值,以使函数更加健壮。

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中的数组切片,如何为整行赋值?的主要内容,如果未能解决你的问题,请参考以下文章

OCaml 数组切片?

如何为具有不同颜色的每一行绘制某个 DataFrame 的切片?

vba中怎么选取二维数组中的某一行或某一列?

是否有类似于 Vector 和其他语言的 Haskell Repa 切片函数的使用?

numpy数组的索引和切片

给数组赋值时,引用与数组切片的区别