Access-Filterprobleme

Liebe Experten,
wie kann man einen Teil des Feldinhalts filtern? Und mit welcher Funktion klappt es am besten: filtern nach, auswahlfilter oder, oder?

Mein Problem ist:
ich will alle kasperstücke für Kinder in einer Liste zusammenfassen.
Meine Ursprungstabelle sieht wie folgt aus:
Spalte 1: Puppenspielart (da werden alle Arten aufgelistet, Marionette, Handpuppen etc… Spalte 2: Sonstiges ( für Kinder, für Erwachsene,für TV etc…)
Wenn ich nur einen Teil des Felds Sonstiges eingebe z.B. „Kinder“ filtert er nichts oder unsinniges Zeug!
Was tun? Ich verzweifle langsam aber sicher.
Vielen Dank im voraus
Muriel

Hallo Muriel,

diesen Tipp habe ich irgendwo im Internet gefunden …

Versionen: Access 97, 2000 und 2002/XP

Häufig müssen Sie in einem Formular nach einem oder mehreren Datensätzen suchen, von denen Sie lediglich wissen, dass bestimmte Begriffe in irgendeinem Feld vorkommen können. Sie können dazu zwar die Suchfunktion von Access verwenden, aber dazu müssen Sie aber erst einmal den entsprechenden Dialog aufrufen, konfigurieren und anschließend Datensatz für Datensatz durch die Fundstellen blättern.

Die Lösung aus diesem Tipp der Woche erlaubt die Eingabe eines Suchbegriffes direkt im Formular und setzt den Filter des Formulars auf alle Datensätze, in denen der Suchbegriff in einem der Text- oder Memofelder vorkommt. Diese Datensätze können Sie dann der Reihe nach durchblättern und bearbeiten. Die Eingabe eines Sternchens „*“ als Suchbegriff schaltet den Filter wieder aus:

Legen Sie ein neues Modul an und geben Sie die folgende Funktion ein:

Function SearchAllFieldsFilter(strTable As String, \_
 strSearch As String) \_
 As String
 Dim rs As Recordset, intCnt As Integer
 Dim strFilter As String, I As Integer

 intCnt = 0
 Set rs = CurrentDb.OpenRecordset(strTable)
 rs.MoveFirst
 With rs
 For I = 0 To .Fields.Count - 1
 If .Fields(I).Type = dbText Or \_
 .Fields(I).Type = dbMemo Then
 intCnt = intCnt + 1
 strFilter = strFilter & \_
 "[" & .Fields(I).Name & "] like '\*" & \_
 strSearch & "\*' or "
 End If
 Next I
 End With
 rs.Close
 If intCnt \> 0 Then
 'letztes " or " wieder raus
 strFilter = Left$(strFilter, Len(strFilter) - 4)
 SearchAllFieldsFilter = strFilter
 Else
 SearchAllFieldsFilter = ""
 End If

End Function

Speichern Sie das Modul und verlassen Sie den VBA-Editor.

Basis der Lösung ist die Funktion „SearchAllFieldsFilter()“, die als Parameter den Namen der zu durchsuchenden Tabelle und den Suchbegriff erwartet. Die angegebene Tabelle wird als Recordset geöffnet und auf den ersten Datensatz positioniert. Auf diesem Weg können wir nun auf die „Fields“-Auflistung des Datensatzes zugreifen, die wir wiederum in einer Schleife durchlaufen und zunächst auf den Datentyp prüfen. Handelt sich um ein Text- oder Memofeld nehmen wir es in ein Filter-Statement der folgenden Form auf:

[Feldname] like ‚*Such*‘ or [Feldname] like ‚*Such*‘ or…"

Das Ergebnis sieht dann zum Beispiel so aus:

[Kunden-Code] like ‚*assistent*‘ or [Firma] like
‚*assistent*‘ or [Kontaktperson] like ‚*assistent*‘ or
[Position] like ‚*assistent*‘ or [Straße] like
‚*assistent*‘ or [Ort] like ‚*assistent*‘ or [Region]
like ‚*assistent*‘ or [PLZ] like ‚*assistent*‘ or [Land]
like ‚*assistent*‘ or [Telefon] like ‚*assistent*‘
or [Telefax] like ‚*assistent*‘

Am Ende erscheinen in dem Formular also nur noch die Datensätze, in denen der Suchbegriff in irgendeinem Text- oder Memofeld an einer beliebigen Stelle vorkommt.

Zum Einsatz der Funktion in einem Formular gehen Sie folgendermaßen vor:

Öffnen Sie das gewünschte Formular im Entwurfsmodus.

Legen Sie im Formularkopf oder Formularfuß ein Textfeld „txtSearch“ und setzen Sie die Eigenschaft „Nach Aktualisierung“ auf „[Ereignisprozedur]“.

Klicken Sie auf die Schaltfläche mit den drei Punkten und geben Sie im VBA-Editor die folgenden Anweisungen ein:

Private Sub txtSearch\_AfterUpdate()
 Dim strSearch As String, strFilter As String

 strSearch = Me.txtSearch
 If strSearch = "\*" Then
 Me.Filter = ""
 Me.FilterOn = False
 Exit Sub
 End If

 strFilter = SearchAllFieldsFilter("Kunden", \_
 Me.txtSearch)
 If strFilter "" Then
 Me.Filter = strFilter
 Me.FilterOn = True
 End If

End Sub

Ersetzen Sie dabei „Kunden“ durch den Namen der Tabelle, die Ihrem Formular zugrunde liegt. Diese Anweisungen prüfen zunächst die Eingabe: Handelt es sich um ein Sternchen „*“, wird der Filter zurückgesetzt und die Routine verlassen. Das Formular zeigt dann wieder alle Datensätze an. Andernfalls rufen wir „SearchAllFieldsFilter()“ mit dem Namen der Tabelle und dem Suchbegriff auf. Das Ergebnis ist ein Kriterium, das wir direkt der „Filter“-Eigenschaft des Formulars zuordnen und anschließend aktivieren können.

Nachdem Sie diese Änderungen gespeichert und den Entwurfsmodus verlassen haben, können Sie das Formular einem ersten Test unterziehen: geben Sie einen Suchbegriff ein, von dem Sie wissen, dass er in einem Text- oder Memofeld vorkommt. Der Filter für das Formular wird entsprechend gesetzt und es erscheinen nur noch die passenden Datensätze.

Ich hoffe, das hilft Dir einigermaßen …

gruss moritzbock

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Moritzbock,

danke für den Tipp, den ich auch ausprobieren werde.

Ich habe inszwischen eine relativ simple Art Auswahlkriterien einzugeben gefunden. und zwar egal, ob Auswahlabfrage oder Spezialfilter muss man in der betreffenden Spalte z.B. ‚Beschreibung der Stücke‘ im Feld Kriterien: Wie „*Kinder*“, drunter im Feld oder: Wie „*Erwachsene*“ schreiben. Das Program wählt dann alle Stücke für Kinder oder für Erwachsene. Sucht man nur Marionettenspiele für Erwachsene muss die Formel in der Spalte ‚Beschreibung‘ im Feld ‚Kriterien‘ so heißen: Wie „*Erwachsene*“ und Wie „*Marionette*“. Das Programm sucht alle Marionettenspiele für Erwachsene, bzw. alle Stücke, die diese Wortteile enthalten. Fand ich Klasse!

Vielen Dank, nochmals für den Tipp. Die Methode scheint mir etwas kompliziert, aber sie muss bestimmt gegenüber meiner Methode einen Vorteil haben. Ich finde aber toll, dass jemand auf meine Frage geantwortet hat. Ist nicht immer so.

Grüße
Muriel