我想从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阵列?
答案 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