【发布时间】:2012-12-19 20:44:40
【问题描述】:
有没有什么方法可以将多维数组的整行的值返回到VBA中的一维数组?
类似于arr_1dim = arr_2dim(3,:) 是一个 matlab 表达式,用于将arr_2dim 数组的第 3 行一次性分配给arr_1dim。
Excel VBA中有没有类似的比较便宜的方法?
【问题讨论】:
标签: arrays excel vba multidimensional-array assign
有没有什么方法可以将多维数组的整行的值返回到VBA中的一维数组?
类似于arr_1dim = arr_2dim(3,:) 是一个 matlab 表达式,用于将arr_2dim 数组的第 3 行一次性分配给arr_1dim。
Excel VBA中有没有类似的比较便宜的方法?
【问题讨论】:
标签: arrays excel vba multidimensional-array assign
有一种简单的方法可以获取二维数组的一列或一行。为列分配零以获取行,或为行分配零以获取列,因此:
Application.WorksheetFunction.Index(array, 0, columnyouwant) /* or */
Application.WorksheetFunction.Index(array, rowyouwant, 0)
【讨论】:
不,没有用于获取行或列的 VBA 函数。只能自己写,或者看这里:
http://www.cpearson.com/excel/vbaarrays.htm
【讨论】:
GetRow(获取arr(0))/GetColumn(获取arr(1..n,0))
这就是我为轻松打印出多维数组的一维所做的工作。
基本上,我定义了一个新的一维数组,并用更大数组中的值填充它。
示例(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
我就是这样做的。我希望这对可能正在阅读它的人有意义。我认为这是一种非常简单的方法。
【讨论】:
Matlab 是一个非常棒的应用程序,可以在矩阵、数组、向量方面工作...... ;) 但是 Excel 并没有那么糟糕,它也是基于矩阵的。
所以假设你不想循环。您可以使用Transpose 函数将您的multi-D array 简单地输出到工作表中。
然后使用Transpose 将Row 拉到所需范围大小的数组中。
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))
要绝对动态,您可以使用多 D array row upperbound 动态行计数 resize 您的 range A2:G2 :)
【讨论】:
single row-multi column transpose 的二维数组。在这种情况下,您需要进行双重转置;)我可以给您代码,但我希望您在编写代码时玩得开心。请尝试并发表评论。如果您有更多问题,很乐意为您提供帮助。
由于我最近自己有这个问题,所以我想分享我的代码。我编写了一个即用型函数,您可以在其中选择是要提取列还是行:
'*** 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
【讨论】: