arrays - ExcelVBA - 从数组转换为集合,然后将所述集合插入组合框列表
问题描述
我有 Sheet1.ComboBox1,我想用一组值填充。该数组存储在 Sheet2 上。此数组是要在 excel 文件中使用的所有客户的列表。所有客户都列在一个列中。
一些客户不止一次出现在列中。它因客户拥有的零件编号数量而异。
我想用这个数组填充一个 Sheet1.ComboBox1,但是,我不想要重复的值。
我在网上读到,我可以将数组转换为一个集合,该集合会自动清除重复项。
我想把这个集合输入到 Sheet1.ComboBox1 中,但是,经过一些研究,我发现集合是只读的......(这个结论我错了吗?)
我看到的一个策略是将客户数组转换为一个集合,然后再转换回一个新的简化数组。希望将这个新数组存储到工作表 3 中,然后将该数组拉入 ComboBox1.List。我已在此尝试下方发布了我的代码。
'Converts collection to an accessible array
Function collectionToArray(c As Collection) As Variant()
Dim a() As Variant: ReDim a(0 To c.Count - 1)
Dim i As Integer
For i = 1 To c.Count
a(i - 1) = c.item(i)
Next
collectionToArray = a
End Function
Sub PopulateComboBoxes()
Dim ComboBoxArray As New Collection, customer
Dim CustomerArray() As Variant
Dim newarray() As Variant
Dim i As Long
CustomerArray() = Sheet2.Range("A5:A2000")
On Error Resume Next
For Each customer In CustomerArray
ComboBoxArray.Add customer, customer
Next
newarray = collectionToArray(ComboBoxArray)
Sheet3.Range("A1:A2000") = newarray
Sheet1.ComboBox1.List = Sheet3.Range("A1:2000")
我使用 'CustomerArray() = Sheet2.Range("A5:2000")' 并不是因为 Sheet 2 中有那么多行充满了值,而是当更多客户最终添加到列表中时,我涵盖了所有基础。我的 Sheet 2 的总尺寸目前是 A1:A110,但我想在未来证明它。
当我运行代码时,数组成功减少,新数组被放入 Sheet3 中,没有重复。但是,在定义最后一个唯一客户值之后,会重复第一个客户条目。(A46 是最后一个唯一客户,A47:A2000 是同一客户重复)
此外,Sheet1.ComboBox1 仍为空。
有谁能够解释如何限制由 'collectionToArray' 填充的行数,而不是填充所有 2000?
另外,我在填充 ComboBox1 时哪里出错了?我是否缺少导致框填充的命令/功能?
解决方案
首先,您应该将您的范围动态分配给 CustomerArray ...
With Sheet2
CustomerArray() = .Range("A5:A" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value
End With
然后,您应该在将项目添加到您的集合后禁用错误处理。由于您没有这样做,因此它隐藏了您在将值分配给列表框时的范围引用不正确的事实,并且您没有使用 Value 属性来分配它们。所以你应该禁用错误处理......
On Error Resume Next
For Each customer In CustomerArray
ComboBoxArray.Add customer, customer
Next
On Error GoTo 0
然后,将 newarray 传输到工作表时,您需要转置数组...
Sheet3.Range("A1").Resize(UBound(newarray) + 1).Value = Application.Transpose(newarray)
然后,如前所述,您应该使用 Sheet3.Range("A1:A2000").Value 将项目分配给您的列表框。但是,由于 newarray 已经包含项目列表,您可以简单地将 newarray 分配给您的列表框...
Sheet1.ComboBox1.List = newarray
所以完整的代码如下......
Sub PopulateComboBoxes()
Dim ComboBoxArray As New Collection, customer As Variant
Dim CustomerArray() As Variant
Dim newarray() As Variant
With Sheet2
CustomerArray() = .Range("A5:A" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value
End With
On Error Resume Next
For Each customer In CustomerArray
ComboBoxArray.Add customer, customer
Next
On Error GoTo 0
newarray = collectionToArray(ComboBoxArray)
Sheet3.Range("A1").Resize(UBound(newarray) + 1).Value = Application.Transpose(newarray)
Sheet1.ComboBox1.List = newarray
End Sub
推荐阅读
- python - AttributeError:“Mul”对象没有属性“sqrt”
- php - 围绕其中心点/轴旋转 3D 形状
- python - 查找总数为负数的用户数
- laravel - 在 Vuetify [ Laravel ] 中查询与 v-autocomplete 的关系
- java - 为什么我的 quickSort 方法给了我一个 StackOverflowError?爪哇
- javascript - mouseenter , mouseover 或任何鼠标事件在我的脚本上不起作用?
- android - Ionic 4:保持 Ionic 应用程序在后台运行、提取地理位置并防止被 Android 系统关闭的最佳方法?
- javascript - angularjs点击事件,附加内容后
- mysql - 如何在pyspark sql或Mysql中按键求和
- reflection - F# Generic Map.count 使用反射