剥离列或行以生成一维数组

时间:2017-04-30 12:46:08

标签: arrays vba for-loop indices

我想从2D数组创建一维数组而不使用仅一行代码进行循环,例如:

    @Test
    public void testMultiplication() {
        Money five = Money.dollar(5);
        //rest of the test case logic
    }

在MATLAB中将从“oldvec”的第3列创建一维数组“newvec”。我的搜索告诉我在VBA中执行此操作的唯一方法是循环。例如:

newvec = oldvec(:,3)

是否有内置构造用于剥离现有2D阵列的整个单一维度以构建新的1D阵列?

2 个答案:

答案 0 :(得分:5)

与大多数常见的编程语言不同,VBA中没有用于此目的的内置函数。但是,使用索引函数有一种解决方法:

Application.Index(MultidimArray, Row_Number, Column_Number)
  

要从源数组中提取列,应将“0”作为传递   row_number参数。同样,要从源数组中提取一行,   '0'应作为column_number参数传递。

因此,如果您想从“oldvec”的第3列创建一维数组“newvec”:

newvec = Application.Index(oldvec, 0, 3)

Here你可以找到更多。

修改

使用For loop比使用Index function快得多。所以你最好坚持使用for loop。有关详细信息,请参阅注释。

答案 1 :(得分:2)

然后再测试写入范围。

Tehscript的帖子是正确的。

在我的测试中,For循环比Index慢五倍,比写入一个范围快10倍,然后将第三列转储回一维数组。

Sub Test()
Dim X
Dim Y
Dim lngCNt As Long
Dim dbTimer As Double
X = [a1:c1000000].Value2

dbTimer = Timer()
'test 1
'Y = Application.Index(X, 0, 3)


'test 2
'ReDim Y(1 To UBound(X))
'For lngCNt = 1 To UBound(Y)
    'Y(lngCNt) = X(lngCNt, 3)
'Next

'test 3
[d1:f1000000].Value2 = X
Y = Application.Transpose([f1:f1000000])

Debug.Print Timer() - dbTimer
End Sub