Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将不同的范围放入2D数组_Arrays_Vba_Excel - Fatal编程技术网

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)