VBA:获取一个组合框来显示唯一值以从过滤表数据中进行选择 - 然后通过过滤后的数据运行特定搜索

问题描述 投票:0回答:1

您好,感谢您点击并花费您的时间。我并不自豪只是寻求帮助,但由于这个项目的截止日期,我自己没有时间正确理解和解决它。

我有一个宏,它正在运行字符串搜索代码,以显示名为 (Tabelle1) 的工作表中的许多不同的必要数据。但我需要能够首先根据列(“L”)中的“发货编号”过滤该工作表数据,以仅获取相应列(总共 27 个,从“A”到“AA”)的数据我必须对每批货物运行搜索过程。

理想的情况是(如果可能的话),当选择货件(从下拉列表中单击)时,会自动选择搜索/输入栏(userinput.KeyUp),以便可以将搜索字符串直接输入到它。

我认为 ComboBox 可以完成这项工作。在其下拉菜单中显示所有唯一的货件编号(最好只显示一次)。我怀疑仅仅添加一个 ComboBox 并单独编写它的函数是无法完成的(但我什至无法做到这一点),我需要将它连接到已经存在的搜索代码,该代码没有 ComboBox /编写时包含过滤功能。

这是我的数据表的精简示例:

Sheet

我创建的对象示例:

Screenshot of Input Interface

这是完整的代码,以及我对 ComboBox 集成的糟糕尝试:

Private Sub ComboBox1_Change()

Dim lastr As Integer
    lastr = Range("L" & Rows.Count).End(xlUp).Row
    ThisWorkbook.Sheets("Tabelle1").Range("A:AA" & lastr).AutoFilter Field:=12, Criteria1:=Range("L1").Value, Operator:=xlFilterValues
    
End Sub

Private Sub Frame1_Click()

End Sub

Private Sub Frame2_Click()

End Sub

Private Sub Label1_Click()

End Sub

Private Sub Label13_Click()

End Sub

Private Sub Label2_Click()

End Sub

Private Sub lastbin_Click()

End Sub

Private Sub Label9_Click()

End Sub

Private Sub limiter_a_Click()

End Sub

Private Sub limiter_b_Click()

End Sub

Private Sub locationfound_Click()

End Sub

Private Sub partfound_Click()

End Sub

Private Sub partnotein_Click()

End Sub

Private Sub partspecialin_Click()

End Sub

Private Sub quickbin2_Click()

End Sub

Private Sub lineqtydetail_Change()

End Sub

Private Sub partqtyinfound_Change()

End Sub

Private Sub TestCountMultiple()

End Sub

Public Sub UserForm_Initialize()

limiter_a = "^#01^"
limiter_b = "^#02^"

End Sub

Private Sub suchbutton_Click()

Dim fullstring, searchstring As String
Dim partfound, locationfound, partqtyinfound As String
Dim partnotein, partspecialin, lastbin As String
Dim columnpart, columnlocation, lineqtydetail As String
Dim quickbin2 As String
Dim ergebnis As String
Dim j As Long
Dim lenght_a, lenght_b As Long
Set ws = ThisWorkbook.Sheets("Tabelle1")

columnpart = "M"
columnlocation = "C"
quickbin2 = "D"
partqtyinfound = "N"
partnotein = "P"
partspecialin = "Q"
lastbin = "B"
lineqtydetail = "O"

lenght_a = Len(limiter_a)
lenght_b = Len(limiter_b)

fullstring = SucheTeilenummer.userinput.Value

openPos = InStr(fullstring, limiter_a)
closePos = InStr(fullstring, limiter_b)

If openPos > "0" And closePos > "0" Then
    searchstring = Mid(fullstring, openPos + lenght_a, closePos - openPos - lenght_b)
Else
    ergebnis = "Keine Limiter gefunden"
End If

If ergebnis = "Keine Limiter gefunden" Then
    SucheTeilenummer.partfound = ergebnis
    SucheTeilenummer.locationfound = ""
    SucheTeilenummer.partqtyinfound = ""
    Suche.Teilenummer.partnotein = ""
    Suche.Teilenummer.partspecialin = ""
    Suche.Teilenummer.lastbin = ""
    Suche.Teilenummer.lineqtydetail = ""
    Suche.Teilenummer.quickbin2 = ""
