2017-01-25 3 views
0

ich ein Formular, wo ich Buchungen anmelden kann, die nach dem Vorbild der aussieht:ApplyFilter in Makro-Filter nicht, wenn leer

PNR ¦ Date Booking Created ¦ Name of Customer 
--------------------------------------------- 
1 ¦ 01/03/16    ¦ Marc N 
2 ¦ 04/07/16    ¦ Sam D 
3 ¦ 13/02/17    ¦ Max L 

Wo PNR ist das ID-Feld. Oben im Formular habe ich eine Suchleiste, die den Namen mit einem einfachen Makro (verbunden mit einem 'on click' Button) sucht und zurückgibt und die Suchleiste LIKE [Name des Kunden] vergleicht.

Ich habe auch zwei Suchbalken nebeneinander, in denen die Daten eingegeben werden, und mit einem Makro (auch mit einem 'on click' Button verbunden) findet WHERE [DateFrom] < [Datum der Buchung erstellt] < [ DateTo], die bei einem Klick alle Ergebnisse zwischen den beiden eingegebenen Daten anzeigt.

Allerdings bin ich mir nicht sicher, wie ich ein Makro erstellen kann, wo es "ApplyFilter" beide gleichzeitig ist. Ich habe zunächst den "Where" -Code von beiden Button-Scripts kopiert und beide mit einem Button verbunden, der beim Anklicken ein Makro aufruft, in dem er 'ApplyFilter' anwendet (beide mit AND getrennt).

Allerdings funktioniert das nicht gut, als würde ich nur nach einem Namen suchen, es zeigt keine Ergebnisse, da die [DateFrom] und [DateTo] Suchleiste leer ist, wie würde ich eine solche Situation (vorzugsweise in ein Makro), so dass es Datensätze zurückgibt, auch wenn ich nur nach einem Namen ohne Datumseinschränkungen suche?

Antwort

0

Sie müssen VBA-Code schreiben, der Ihren Filter basierend auf den Inhalten der verschiedenen Filterelemente generiert. Hier ist ein Beispiel für VBA-Code, der dies tut:

Dim Filter As String 
Filter = "" 
If Nz(Me.fCustomerName)<>"" Then 
    Filter = Filter & "CustomerName Like '" & Me.fCustomerName & "*' AND " 
    End If 
If IsDate(Me.DateFrom) Then 
    Filter = Filter & "DateCreated >= #" & Me.DateFrom & "# AND " 
    End If 
If Len(Nz(Me.DateTo, "")) Then 
    Filter = Filter & "DateCreated <= #" & Me.DateTo & "# AND " 
    End If 
If Filter <> "" Then 
    Filter = Left(Filter, Len(Filter) - 5) 
    Me.Filter = Filter 
    Me.FilterOn = True 
    Else 
    Me.FilterOn = False 
    End If 
Me.Requery 
+0

Vielen Dank. Wie würde ich das an eine Schaltfläche anhängen, die beim Klicken ausgeführt wird? Auch wenn Sie eine kurze Erklärung der Vorgänge machen könnten, damit ich das Skript anpassen kann, würde es sehr geschätzt werden – marcnetz

+0

Sie fügen es dem On Click-Ereignis der Schaltfläche hinzu. Was ist los, der Code ist eigentlich sehr einfach und selbsterklärend, vorausgesetzt, Sie können VBA lesen. Wenn du VBA nicht lesen kannst, gibt es keine Erklärung, die ich dir geben könnte. Aber ich werde es versuchen. Der Code prüft den Inhalt von 3 Formularsteuerelementen, einem Text und zwei Datumssteuerzeichen, und generiert eine Zeichenfolge, die ein SQL-ähnlicher Filter ist (der WHERE-Teil einer SQL-Anweisung). Das sind die ersten 3 Ifs. Der letzte prüft, ob ein Filter erzeugt wurde und ob er dem Filter als Filter zugewiesen ist und aktiviert ihn, andernfalls schaltet er den Filter aus. – SunKnight0

+0

Der einzige vielleicht nicht einfache Teil ist 'Filter = Left (Filter, Len (Filter) - 5)' was im Prinzip den "UND" Teil vom Ende des Filters entfernt. Da wir nicht im Voraus wissen, wie viele "ANDs" wir brauchen, fügt jedes Steuerelement, das einen Wert hat, standardmäßig "AND" hinzu, was am Ende immer zu einem "AND" führt. – SunKnight0

Verwandte Themen