excel 将多个源合并到一个ComboBox列表中并仅显示唯一的源

lymnna71  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(108)

我试图将两个不同的列表组合成一个ComboBox.list,但是其中一些值是相同的,我不希望它们出现两次。
不幸的是,我对VBA不太有经验,错误消息也很常见,所以我不知道为什么我的尝试不起作用。
我在网上找到一个代码,可以很好地将两者结合起来,但是当我添加unique函数时,它没有任何区别,它可以很好地将列表结合起来,但是它似乎忽略了unique函数,所以有很多重复。
这是我一直在使用的代码:

Sub Combo()

Set rng1 = sheet14.Range("Range_1")
     Set rng2 = sheet14.Range("Range_2")
    
     For Each cl In rng1
         If arStr = "" Then
             arStr = cl.Value
         Else
             arStr = arStr & "," & cl.Value
         End If
     Next cl
     
     For Each cl In rng2
         If arStr = "" Then
             arStr = cl.Value
         Else
             arStr = arStr & "," & cl.Value
         End If
     Next cl
  
    sheet13.SupplierCmb.List = WorksheetFunction.unique(Split(arStr, ","))

 End Sub

我已经测试过,这个唯一的函数只在一个范围内使用,它工作得很好。

csga3l58

csga3l581#

我不知道Unique-函数的确切规范,但可以确认一维数组存在问题。
我建议使用字典来获取列表--这在旧版本的Excel上也可以使用(但在Mac上不行)。通过创建一个范围的并集,你可以简化代码,这样你就只有一个循环。

Dim dict As New Dictionary

Dim rng As Range, cell As Range
Set rng = Union(sheet14.Range("Range_1"), sheet14.Range("Range_2"))

For Each cell In rng
    dict(cell.Value) = ""
Next
sheet13.SupplierCmb.List = dict.Keys

注意,这是使用早期绑定,所以你需要设置一个对Scripting运行时的引用。如果你不想这样做,定义字典如下:

Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
t8e9dugd

t8e9dugd2#

你通常会使用字典(根据另一个答案),但由于你调用了工作表函数UNIQUE(),我猜你也可以使用VSTACK()TOCOL()(后者用于2d数组)。虽然在VBA中不能作为方法使用,但你仍然可以计算公式:

Sub Test()

Sheet13.SupplierCmb.List = Sheet14.Application.Evaluate("=UNIQUE(VSTACK(TOCOL(range_1, 3), TOCOL(range_2, 3)))")

End Sub
  • TOCOL()-在两个范围对象是多维的情况下,“展平”它们中的每一个。第二个参数“3”将确保省略错误或空单元格;
  • VSTACK()-垂直堆叠两个扁平阵列;
  • UNIQUE()-仅将唯一项作为一维数组作为列表传递回来。

相关问题