Arrays Excel VBA使用数组加速代码
我试图创建一个数组,在数组中存储值,然后将数组的值写入VBA中的电子表格。这段代码在我的计算机上运行需要1个多小时,我认为数组可以真正加快代码的速度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
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
但是,我需要有关创建数组、从组合框填充数组以及最终将数组值写入工作表的帮助
此代码遍历给定
工作表中的每个组合框
,生成一个数组
,该数组包含每个组合框
列表的列表值,然后将所有内容打印到第一列中。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很高兴听到它!!是否可以使代码的输出与“我的图像”中数据的排列方式相匹配?:)@如果我有机会,我会努力的!