Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:将多个非唯一单元格内容(例如给定名称)返回到已搜索姓氏的组合框_Vba_Excel_Combobox - Fatal编程技术网

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