Excel VBA:将多个非唯一单元格内容(例如给定名称)返回到已搜索姓氏的组合框
标题说明了这一点Excel VBA:将多个非唯一单元格内容(例如给定名称)返回到已搜索姓氏的组合框,vba,excel,combobox,Vba,Excel,Combobox,标题说明了这一点 我有一张包含学生信息的表格-ID、姓氏、姓名等。我有一张VBA表格,它允许您选择一个唯一的姓氏,如果表格中有多行包含该姓氏,则会将该姓氏传递给其他表格。我需要查询该表以查找该姓氏,并将多个给定名称返回到第二个表单的组合框中,以便用户可以选择他们想要的名称。以下是我在2008年做的一些事情,但仍然与您的请求相关: 在名为Names and FilteredNames的工作簿中创建两张工作表 创建一个表单并将其命名为FilterNames 在表单上放置一个列表框并称之为Filter
我有一张包含学生信息的表格-ID、姓氏、姓名等。我有一张VBA表格,它允许您选择一个唯一的姓氏,如果表格中有多行包含该姓氏,则会将该姓氏传递给其他表格。我需要查询该表以查找该姓氏,并将多个给定名称返回到第二个表单的组合框中,以便用户可以选择他们想要的名称。以下是我在2008年做的一些事情,但仍然与您的请求相关: 在名为Names and FilteredNames的工作簿中创建两张工作表 创建一个表单并将其命名为FilterNames 在表单上放置一个列表框并称之为FilteredList 在上面放一个文本框,称之为UserFilter 在名称表中输入一些名称,并将此代码粘贴到表单的代码区域
Private Sub UserFilter_Change()
Sheets("FilteredNames").Cells.ClearContents
For X = 1 To Sheets("Names").Range("A" & Rows.Count).End(xlUp).Row
If UCase(Left(Sheets("Names").Range("A" & X).Value, Len(UserFilter))) = UCase(UserFilter) Then
If Sheets("FilteredNames").Range("A1") = "" Then
Sheets("FilteredNames").Range("A1").Formula = Sheets("Names").Range("A" & X).Text
Else
Sheets("FilteredNames").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Formula = Sheets("Names").Range("A" & X).Text
End If
End If
Next
FilteredList.RowSource = "FilteredNames!A1:A" & Sheets("FilteredNames").Range("A" & Rows.Count).End(xlUp).Row
End Sub
现在只需运行表单
执行此操作以了解其工作原理,然后您只需将输入的参考更改为姓氏列表好的,您可以尝试此不太优雅的解决方案。假设您有如下数据: 同样,上面的列表已排序。我们需要做的是使用ComboBox的RowSource属性。现在我们需要获取要传递给RowSource属性的范围地址。我们使用以下函数完成此操作:
Private Function GetGivenName(sname As String, Optional sh As Worksheet) As String
If sh Is Nothing Then Set sh = ActiveSheet
Dim fgname As Long, lgname As Long
With sh
fgname = .Range("A:A").Find(sname, [A1], , , , xlNext).Row
lgname = .Range("A:A").Find(sname, [A1], , , , xlPrevious).Row
GetGivenName = .Range("B" & fgname, "B" & lgname).Address(, , , True)
End With
End Function
然后我们使用UserForm Initialize事件来填充ComboBox1
然后,我们在更新事件后的ComboBox1中使用函数设置ComboBox2行源
Private Sub ComboBox1_AfterUpdate()
Me.ComboBox2.RowSource = _
GetGivenName(Me.ComboBox1.Value, Sheet1)
DoEvents
End Sub
在本例中,数据位于代号为Sheet1的工作表中。
您可以将其替换为SheetsSheet1或工作簿中的任何名称。嗯。你为什么需要它?我认为,当你在组合框中键入内容时,它会自动选择与你键入内容匹配的字母。您需要做的只是按姓氏对来源进行排序。问题是我需要选择输入姓氏后的第二个值。我认为双栏组合框可以工作,但我看不到查看和选择第二个值的方法。感谢您这么快回来。这将返回姓氏,而不是给定的名称。你能告诉我在哪里改代码给我B栏吗?
Private Sub ComboBox1_AfterUpdate()
Me.ComboBox2.RowSource = _
GetGivenName(Me.ComboBox1.Value, Sheet1)
DoEvents
End Sub