22

有没有办法将多维数组的整行的值返回到VBA中的一维数组?

类似的, 是一个 matlab 表达式,用于将数组arr_1dim = arr_2dim(3,:)的第 3 行分配给一个单一的拉伸。arr_2dimarr_1dim

Excel VBA中是否有类似的更便宜的方法?

4

5 回答 5

30

有一种简单的方法可以获取二维数组的一列或一行。将零分配给列以获取行,或将零分配给行以获取列,因此:

Application.WorksheetFunction.Index(array, 0, columnyouwant) /* or */
Application.WorksheetFunction.Index(array, rowyouwant, 0)

请参见此处: 如何在 Excel VBA 中对数组进行切片?

于 2016-05-27T15:15:09.927 回答
14

不,没有用于获取行或列的 VBA 函数。只能自己写,或者看这里:
http ://www.cpearson.com/excel/vbaarrays.htm

于 2013-01-05T17:12:47.480 回答
4

这就是我为轻松打印出多维数组的一维所做的工作。

基本上,我定义了一个新的一维数组,并用更大数组中的值填充它。

示例(3D 到 1D 到打印输出):

Sub PrintItOut()
     ReDim big_array(10,5,n) as Variant, small_array(n) as Variant

     'use multidimensional array


     'place multi-dimensional values into the 1D array

     For i = 0 to n
            small_array(i) = big_array(0, 0, i)
     Next

     Range(Cells(1, 1), Cells(1, n + 1)) = small_array
End Sub

我就是这样做的。我希望这对可能正在阅读它的人有意义。我认为这是一种非常简单的方法。

于 2013-07-20T18:15:04.140 回答
1

当涉及到矩阵、数组、向量时,Matlab 是一个非常棒的应用程序...... ;) 但是 Excel 并没有那么糟糕,它也是基于矩阵的。

所以假设你不想循环。您可以简单地multi-D array使用Transpose函数将您的输入到工作表中。

然后使用 将 a 拉到Row所需范围大小的数组中Transpose

Dim vArr as Variant

'--output multi-D array into worksheet
Sheets(2).Range("E2").Resize(UBound(multiDArray) + 1, _
UBound(Application.Transpose(multiDArray))) = multiDArray

'--pull back the row you need: we double transpose here to get 1D. Coz single transpose
'-- results in 2D array..
vArr = WorksheetFunctions.Transpose( _ 
       WorksheetFunctions.Transpose(Sheets(1).Range("A2:G2").Value)) 

要绝对动态,您可以resize使用range A2:G2multi-D 动态行数array row upperbound:)

于 2013-01-05T19:16:05.503 回答
0

由于我最近自己有这个问题,所以我想分享我的代码。我编写了一个即用型函数,您可以在其中选择要提取列还是行:

'*** Modul 1, define function ***

Function getOneLine(array2D As Variant, lineIndex As Integer, choice As String) As Variant
' returning one column or row of a 2D array
' array2D: 2 dimensional Array
' lineIndex: the index of column or row, starting at 0
' choice: "c" for column or "r" for row

    Dim i, n As Integer
    Dim oneLine As Variant


    If choice = "c" Then

    n = UBound(array2D, 2)
    ReDim oneLine(n)

        For i = 0 To n
            oneLine(i) = array2D(lineIndex, i)
        Next

    getOneLine = oneLine

    End If


    If choice = "r" Then

    n = UBound(array2D, 1)
    ReDim oneLine(n)

        For i = 0 To n
            oneLine(i) = array2D(i, lineIndex)
        Next

    getOneLine = oneLine

    End If

End Function


'*** Modul 2, call function ***

Sub SomeProcess()
    ' Creating a 3x2 Matrix
    ' (In VBA-arrays the column is indexed before the rows
    '  starting at 0. So 3x2 looks like 1x2)
    Dim SomeArray(1, 2) As Variant
        SomeArray(0, 0) = 1
        SomeArray(0, 1) = 2
        SomeArray(0, 2) = 3
        SomeArray(1, 0) = 4
        SomeArray(1, 1) = 5
        SomeArray(1, 2) = 6

    Dim oneLine As Variant
        oneLine = getOneLine(SomeArray, 1, "c")

    Debug.Print oneLine(2)
        ' prints 6

End Sub
于 2017-04-15T18:02:13.027 回答