Else
    letzteZeileTeilenummer = ws.Cells(ws.Rows.Count, columnpart).End(xlUp).Row
    For j = letzteZeileTeilenummer To 2 Step -1
        
        If Range(columnpart & j).Value = searchstring Then
            booFOUND = True
            
            SucheTeilenummer.partfound = ws.Range(columnpart & j).Value
            SucheTeilenummer.locationfound = ws.Range(columnlocation & j).Value
            SucheTeilenummer.partqtyinfound = ws.Range(partqtyinfound & j).Value
            SucheTeilenummer.partnotein = ws.Range(partnotein & j).Value
            SucheTeilenummer.partspecialin = ws.Range(partspecialin & j).Value
            SucheTeilenummer.lastbin = ws.Range(lastbin & j).Value
            SucheTeilenummer.lineqtydetail = ws.Range(lineqtydetail & j).Value & Chr(vbKeySpace) & "PCS" & " - " & ws.Range(columnpart & j).Value & vbCrLf & ws.Range(partnotein & j).Value & vbCrLf & "##################" & vbCrLf & SucheTeilenummer.lineqtydetail
            SucheTeilenummer.quickbin2 = ws.Range(quickbin2 & j).Value
            
            ergebnis = "Wert gefunden"
        Else
            ergebnis = "Wert nicht gefunden"
        End If
        
    Next j
        
        If booFOUND Then
            ergebnis = "Wert gefunden"
        Else
            ergebnis = "Wert nicht gefunden"
        End If

End If
        
        If ergebnis = "Wert nicht gefunden" Then
            SucheTeilenummer.partfound = searchstring
            SucheTeilenummer.locationfound = ""
            SucheTeilenummer.partqtyinfound = ""
            SucheTeilenummer.partnotein = ""
            SucheTeilenummer.partspecialin = ""
            SucheTeilenummer.lastbin = ""
            SucheTeilenummer.lineqtydetail = ""
            SucheTeilenummer.quickbin2 = ""
        End If

SucheTeilenummer.userinput.Value = ""
fullstring = ""
ergebnis = ""
SucheTeilenummer.userinput.SetFocus

End Sub

Private Sub userinput_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

If KeyCode = vbKeyReturn Then 'wenn die Taste vbKeyReturn ist was für 13 steht dann soll die Suche gestartet werden
    Call suchbutton_Click
    KeyCode = 0 'hier wird der Key für die nächste Suche resettet
End If

End Sub

Private Sub userinput_change()
If InStr(SucheTeilenummer.userinput.Value, limiter_b) Then 'wenn in dem Einfgabefeld irgendwo der limiter_b auftaucht, dann soll die Suche gestartet werden
    Call suchbutton_Click
End If

End Sub

亲切的问候, 埃罗尔。

您尝试了什么以及您期待什么? 试图用谷歌搜索类似的问题并将其应用到我的代码中。无法让它运行。抱歉,谢谢。

excel vba object filter combobox
1个回答
0
投票

我现在能够执行以下操作,至少能够让组合框搜索我想要过滤的列中的值。但它什么也不做,只是在我开始输入第一个数字时显示框中的值:

Drop Down works but...

但我试图在下拉字段中填充每个值一次(尽管由于数据的性质,列本身已在多个单元格中列出)。一旦我选择了一个货件编号,我就需要数据来过滤工作表上的所有信息,以及“L”列中该特定货件编号的所有其他对应值(隐藏不属于该货件的所有内容,但要隐藏所有其他值)另一种)。

Private Sub ComboBox1_Change()

    FilterCbo1 (UCase(ComboBox1.Value))
    ComboBox1.DropDown
    
End Sub

Public Sub FilterCbo1(strFilter As String)

Dim lastrow As Long
    lastrow = ThisWorkbook.Sheets("Tabelle1").Range("L" & Rows.Count).End(xlUp).Row
        For Each strchoice In Range(Cells(2, 12), Cells(lastrow, 12))
            If InStr(1, strchoice, strFilter) <> 0 Then
                SucheTeilenummer.ComboBox1.AddItem strchoice
            End If
        Next
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.