Excel 列表框列/字段中组合框列表中的VBA唯一值
我希望在列表框的列表每次更改时,只列出列表框字段/列中的唯一值 例如,列表框中的第3列包含苹果、草莓和香蕉的多个实例。我希望组合框只包含苹果、草莓和香蕉各一次Excel 列表框列/字段中组合框列表中的VBA唯一值,excel,vba,combobox,listbox,unique,Excel,Vba,Combobox,Listbox,Unique,我希望在列表框的列表每次更改时,只列出列表框字段/列中的唯一值 例如,列表框中的第3列包含苹果、草莓和香蕉的多个实例。我希望组合框只包含苹果、草莓和香蕉各一次 有什么好主意吗?可以使用字典从列表中删除重复项。要使以下代码正常工作,您必须将“Microsoft脚本运行时”添加到您的应用程序中 我还没有机会测试它,让我知道它是否有效。从列表中删除重复项可以使用字典实现。要使以下代码正常工作,您必须将“Microsoft脚本运行时”添加到您的应用程序中 我还没有机会测试它,请告诉我它是否有效。请尝试下
有什么好主意吗?可以使用字典从列表中删除重复项。要使以下代码正常工作,您必须将“Microsoft脚本运行时”添加到您的应用程序中
我还没有机会测试它,让我知道它是否有效。从列表中删除重复项可以使用字典实现。要使以下代码正常工作,您必须将“Microsoft脚本运行时”添加到您的应用程序中
我还没有机会测试它,请告诉我它是否有效。请尝试下面的代码,并告诉我们您的反馈
Private Sub ListBox1_Change()
Dim dict As Object
Dim i As Long
Set dict = CreateObject("Scripting.Dictionary")
For i = 0 To ListBox1.ListCount - 1
dict.Item(ListBox1.List(i)) = vbNullString
Next i
ComboBox1.List = dict.keys
Set dict = Nothing
End Sub
尝试以下代码,并让我们知道您的反馈
Private Sub ListBox1_Change()
Dim dict As Object
Dim i As Long
Set dict = CreateObject("Scripting.Dictionary")
For i = 0 To ListBox1.ListCount - 1
dict.Item(ListBox1.List(i)) = vbNullString
Next i
ComboBox1.List = dict.keys
Set dict = Nothing
End Sub
为组合框指定唯一的第三列项目
有几种方法可以接收Unique(字典、arraylist);我演示了一种使用[1]
函数(从2013年版开始提供)的方法,以及一种通过FilterXML()
通过listbox的arr=Application.Index(Me.ListBox1.column,3,0)
属性隔离第三列的巧妙方法,从而接收到一个没有循环的“平面”数组.column
基于数组数据创建一个简单的格式良好的xml结构,并提供一个XPath搜索字符串来获取unique和[2]
将通过[3]
接收到的“垂直”二维Unique分配给组合框的FilterXML()
属性。此外,我还添加了一个针对单个项目的小错误处理程序。List
Private子列表框1_Change()
如果Me.ListBox1.ListCount=0,则如果没有可用的列表项,则退出子“Escape”
应用
“[1]获取listbox的第三列项目
Dim arr:arr=.Index(Me.ListBox1.Column,3,0)索引使用基于1的索引
“[2]创建FilterXML参数以获取唯一性
Dim XContent作为字符串:XContent=“&Join(arr)”&“
Dim XP As String:XP=“//s[not(前面的::*=)]”XPath表达式搜索唯一性
“[3]为组合框指定“垂直”二维唯一性
Dim uniques:uniques=.FilterXML(XContent,XP)'get uniques to combobox
错误时继续下一步:Me.ComboBox1.List=uniques'将uniques分配给combobox
如果错误号为0,则Me.ComboBox1.AddItem uniques
以
端接头
为组合框指定唯一的第三列项目
有几种方法可以接收Unique(字典、arraylist);我演示了一种使用[1]
函数(从2013年版开始提供)的方法,以及一种通过FilterXML()
通过listbox的arr=Application.Index(Me.ListBox1.column,3,0)
属性隔离第三列的巧妙方法,从而接收到一个没有循环的“平面”数组.column
基于数组数据创建一个简单的格式良好的xml结构,并提供一个XPath搜索字符串来获取unique和[2]
将通过[3]
接收到的“垂直”二维Unique分配给组合框的FilterXML()
属性。此外,我还添加了一个针对单个项目的小错误处理程序。List
Private子列表框1_Change()
如果Me.ListBox1.ListCount=0,则如果没有可用的列表项,则退出子“Escape”
应用
“[1]获取listbox的第三列项目
Dim arr:arr=.Index(Me.ListBox1.Column,3,0)索引使用基于1的索引
“[2]创建FilterXML参数以获取唯一性
Dim XContent作为字符串:XContent=“&Join(arr)”&“
Dim XP As String:XP=“//s[not(前面的::*=)]”XPath表达式搜索唯一性
“[3]为组合框指定“垂直”二维唯一性
Dim uniques:uniques=.FilterXML(XContent,XP)'get uniques to combobox
错误时继续下一步:Me.ComboBox1.List=uniques'将uniques分配给combobox
如果错误号为0,则Me.ComboBox1.AddItem uniques
以
端接头
这非常有效,谢谢。我刚刚将ListBox1.List(I)更改为ListBox1.List(I,3),以便只选择一列进行添加。这非常有效,谢谢。我刚刚将ListBox1.List(I)更改为ListBox1.List(I,3),以便只选择一列进行添加。谢谢。我同意第一个答案。这个非常相似。我感谢你的贡献,没问题。是的,几乎相似,但伟大的事情是不需要添加任何参考。谢谢。我同意第一个答案。这个非常相似。我感谢你的贡献,没问题。是的,几乎相似,但伟大的事情是不需要添加任何参考。感谢您的贡献。这是一个经过深思熟虑的解决方案。感谢您的贡献。这是一个经过深思熟虑的解决方案。
Private Sub ListBox1_Change()
If Me.ListBox1.ListCount = 0 Then Exit Sub ' Escape if no list items available
With Application
'[1] get 3rd column items of listbox
Dim arr: arr = .Index(Me.ListBox1.Column, 3, 0) ' Index uses 1-based indices
'[2] create FilterXML arguments to get uniques
Dim XContent As String: XContent = "<t><s>" & Join(arr, "</s><s>") & "</s></t>"
Dim XP As String: XP = "//s[not(preceding::*=.)]" ' XPath expression searching uniques
'[3] assign "vertical" 2-dim uniques to combobox
Dim uniques: uniques = .FilterXML(XContent, XP) ' get uniques to combobox
On Error Resume Next: Me.ComboBox1.List = uniques ' assign uniques to combobox
If Err.Number <> 0 Then Me.ComboBox1.AddItem uniques
End With
End Sub