Hallo zusammen,
ich brauche noch einmal eure Hilfe.
Ich habe eine Tabelle [Tabelle1], eine Abfrage [Abfrage] und ein Formular [For1].
Darin unter Anderem das Feld ,,Status2", und ein Listenfeld
für eine mögliche Mehrfachauswahl.
Nun möchte ich, dass mir im Formular nur die Datensätze angezeigt werden, die mit der Mehrfachauswahl übereinstimmen.
Entweder direkt im Formular oder über die Abfrage.
Z.B. mit ,,nach Aktualisierung" oder ,,bei Klick" über VBA.
Ist mir eigentlich egal, Hauptsache es funktioniert.
Ich hoffe, ich habe mich verständlich ausgedrückt.
Über ein wenig Zuwendung würde ich mich freuen...
Ich kriegs nicht hin...
Hallo,
und welche Art von Zuwendung stellst Du Dir vor?
Schreib eine Prozedur, die die markierten Listenfeld-Einträge ausliest und füge die zu einem String zusammen, der eine IN-Where-Condition darstellt und filtere damit das Formular oder füge die in die Abfrage ein.
Suche hier im Forum nach "Itemsselected" oder "ItemData", dann findest Du passende Beispiele.
Hallo Bernd,
Da ich befürchte, dass du Franz' Hinweise evtl. nicht so recht umsetzen kannst
ZitatSchreib eine Prozedur
Bei einem Listfeld mit
Mehrfachauswahl sind die Ereignisse "Click"
und/oder "AfterUpdate" nicht gut geeignet. Da ist ein zusätzl. Button besser.
Damit kannst du den Filter auch gleich wieder zurücksetzen, wenn du möchtest.
(Luftcode)
private Sub DeinButton_Click()
dim sCriteria as String
dim varItem as Variant
with me
sCriteria = "IN ("
if .deineliste.itemsselected.count > 0 Then
for each varitem in .deineliste.itemsselected
sCriteria = sCriteria & varitem & ", "
'wenn varitem vom Datentyp "Text"
'sCriteria = sCriteria & "'" & varitem & "', "
next varitem
'letztes komma abschneiden
sCriteria = Left(sCriteria, Len(sCriteria) -2)
'String zur Prüfung im Direktfenster ausgeben
Debug.Print sCriteria 'wenn korrekt dann
.Filter = "Feldname " & sCriteria
.FilterOn = True
else
.filter = ""
.filteron = false
end if
end with
end subZurücksetzen (Else-Zweig) geht natürlich schneller mit einem zweiten Button,
weil dann die Auswahl nicht einzeln wieder abgewählt werden muss.
gruss ekkehard
Hallo Ekkehard,
ich habe erst heute gesehen, dass du noch auf die Frage geantwortet hast.
Danke dafür.
Ich bin mit dem Tip vom Franz auch nicht wirklich klar gekommen (soll heißen "war ich hoffnungslos überfordert").
Nun habe ich versucht, deinen Code auf mein Formular anzupassen.
das Listenfeld heisst "Listenfeld"
Der Button heisst "Filter1"
das Feld in dem gesucht oder gefiltert werden soll heißt "Status2" und ist vom Tatentyp "kurzer Text"
darin sind eigentlich nur 3 verschiedene Werte: aktiv;ausgeschieden;-/-
Irgendwie ist mir aber ein Fehler unterlaufen. Oder ich habe deine Bemerkungen falsch verstanden...
So sieht es nun aus.
Private Sub Filter1_Click()
Dim sCriteria As String
Dim varItem As Variant
With Me
sCriteria = "IN ("
If .Listenfeld.ItemsSelected.Count > 0 Then
For Each varItem In .Listenfeld.ItemsSelected
sCriteria = sCriteria & "'" & varItem & "', "
Next varItem
sCriteria = Left(sCriteria, Len(sCriteria) - 2)
Debug.Print sCriteria
.Filter = "Status2 " & sCriteria
.FilterOn = True
Else
.Filter = ""
.FilterOn = False
End If
End With
End Sub
Wo liegt mein Fehler?
Hallo,
ZitatIch bin mit dem Tip vom Franz auch nicht wirklich klar gekommen
Das ist natürlich ein dicker Hund ;) ;) ;D ;D . Dann bitte gleich "reklamieren"..
Offensichtlich (Debug.Print ansehen!) fehlt die abschließende Klammer:
Zitat
.Filter = "Status2 " & sCriteria & ")"
Hallo Franz, Teilerfolg...
In dem Sinne, dass überhaupt etwas passiert.
Nur werden jetzt, nachdem ich ein oder zwei Einträge im Listenfeld ausgewählt habe und danach den Button Filter1 angeklickt habe, alle Datensätze ausgeblendet anstatt zu filtern.
Alles wech... :o
so sieht der Code nun aus:
Private Sub Filter1_Click()
Dim sCriteria As String
Dim varItem As Variant
With Me
sCriteria = "IN ("
If .Listenfeld.ItemsSelected.Count > 0 Then
For Each varItem In .Listenfeld.ItemsSelected
sCriteria = sCriteria & "'" & varItem & "', "
Next varItem
sCriteria = Left(sCriteria, Len(sCriteria) - 2)
Debug.Print sCriteria
.Filter = "Status2 " & sCriteria & ")"
.FilterOn = True
Else
.Filter = ""
.FilterOn = False
End If
End With
End Sub
da ist noch ein Würmchen drinne, fürchte ich...
Hallo,
dann schau mal im Direktfenster nach, was Debug.Print sCriteria dort hinschreibt und C&P das hier...
oder besser noch:
Zitat.
.FilterOn = True
Debug.Print .Filter
Else
.
und was bedeutet das:
Zitatalle Datensätze ausgeblendet anstatt zu filtern.
Vermutlich wird so gefiltert, dass es keine DS mit entspr. der Listenfeldauswahl gibt.
Franz, du hast einen Super-DAU am anderen Ende...
Fein, nun weiß ich dass es ein Direktfenster gibt :-)
Also ich habe den Editor geöffnet, setze den Cursor hinter Debug.Print sCriteria und klicke auf "ausführen". Danach geht ein Fenster auf und ich werde nach einem Makronamen gefragt?!?!
Der Direktbereich bleibt leer...
Ich fürchte, ich mache etwas falsch...
In der Spalte Status2 gibt es die Einträge aktiv;ausgeschieden;-/-.
Leere Felder gibt es nicht.
Wenn ich nun im Listenfeld z.B. "aktiv" auswähle und den Button betätige werden keinerlei Datensätze angezeigt obwohl es einige mit diesem Eintrag gibt.
Hallo Bernd,
F5 funzt in Formularmodulen nicht. Aber du hast ja den Button.
ZitatIn der Spalte Status2 gibt es die Einträge aktiv;ausgeschieden;-/-.
Wozu brauchst du bei drei Auswahlmöglichkeiten dann eine Mehrfachauswahl?
gruss ekkehard
Hallo Ekkehard,
ich möchte je nach Bedarf mal alle Datensätze sehen, mal nur "ausgeschieden", mal "aktiv" und "-/-".
Da schien mir ein Listenfeld mit Mehrfachauswahl ein gutes Mittel zu sein.
Hast du einen anderen Vorschlag?
Ich bin für alles dankbar.
Gruß
Bernd
Hallo Bernd,
Erstmal sorry für die fehlende Klammer. Aber die Korrektheit von Code
sollte man mit den gegebenen Mitteln (Kompilieren, Debuggen, Einzelschritt-
modus) schon überprüfen. Dabei lernt man ihn auch zu verstehen.
ZitatHast du einen anderen Vorschlag?
Nein. Denn dann ist das mit der Mehrfachauswahl schon o.k.
Was kommt den nun bei Debug.Print heraus?
Aber mal eben was anderes, gibt es für die Status eine Tabelle, und wenn ja,
hat die eine ID? Das Prinzip bleibt zwar das Gleiche, aber für Filter (SQL) sollte
man mit den Schlüsselfeldern arbeiten, denn dazu sind sie da.
gruss ekkehard
nein, leider keine ID zu den Einträgen in Status2.
das mit dem Direktfenster habe ich ja nicht hinbekommen.
Bis heute wusste ich ja noch nicht einmal, dass es so etwas gibt, geschweige denn wie man damit Code überprüft.
Was ich gemacht habe habe ich ja beschrieben, aber access fragt mich immer nach einem Makronamen...
Bin da ratlos.
Hallo Bernd,
Zitatdas mit dem Direktfenster habe ich ja nicht hinbekommen
Öffne das Formular, wähle in der Liste ein-zwei Status aus, klicke auf
den Button und schau dir das Direktfenster an.
Oder versuche es
'statt mit
Debug.Print .Filter
'mit
MsgBox .FilterAm Besten du lädst die DB mal mit ein paar Beispieldaten hier hoch.
gruss ekkehard
Mojn Ekkehard
im Direktfenster steht nach Klick auf den Button (ich habe zwei von drei Möglichkeiten ausgewählt):
IN ('0', '2'
Status2 IN ('0', '2')
vielleicht hilft dir das.
Eine (sehr) stark abgespeckte Version der Datenbank...
Das Problem tritt auch hier auf.
Hallo,
schreib mal so:
Zitat.
.
.
For Each varItem In .Listenfeld.ItemsSelected
sCriteria = sCriteria & "'" & .Listenfeld.Column(0, varItem) & "', "
.
'oder sCriteria = sCriteria & "'" & .Listenfeld.ItemData(varItem) & "', "
.
Next varItem
.
.
.
Hallo Franz und Ekkehard,
jetzt funzt es... Hurra!
Vielen Dank für eure Geduld mit mir...
Ich habe ja nur ganz selten mal mit Access zu tun und mit Makros (soweit einsetzbar) komme ich ja einigermaßen klar aber in meinem Alter fällt es schwer VBA noch zu lernen.
Vielleicht wenn man mal an die Hand genommen wird und jemand erklärt etwas Auge in Auge.
Aber ganz alleine und nur durch Bücher oder WWW fällt es schwer.
Häufig (und das schließt diese Seite auch ein) werden Lösungsvorschläge gemacht die ein gewisses Maß an VBA Kenntnisse voraussetzen die, zumindest bei mir, einfach nicht vorhanden sind.
Also noch einmal "Danke sehr für eure Mühen"...
LG
Bernd