Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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 Excel VBA使用数组加速代码_Arrays_Excel_Vba_Loops - Fatal编程技术网

Arrays Excel VBA使用数组加速代码

Arrays Excel VBA使用数组加速代码,arrays,excel,vba,loops,Arrays,Excel,Vba,Loops,我试图创建一个数组,在数组中存储值,然后将数组的值写入VBA中的电子表格。这段代码在我的计算机上运行需要1个多小时,我认为数组可以真正加快代码的速度 Option Explicit Sub main() Dim ws As Worksheet Dim mainArray() As Variant Dim ctrl

我试图创建一个数组,在数组中存储值,然后将数组的值写入VBA中的电子表格。这段代码在我的计算机上运行需要1个多小时,我认为数组可以真正加快代码的速度

Option Explicit
Sub main()
Dim ws                                                 As Worksheet
Dim mainArray()                                          As Variant
Dim ctrl                                               As Object
Dim numComboBoxes                                      As Long

    Set ws = ActiveSheet

    numComboBoxes = GetNumberOfComboBoxesInSheet(ws)
    mainArray = GenerateJaggedArrayComboBoxListValues(ws, numComboBoxes)
    PrintArray ws, mainArray
End Sub

Function GetNumberOfComboBoxesInSheet(ByRef ws As Worksheet) As Long
Dim ctrl As Object
    For Each ctrl In ws.OLEObjects
        If TypeName(ctrl.Object) = "ComboBox" Then
            GetNumberOfComboBoxesInSheet = GetNumberOfComboBoxesInSheet + 1
        End If
    Next ctrl
End Function

Function GenerateJaggedArrayComboBoxListValues(ByRef ws As Worksheet, ByVal numComboBoxes As Long) As Variant()
Dim ctrl                                                As Object
Dim tempPrimaryArray()                                  As Variant
Dim tempArray()                                         As Variant
Dim x                                                   As Long
Dim y                                                   As Long
Dim listNum                                             As Long

   ReDim tempPrimaryArray(0 To numComboBoxes - 1)
    x = 0
    For Each ctrl In ws.OLEObjects
        If TypeName(ctrl.Object) = "ComboBox" Then
            y = 0
            For listNum = 0 To ctrl.Object.ListCount - 1
                ReDim Preserve tempArray(0, 0 To y)
                tempArray(0, y) = ctrl.Object.List(listNum, 0)
                y = y + 1
            Next listNum
            tempPrimaryArray(x) = tempArray
            Erase tempArray
            x = x + 1
        End If
    Next ctrl
GenerateJaggedArrayComboBoxListValues = tempPrimaryArray()
End Function

Sub PrintArray(ByRef ws As Worksheet, ByRef mainArray As Variant)
Dim counter                                             As Long
Dim x                                                   As Long
Dim y                                                   As Long
Dim tempArray()                                         As Variant

    counter = 1
    For x = LBound(mainArray, 1) To UBound(mainArray, 1)
        tempArray = mainArray(x)
        For y = LBound(tempArray, 2) To UBound(tempArray, 2)
            ws.Range("A" & counter) = tempArray(0, y)
            counter = counter + 1
        Next y
    Next x
End Sub
但是,我需要有关创建数组、从组合框填充数组以及最终将数组值写入工作表的帮助

  • 创建一个n维数组
  • 用组合框的值填充n维数组
  • 遍历所有组合框
  • 在数组中存储值
  • 将数组中的值写入电子表格

    子WantToUseArray()


  • 此代码遍历给定
    工作表中的每个
    组合框
    ,生成一个
    数组
    ,该数组包含每个
    组合框
    列表的列表值,然后将所有内容打印到第一列中。myArray只有一个维度。它的内容是其他
    数组
    。如果
    comboxes
    具有不同的列表长度,则会创建一个
    锯齿状数组

    要帮助可视化
    阵列
    ,请通过转到菜单栏中的视图,然后选择
    局部变量窗口
    来启用
    局部变量窗口
    。见下面的代码图

    Option Explicit
    Sub main()
    Dim ws                                                 As Worksheet
    Dim mainArray()                                          As Variant
    Dim ctrl                                               As Object
    Dim numComboBoxes                                      As Long
    
        Set ws = ActiveSheet
    
        numComboBoxes = GetNumberOfComboBoxesInSheet(ws)
        mainArray = GenerateJaggedArrayComboBoxListValues(ws, numComboBoxes)
        PrintArray ws, mainArray
    End Sub
    
    Function GetNumberOfComboBoxesInSheet(ByRef ws As Worksheet) As Long
    Dim ctrl As Object
        For Each ctrl In ws.OLEObjects
            If TypeName(ctrl.Object) = "ComboBox" Then
                GetNumberOfComboBoxesInSheet = GetNumberOfComboBoxesInSheet + 1
            End If
        Next ctrl
    End Function
    
    Function GenerateJaggedArrayComboBoxListValues(ByRef ws As Worksheet, ByVal numComboBoxes As Long) As Variant()
    Dim ctrl                                                As Object
    Dim tempPrimaryArray()                                  As Variant
    Dim tempArray()                                         As Variant
    Dim x                                                   As Long
    Dim y                                                   As Long
    Dim listNum                                             As Long
    
       ReDim tempPrimaryArray(0 To numComboBoxes - 1)
        x = 0
        For Each ctrl In ws.OLEObjects
            If TypeName(ctrl.Object) = "ComboBox" Then
                y = 0
                For listNum = 0 To ctrl.Object.ListCount - 1
                    ReDim Preserve tempArray(0, 0 To y)
                    tempArray(0, y) = ctrl.Object.List(listNum, 0)
                    y = y + 1
                Next listNum
                tempPrimaryArray(x) = tempArray
                Erase tempArray
                x = x + 1
            End If
        Next ctrl
    GenerateJaggedArrayComboBoxListValues = tempPrimaryArray()
    End Function
    
    Sub PrintArray(ByRef ws As Worksheet, ByRef mainArray As Variant)
    Dim counter                                             As Long
    Dim x                                                   As Long
    Dim y                                                   As Long
    Dim tempArray()                                         As Variant
    
        counter = 1
        For x = LBound(mainArray, 1) To UBound(mainArray, 1)
            tempArray = mainArray(x)
            For y = LBound(tempArray, 2) To UBound(tempArray, 2)
                ws.Range("A" & counter) = tempArray(0, y)
                counter = counter + 1
            Next y
        Next x
    End Sub
    

    我可能忽略了什么。。但是为什么在这种情况下使用嵌套for循环呢?谢谢您的回复!我正在遍历4个组合框,for循环遍历组合框3和组合框4中的26项。在上面的代码中,您将值(l或n)放入组合框的列表索引中,因此将选择列表中的另一项。。是否要存储到数组中的选定项值?此外,将值从一个工作表复制到另一个工作表的行包含在25x25嵌套循环中,但这些行中没有任何变量。要复制的数据是否取决于组合框的值?(在提出可能的解决方案之前,我只是想澄清一下情况)我附上了一张带有一些代码输出的图像。输出取决于组合框,每次我更改组合框的值时,要复制的值都会更改。Län1=组合框1,Kommun1=组合框3,Län2=组合框2,Kommun2=组合框4。在最好的情况下,我想更改数组的n维以添加或删除变量!非常感谢您的回复和代码学习!这在我的计算机上运行得非常快,我将以您为例,查看本地窗口以可视化阵列。@Waimea很高兴听到它!!是否可以使代码的输出与“我的图像”中数据的排列方式相匹配?:)@如果我有机会,我会努力的!