Arrays 用数组填充列表框并将下2个数组添加到

Arrays 用数组填充列表框并将下2个数组添加到,arrays,excel,vba,listbox,Arrays,Excel,Vba,Listbox,我在中打开了许多工作簿,用于循环并将数据加载到动态数组中。 现在我需要将这些数组中的值放入列表框,但不知道如何 Dim rng as Variant Set rng = wsDat.Range(Cells(2, 1), Cells(lastRow, 1).Offset(0, 10)) 'for more ws myArray1 = rng.Value 'result of ws1 data myArray2 = rng.Value 'result od ws2 data . . . Me.m

我在
中打开了许多工作簿,用于循环并将数据加载到动态
数组中。
现在我需要将这些
数组中的值放入列表框,但不知道如何

Dim rng as Variant
Set rng = wsDat.Range(Cells(2, 1), Cells(lastRow, 1).Offset(0, 10)) 'for more ws

myArray1 = rng.Value 'result of ws1 data
myArray2 = rng.Value 'result od ws2 data
.
.
.

Me.myListbox.List = myArray1
Me.myListbox.List ??? add myArray2

假设需要在列表框中加载这些数组的所有内容,则不能使用
list
属性以这种方式添加项。下一个
.list=array
将删除上一个列表项。您可以使用它一次,然后通过迭代添加项,或者更优雅地,加入数组,并在末尾使用
list
加载加入的数组。要测试最后一种方法,请尝试下一个代码:

 Sub JoinArraysLoadList()
    Dim ws As Worksheet, lastRow As Long, myArray, myArrTot
    
    For Each ws In ActiveWorkbook.Sheets
            lastRow = ws.cells(ws.rows.count, 1).End(xlUp).row
            myArray = ws.Range(ws.cells(2, 1), ws.cells(lastRow, 1).Offset(0, 10)).Value
            If Not IsArray(myArrTot) Then 'if myArrTot did not receive any range value:
                myArrTot = myArray
            Else                                    'join myArrTot with the newly extracted array:
                'the arrays need to be transposed, in order to add elements (allowed only on the second dimension)
                myArrTot = JoinArrays(Application.Transpose(myArrTot), Application.Transpose(myArray))
            End If
    Next
    Me.myListbox.List = myArrTot
 End Sub

 Function JoinArrays(arrT, arr) As Variant
    Dim i As Long, j As Long, nrRows As Long
    
    nrRows = UBound(arrT, 2) 'the existing number of rows (now, columns...)
    ReDim Preserve arrT(1 To UBound(arrT), 1 To nrRows + UBound(arr, 2))
    For i = 1 To UBound(arr)
        nrRows = nrRows + 1 'increment the next row to be loaded
        For j = 1 To UBound(arr, 2)
            arrT(j, nrRows) = arr(i, j)
        Next j
    Next i
    JoinArrays = Application.Transpose(arrT)
 End Function
已编辑

下一个解决方案应该是更快/更高效的变体:

Sub JoinArraysLoadListJgArr()
    Dim wb As Workbook, ws As Worksheet, lastRow As Long
    Dim cnt As Long, noEl As Long, myArray, myArrTot, jgArr
    
    Set wb = ActiveWorkbook          'use here the necessary workbook
    ReDim jgArr(wb.Sheets.count - 1) 'redim the jagged array at the maximum necessary dimensioned (0 based array)
    For Each ws In wb.Sheets
            lastRow = ws.cells(ws.rows.count, 1).End(xlUp).row
            myArray = ws.Range(ws.cells(2, 1), ws.cells(lastRow, 1).Offset(0, 10)).Value
            noEl = noEl + UBound(myArray)       'counting the number of each array rows
            jgArr(cnt) = myArray: cnt = cnt + 1 'loading each sheet array in the jagged one
    Next
    If cnt < wb.Sheets.count Then
        ReDim Preserve jgArr(cnt - 1) 'preserve only the existing elements (if a sheet or more have been skipped)
    End If
    myArrTot = JoinJgArr(jgArr, noEl)
    Me.myListbox.List = myArrTot
 End Sub
 
 Function JoinJgArr(jgA, N As Long) As Variant
    Dim k As Long, i As Long, j As Long, iRow As Long, arrFin
    
    ReDim arrFin(1 To N, 1 To UBound(jgA(0), 2)) 'redim the array to take the jagged array elements
    
    For k = 0 To UBound(jgA)                  'iterate between the jagged array elements
        For i = 1 To UBound(jgA(k))           'iterate between each jagged array element rows
            iRow = iRow + 1                   'counting the rows or the final array to be filled!!!
            For j = 1 To UBound(jgA(k), 2)    'iterate between each jagged array element columns
                arrFin(iRow, j) = jgA(k)(i, j)'put values in the final array
            Next j
        Next i
    Next k
    
    JoinJgArr = arrFin
 End Function
