2016-06-18 16 views
2

Ich möchte ein List-Feld auf einem Word-Benutzerformular basierend auf den Daten, die in einem Textfeld in demselben Formular eingegeben werden, füllen. Im Idealfall würde dies in Echtzeit geschehen (mit dem Änderungsereignis, das ich denke), wobei jedes Zeichen, das in das Textfeld eingegeben wurde, die im Listenfeld angezeigten Elemente filtert.VBA: Verwenden Sie Textfeld, um List-Feld auf Word-Benutzerformular aufzufüllen - Abfrage-Excel-Datenbank

Die Datenquelle ist eine Excel "Datenbank", auf die mit DAO zugegriffen wird. Der folgende Code funktioniert, aber er trägt die gesamte Datenbank in Listenfeld ein (basierend darauf - Link).

Private Sub UserForm_Initialize() 

    Dim db As DAO.Database 
    Dim rs As DAO.Recordset 
    Dim NoOfRecords As Long 

    'Open the database (Excel File) 
    Set db = OpenDatabase("C:\Users\T400\Documents\UserFormListTest.xlsx" _ 
      , False, False, "Excel 8.0") 

    'Retrieve the recordset > Excel Range = "ListBoxData" 
    Set rs = db.OpenRecordset("SELECT * FROM ListBoxData") 

    ' Determine the number of retrieved records 
    With rs 
     .MoveLast 
      NoOfRecords = .RecordCount 
     .MoveFirst 
    End With 

    ' Set the number of Columns = number of Fields in recordset 
    ListBox1.ColumnCount = rs.Fields.Count 
    ListBox1.Column = rs.GetRows(NoOfRecords) 

     rs.Close 
     db.Close 

     Set rs = Nothing 
     Set db = Nothing 

    End Sub 

Wie kann ich die Daten filtern, so dass das Listenfeld nur für das Textfeld ausgefüllt wird? Ich habe auf eine einfache Lösung gehofft, wie zum Beispiel die Modifikation des SELECT * Abfrageteils des Codes.

Ist das möglich? Oder gibt es einen besseren Weg?

+2

Sie sind auf dem richtigen Weg! Fügen Sie der Anweisung 'Select' die' Where'-Klausel hinzu, um Daten filtern zu können. –

+0

Danke! Ich habe 'Set rs = db.OpenRecordset (" SELECT * FROM ListBoxData WHERE Name = 'Andy Smith' ")' hinzugefügt und nur diesen Datensatz zurückgegeben. Das Textfeld noch nicht verwenden, aber ermutigend. –

+0

Ich kann das nicht ausführen, wenn ich das "Andy Smith" ', das im obigen Kommentar hart codiert ist, durch eine Variable ersetze. Ich denke, es ist die Syntax und habe mehrere Variationen mit und ohne einfache und doppelte Anführungszeichen usw. ausprobiert ... irgendwelche Vorschläge? –

Antwort

0

Wie ich im Kommentar zu der Frage erwähnt, verwendet MS Excel Jet-Datenbank-Engine. Sie müssen also Platzhalter verwenden, die dieser Datenbank-Engine entsprechen. All, StartsWith, Contains und EndsWith:

Also, wenn Sie benutzerdefinierte entwickeln wollen „Suche/finden“ Funktionalität, können Sie Combobox Steuerelement auf dem Formular mit diesen Optionen hinzuzufügen. Ein Beispielcode sollte wie folgt aussehen (die Namen der Kontrollen zu Ihnen ersetzen):

Dim sName As String 
Dim sSearchType As String 
Dim sQry As String 

sName = TextBox1.Text 
sSearchType = ComboBox1.Value 

sQry = "SELECT * FROM ListBoxData " 
Select Case sSearchType 
    Case "All" 
     'do nothing; return all records 
    Case "StartsWith" 
     sQry = sQry & "WHERE Name Like '" & sName & "*'" 
    Case "Contains" 
     sQry = sQry & "WHERE Name Like '*" & sName & "*'" 
    Case "EndWith" 
     sQry = sQry & "WHERE Name Like '*" & sName & "'" 
End Select 

Set rs = db.OpenRecordset(sQry) 
'other stuff 

Mehr über Platzhalter, finden Sie hier:
Access wildcard character reference
Office: Wildcard Characters used in String Comparisons

+0

OK danke, ich werde etwas Zeit mit diesem Code verbringen und auch lesen –

+1

Das funktioniert! Antwort akzeptiert. Ich werde nur Ihre "enthält" -Option - es funktioniert gut für alle und die Suchergebnisse sind blitzschnell.Ich habe immer noch ein paar Knicke zu trainieren, da jetzt ein "No Current Record" -Fehler auftritt, wenn ich ein Zeichen eingabe, das nicht in dem Feld ist. Ich erwarte, dass ich das ausarbeiten kann, aber wenn irgendwelche Vorschläge frei anbieten können. Das war schmerzhaft, danke für die Hilfe. –

+0

Sie sind herzlich willkommen;) Recordset.Count ist was Sie suchen nach "No current Record". –