Arrays 将不同的范围放入2D数组
我正在尝试填充大小为Arrays 将不同的范围放入2D数组,arrays,vba,excel,Arrays,Vba,Excel,我正在尝试填充大小为[x][3]的2D数组X只是表格的大小(行数),有3列我感兴趣。各列不相邻,例如,arr[i][0]应从AA列填写,arr[i][1]应从K列填写,arr[i][2]需要从L列填写 我尝试按以下方式分配它,但在数组值分配中出错 在此方面的任何帮助都将不胜感激 代码: 有没有办法不在整个列中循环执行此操作?如注释中所述,您可以填充三个二维数组。然后可以从三个数组中填充第四个数组,如下所示 Sub populateArray() Dim arrColOne() As Va
[x][3]
的2D数组X
只是表格的大小(行数),有3列我感兴趣。各列不相邻,例如,arr[i][0]
应从AA列填写,arr[i][1]
应从K列填写,arr[i][2]
需要从L列填写
我尝试按以下方式分配它,但在数组值分配中出错
在此方面的任何帮助都将不胜感激
代码:
有没有办法不在整个列中循环执行此操作?如注释中所述,您可以填充三个二维数组。然后可以从三个数组中填充第四个数组,如下所示
Sub populateArray()
Dim arrColOne() As Variant, arrColTwo() As Variant, arrColThree() As Variant
Dim arrAllData() As Variant
Dim i As Long
arrColOne = Range("A2:A" & lrow(1)) 'amend column number
arrColTwo = Range("D2:D" & lrow(4))
arrColThree = Range("G2:G" & lrow(7))
ReDim arrAllData(1 To UBound(arrColOne, 1), 2) As Variant
For i = 1 To UBound(arrColOne, 1)
arrAllData(i, 0) = arrColOne(i, 1)
arrAllData(i, 1) = arrColTwo(i, 1)
arrAllData(i, 2) = arrColThree(i, 1)
Next i
End Sub
Public Function lrow(colNum As Integer) As Long
lrow = Cells(Rows.Count, colNum).End(xlUp).Row
End Function
以上要求所有3列的长度相同(否则填充最后一个数组将不起作用);这是因为第四个数组被重新定尺寸,以包含第一个数组中包含的元素数
使用250000行数据进行测试,第四个数组在0.43秒内填充完毕
你对你得到的回报有多宽大?我可以得到一个
数组(col)(row)
样式的数组,如果可以的话,无需循环得到它。顺便说一下,这不是数组(列,行)
。它是一个一维列数组,每个元素包含一个一维行值数组。如果你同意,你可以这样做:
Dim a(1 To 3)
a(1) = WorksheetFunction.Index(WorksheetFunction.Transpose(Range("AA2:AA10")), 1, 0)
a(2) = WorksheetFunction.Index(WorksheetFunction.Transpose(Range("K2:K10" )), 1, 0)
a(3) = WorksheetFunction.Index(WorksheetFunction.Transpose(Range("L2:L10" )), 1, 0)
然后可以访问数组项,如下所示:
Debug.Print UBound(a) ' Number of columns (3)
Debug.Print UBound(a(1)) ' Number of rows in column 1
Debug.Print a(1)(3) ' Value of column 1 (AA), row 3
Index()
函数可以返回1D数组,但只能返回行方向。因此,您需要将其与Transpose()
组合以返回1D列数组。以上代码就是这么做的。一个数组怎么样
Sub NoLoop()
Dim R1 As Range, R2 As Range, R3 As Range
Dim Arr1() As Variant, Arr2() As Variant, Arr3() As Variant
Dim LR As Long
LR1 = Cells(Rows.Count, "AA").End(xlUp).Row
LR2 = Cells(Rows.Count, "K").End(xlUp).Row
LR3 = Cells(Rows.Count, "L").End(xlUp).Row
Set R1 = Range(Cells(1, "AA"), Cells(LR1, "AA"))
Set R2 = Range(Cells(1, "K"), Cells(LR2, "K"))
Set R3 = Range(Cells(1, "L"), Cells(LR3, "L"))
Arr1 = R1.Value
Arr2 = R2.Value
Arr3 = R3.Value
ArrArr = Array(Arr1, Arr2, Arr3)
End Sub
使用此选项,您可以使用以下方法调用您的值:
MyVal = ArrArr(0)(1,1)
MyVal = ArrArr(0)(2,1)
MyVal = ArrArr(1)(1,1)
其中第一个数字表示数组(从0开始,以2结束),第二个数字表示用于填充数组的范围的行/单元格。
第三个数字始终为1(因为向数组添加范围将返回二维数组)
使用此代码,您还可以为每列设置不同的尺寸,以节省内存。填充3个单独的二维数组,然后循环将它们合并为一个数组。在数组中循环要比在一定范围内通过单元格快得多。这也是我在回答中所做的。但是,您实际上可以通过组合使用
index()
和Transpose()
@Bond()来摆脱该2D数组(以及始终为其指定1
列索引的需要)。对不起,您回答时我正在写。我不是职业选手,我的目标只是回报得到的帮助。我不是想暗示你不应该发布这个。我只是想为两人想出相似的解决方案而高兴!我不认为我可以在这种情况下使用它,但这是一个有用的想法,所以我保存您的代码以供将来参考。谢谢这真是太棒了,正是我一直在寻找的,为了转储4个非偶然范围(列),在所有行上运行countif,然后突出显示必要的(重复的)行。非常感谢。
MyVal = ArrArr(0)(1,1)
MyVal = ArrArr(0)(2,1)
MyVal = ArrArr(1)(1,1)