子JoinArraysLoadListJgArr()
将wb设置为工作簿,ws设置为工作表,最后一行设置为长
Dim cnt As Long、noEl As Long、myArray、myArrTot、jgArr
设置wb=ActiveWorkbook'在此处使用必要的工作簿
ReDim jgArr(wb.Sheets.count-1)“以最大必要尺寸(基于0的阵列)对锯齿状阵列进行ReDim”
对于wb.Sheets中的每个ws
lastRow=ws.cells(ws.rows.count,1).End(xlUp).row
myArray=ws.Range(ws.cells(2,1),ws.cells(lastRow,1).Offset(0,10)).Value
noEl=noEl+UBound(myArray)'计算每个数组行的数量
jgArr(cnt)=myArray:cnt=cnt+1'在锯齿状阵列中加载每个板材阵列
下一个
如果cnt
旁注:您需要对工作表中的
单元格(2,1)
单元格(lastRow,1)
进行限定。再见。@BigBen谢谢你。。。是现在吗?将wsDat设置为工作表集rng=wsDat.Range(wsDat.Cells(2,1),wsDat.Cells(lastRow,1).Offset(0,10))调暗wsDat是现在
单元格
调用符合相应的
工作表
的条件。是否需要将每个数组的值加载到列表框中?我的意思是加载它的次数和存在的张数一样多?或者加载包含所有这些数组内容的列表框?查看“Me.myListbox.List???addmyarray2”,我想您需要在列表框中添加所有这些数组内容。在这种情况下,不能使用
list
属性添加项目。您应该以某种方式加入数组,并在代码末尾立即加载
list
列表框属性。如果我的理解/假设是正确的,我可以准备一段代码。很好地解释:+)@T.M.谢谢!我有连接数组的功能,但当尝试定义上述解决方案时,我可以想象一个更快、更高效的解决方案。因为OP什么也没说,我对构建更好的版本失去了热情。现在,如果有人(重要的…)评论了代码,我将创建优化的版本。将每个表数组放在一个锯齿状数组中,并计算每个数组的行数,将使代码使用更少的资源。无需使用更多的
ReDim Preserve
行来转置和强调内存。在我的had中有解决方案,应该需要几分钟才能付诸实践。我希望……:)@FaneDuru谢谢你,但这对我来说太复杂了。我可能需要先将其复制到Activeworkbook中的工作表中,然后添加到Listbox.list中。我不知道这是否可能是一个简单的方法。@excel222:如果我是你,我将首先描述我的目的是什么。。。原则上,您是否需要在特定列表框中加载前十列的所有工作表内容?如果是,它是关于什么样的列表?它是一种工作表ActiveX类型吗?我的意思是它存在于一张纸上还是一张表格上?根据您对上述问题的回答,我将告诉您如何使用该代码。这应该很容易…@FaneDuru非常感谢您的关注。每个月我都有好几本工作手册,在里面我为顾客记录货物。现在我正试图将这些工作簿中的数据加载到UserFormListbox。在此列表框中,我选择项目并开具发票。在原始工作簿中,发票项必须标记为“完成”或“存储号”。我是VBA的初学者,这个项目对我来说很难。这就是为什么我尝试通过小部分学习简单代码的原因。