将单独的范围放入2D数组中

时间:2015-08-05 13:09:07

标签: arrays vba excel-vba excel

我正在尝试填充大小为[x][3]的2D数组。 X只是工作表的大小(行数),我感兴趣的是3列。列彼此不相邻,例如{AA}应该从AA列填充, arr[i][0]应来自K列,arr[i][1]需要来自L列。

我尝试按以下方式分配它,但在数组值赋值中出错。

对此的任何帮助将不胜感激!

代码:

arr[i][2]

如果没有循环遍历整个列,有没有办法做到这一点?

3 个答案:

答案 0 :(得分:3)

如评论中所述,您可以填充三个2-D阵列。然后,您可以从三个数组中填充第四个数组,如下所示。

import numpy as np
import pandas as pd

class NAN(object):
    def __eq__(self, v):
        return np.isnan(v)

    def __hash__(self):
        return hash(np.nan)

nan = NAN()

df = pd.DataFrame([1,2,3,float('nan')], columns=['A'])
df.A.isin([1, nan])

以上将要求所有3列的长度相同(否则填充最后一个数组将不起作用);这是因为第四个数组被重新定义为包含第一个数组中包含的元素数。

  

使用250,000行数据进行测试,第四个数组在0.43秒内填充。

答案 1 :(得分:1)

你得到的数组对你的回报有多宽松?我可以为你提供一个Array(col)(row)样式的数组,如果可行的话,无需循环获取它。请注意,顺便说一下,Array(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()

Transpose()函数可以返回一维数组,但只能返回方向。因此,您需要将其与CURSOR c_2800s(map_code VARCHAR2,serv_code VARCHAR2,sub_serv_code VARCHAR2,bill_to_datetime VARCHAR2) IS SELECT DISTINCT kndtctc.tctc_cncclipu,TCTC_CNCTAEJE,TCTC_CNNETNAM,nvl(TEXE_CNASUPRO,0000000000),nvl(TEXE_CNNETNAM,00) FROM KNDTSCM, KNDTCTC, KNDTEXE WHERE trim(TSCM_CNMAPCO) = map_code AND KNDTSCM.TSCM_CNCONTRA = kndtctc.tctc_cncclipu AND KNDTCTC.TCTC_CNTIPCLI = 'C' -- FOR H2H -- AND KNDTCTC.TCTC_CNESTADO IN ('01','03') AND kndtctc.tctc_cncclipu = kndtexe.texe_cncclipu AND kndtexe.texe_cnestado in ('01','03') AND KNDTSCM.TSCM_CNESTADO IN ('01','03') AND trim(kndtscm.tscm_cnservic) = trim(kndtexe.texe_cnfuncid) AND trim(kndtscm.tscm_cnsubser) = trim(kndtexe.texe_cnsubser) AND trim(KNDTEXE.TEXE_CNFUNCID) = serv_code AND trim(kndtexe.texe_cnsubser) = sub_serv_code; 组合以返回1D列数组。这就是上面的所有代码。

答案 2 :(得分:1)

数组数组怎么样?

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(因为向数组添加范围会返回一个二维数组)

使用此代码,您还可以为每列提供不同的尺寸,以节省内存。