Hallo,
och habe ein Formular(frm_Verwaltung) mit Unterformular(frm_Kunden) ind Access 2013 erstellt.
Aus Gründen der Benutzerfreundlichkeit möchte ich folgendes realisieren.
Im Formular gibt es 2 Kombinationsfelder (cbofilterOrt und cbofilterStatus) mit deren Hilfe die Daten im Unterformular eingrenzt werden sollen.
Beim Click auf eine Schaltfläche wird folgender VBA Code ausgeführt.
Private Sub BefehlFiltern_Click()
Dim StrOrt As String, StrStatus As String
StrOrt = Me.cbofilterOrt.Value & "'"
StrStatus = Me.cbofilterStatus.Value & "'"
Me.sfrm_Kundenverwaltung.Form.Filter = "U-Ort = '" & StrOrt & "'" & " AND Kd-Status = '" & StrStatus & "'"
Me.FilterOn = True
End Sub
Ich bekomme dann Laufzeitfehler "3075"
Syntaxfehler (fehlender Operator) in Abfrageausdruck 'U-Ort ='Berlin" AND Kd-Status = 'aktiv'".
angezeigt. Offensichtlich kann der Code so falsch nicht sein, aber ich vermute das es an den Hochkommas liegt.
Bin aber nicht sicher. Das immer so verwirrend. :o
Ich habe verschiedene Varianten ausprobiert komme aber leider nicht weiter und es ist schon so so so spät. Daher hoffe ich hier den richtigen Schups in die richtige Richtung zunekommen.
Vielen Dank im voraus.
Hi,
was passiert mit:
Me.sfrm_Kundenverwaltung.Form.Filter = "[U-Ort] = '" & Me.cbofilterOrt.Value & "' AND [Kd-Status] = '" & Me.cbofilterStatus.Value & "'"
Me.FilterOn = True
Gilt unter der Voraussetzung, dass beide Kombifelder vom Typ String sind.
Was mir nicht klar ist, warum einmal:
Me.sfrm_Kundenverwaltung.Form.Filter
und bei der nächsten Anweisung nur
Me.FilterOn
Warum nicht : Me.sfrm_Kundenverwaltung.Form.FilterOn
Und noch eine Bemerkung:
vermeide Sonderzeichen (wie z.B. das Minus-Zeichen) bei den
Namen. Wenn dann mit [] umrahmen: [U-Ort]
Gleiches gilt für den Status
Und noch eine Frage:
Wirst Du immer beide Kombifelder verwenden oder kann es auch mal sein, dass Du nur eins benutzt?
Harald
Hallo,
wenn "sfrm_Kundenverwaltung" der Name des UFO-Steuerelementes ist (mit dem das Formular "frm_Kunden" angezeigt wird), dann sollte es schon so lauten:
Me!sfrm_Kundenverwaltung.Form.Filter = "[U-Ort] = '" & Me!cbofilterOrt & "' AND [Kd-Status] = '" & Me!cbofilterStatus & "'"
Me[color=red]!sfrm_Kundenverwaltung[/color].Form.FilterOn = True
auf ".Value" kann man verzichten, wenn der Wert aus der gebundenen Spalte des Kombi gebraucht wird.
btw: schon zig-tausendmal geraten, wie der Hinweis von Harald:
KEIN Sonder- und/oder Leerzeichen in Namen verwenden!
Und (auch, wenn da manche Meinungen auseinandergehen):
Punkt vor Objekt-Methoden/-Eigenschaften setzen
Ausrufezeichen vor eigendefinierten Namen/Objekten setzen
Hallo nochmal.
Vielen herzlichen Dank für eure Hilfe und eure Rüffel. :D Da hab ich wohl ein paar klassische NewbieFehler gemacht. Aber ich Glaube sowas passiert jeden Anfänger. Bitte versteht das nicht als Ausrede. Ich habe erst seit 6 Wochen Office2013 und mache gerade die ersten Schritte mit Access und VBA.
Das man keine Sonderzeichen in Namen verwenden soll/kann war mir nicht bewußt. Daher habe ich zuerst alle meine Tabellen und Formulare überarbeitet.
Auch habe ich den Filter direkt ins Unterformular verlegt.
Mit dem Code funktioniert das Ganze jetzt fast so wie ich es mir vorgestellt habe.
Private Sub Filtern_Click()
Me.Form.Filter = "[UOrt] = '" & Me!cbofilterOrt & "' AND [KdStatus] = '" & Me!cbofilterStatus & "'"
Me.Form.FilterOn = True
End Sub
Da ich mir schon einige Tage mit dem Problem beschäftigt habe, bin ich sehr dankbar das es jetzt funktioniert und ich mit meinem Projekt weiterkomme.
ZitatWirst Du immer beide Kombifelder verwenden oder kann es auch mal sein, dass Du nur eins benutzt?
Da hatte ich bisher noch gar nicht dran gedacht. Es wäre sicherlich vorteilhaft die Daten aller Orte/Außenstellen oder alle KundenStatuse zu sehen, gerade für die Suchfunktionen.
Daher hätte ich noch 2 Fragen.
Wie könnte ich das denn realisieren das jeweils eins der beiden Felder leer bleiben kann?
Wäre es möglich auf den Button zu verzichten und den Code über die Eigenschaft "Nach Aktualisierung" beider Kombinationsfelder auszuführen?
Falls nicht, kann man per erneutem Click auf die Schaltfälche alle Filter wieder deaktivieren?
Oder muss ein zweiter Button her?
Vielen Grüße
Hi,
anbei ein ungetesteter Code, den Du in den VBA-Teil des Formulars einträgst:
private sub Filter_Setzen
Dim Bedingung as String
Bedingung = ""
if nz(Me!cbofilterOrt,"") > "" then Bedingung = " and [UOrt] = '" & Me!cbofilterOrt
if nz(Me!cbofilterStatus,"") > "" then Bedingung = Bedingung & " and [KdStatus] = '" & Me!cbofilterStatus & "'"
'and entfernen
Bedingung = mid (Bedingung, 6)
if Bedingung > "" then
Me.Filter = Bedingung
Me.FilterOn = true
else
Me.Filter=""
Me.FilterOn = false
end if
end sub
Die obige sub rufst Du auf mit:
call Filter_Setzen
Diese Anweisung trägst Du in die beiden "Nach Aktualisierung"-Ereignisse der beiden Kombifelder ein.
Damit sollte ein Extrabutton zum Filtersetzen überflüssig sein.
U.U musst Du beim Filtersetzen noch auf das Unterformular verweisen.
In der Art wie Franz es beschrieben hatte.
Hoffe, es hilft.
Harald
Das mit dem call Filter_setzen hat leider nicht funktioniert.
Da hat Access den Fehler. "Objekt: 'call Filter_setzen' kann nicht gefunden werden" ausgeworfen.
Daher habe ich das Ganze wie folgt umgesetzt.
Private Sub cbofilterOrt_AfterUpdate()
Dim Bedingung As String
Bedingung = ""
If Nz(Me!cbofilterOrt, "") > "" Then Bedingung = " and [UOrt] = '" & Me!cbofilterOrt & [color=red]"'"[/color]
If Nz(Me!cbofilterStatus, "") > "" Then Bedingung = Bedingung & " and [KdStatus] = '" & Me!cbofilterStatus & "'"
'and entfernen
Bedingung = Mid(Bedingung, 6)
If Bedingung > "" Then
Me.Filter = Bedingung
Me.FilterOn = True
Else
Me.Filter = ""
Me.FilterOn = False
End If
End Sub
Private Sub cbofilterStatus_AfterUpdate()
Dim Bedingung As String
Bedingung = ""
If Nz(Me!cbofilterOrt, "") > "" Then Bedingung = " and [UOrt] = '" & Me!cbofilterOrt & [color=red]"'"[/color]
If Nz(Me!cbofilterStatus, "") > "" Then Bedingung = Bedingung & " and [KdStatus] = '" & Me!cbofilterStatus & "'"
'and entfernen
Bedingung = Mid(Bedingung, 6)
If Bedingung > "" Then
Me.Filter = Bedingung
Me.FilterOn = True
Else
Me.Filter = ""
Me.FilterOn = False
End If
End Sub
Erst bekam ich einen Laufzeitfehler. Danach habe ich so aus dem Bauch heraus die rot markierte Stellen eingefügt. Ich weiss zwar nicht warum aber es funktioniert und vorerst habe ich keine weiteren Bugs gefunden.
Hallo,
ZitatDa hat Access den Fehler. "Objekt: 'call Filter_setzen' kann nicht gefunden werden" ausgeworfen.
wo hattest du die Prozedur denn eingefügt? Und wie bzw. woher wurde sie aufgerufen?
Möglicherweise hast du die Hinweise von bahasu nicht beachtet?