Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Laufzeitfehler'2427'

Begonnen von AstraDyne, April 25, 2024, 12:52:19

⏪ vorheriges - nächstes ⏩

AstraDyne

Hallo,

ich quäle mich mit VBA herum- da habe ich leider garkeinen Schimmer von.

Aus einer Tabelle in Datenblattansicht möchte ich gerne 3 Hauptzustände filtern,dafür benötige ich 3x Options-(Zustands)felder die jeweils nach folgenden Zuständen filtern und dies dann "gefiltert" im Datenblatt anzeigen/auflisten:
Optionsgruppe 1: DINA4 oder DINA3
Optionsgruppe 2: Farbe oder Schwarz/Weiss
Optionsgruppe 3: MFP oder NURDrucker

Gemäß Beakers Tip hatte ich mir AMinhorst angeschaut und diesen Filter mit einem Auswahlkästchen realisiert- das klappt auch ganz fein. Allerdings sobald ich dann auf Optionsfeld "umstelle" und die Anpassungen vornehme, bekomme ich den oben genannten Laufzeitfehler.
VBA kann ich nicht und von daher kann ich nicht "lesen" wo der Fehler im Debugger steht, bzw. besser: was ich ändern muss.

Alle genannten Felder sind in der vorhandenen Tabelle als Ja/Nein Felder hinterlegt, weshalb ich davon ausging, dass bei "Zustand eingeschaltet" eben TRUE ausgewählt wird oder eben FALSE bei nicht ausgewählt.

Die weitere Schwierigkeit besteht darin, dass ich nicht weiss, ob so nebeneinander existierende Optionsfelder dann auch den Fall der "vorangegangenen Auswahl" des vorangegangenen Optionsfeldgrüppchens berücksichtigen oder ob die noch irgendwie miteinander verknüpft werden müssen in irgendeiner Weise :-/
Oder ist es besser, das mittels eines SQL's oder Abfrage-Unterabfragen darzustellen?
Optisch der Bedienbarkeit wegen stelle ich mir eher die Optionsgruppen vor auf einem Formular.

Das "Endergebnis" der eingestellten Auswahlen möchte ich dann mit einem weiterführenden Subformular "Filtern können, welches auf eben "Artikel" dann gefiltert wird.
Beispiel: 1.Optgruppe=DINA4, 2.Optgruppe=S/W, 3Opt.gruppe=NURDrucker ist ausgewählt, dann soll das, was dann angezeigt wird , (zu den dann ausgefilterten/restlich angezeigten Datensätzen) mitels Checkbox (Aktiv/Inaktiv) setzen, durch die dann eben per Subformular die dazugehörigen Artikel des ausgewählten Datensatzes(Druckers) gezeigt werden.)

Kann mir jemand sagen , wo der Fehler in meinem bisherigen Code ist?


Private Sub optFarbe_GotFocus()

  If Me.optFarbe = True Then
   Me.UFODruckerFilter.Form.Filter = "Farbe=True"
   Me.UFODruckerFilter.Form.FilterOn = True
   Me.UFODruckerFilter.Form.SetFilter
  Else
   Me.UFODruckerFilter.Form.Filter = ""

End If
End Sub





Private Sub optDINA31_GotFocus()
  If Me.optDINA31 = True Then
   Me.UFODruckerFilter.Form.Filter = "DINA3=True"
   Me.UFODruckerFilter.Form.FilterOn = True
  Else
   Me.UFODruckerFilter.Form.Filter = ""

End If
End Sub



Private Sub optDINA41_AfterUpdate()
If Me.optDINA41 = True Then

   Me.UFODruckerFilter.Form.Filter = "DINA4=True"
   Me.UFODruckerFilter.Form.FilterOn = True
  Else
   Me.UFODruckerFilter.Form.Filter = ""

End If
End Sub

Private Sub optSchwarzWeiss_GotFocus()
  If Me.optSchwarzWeiss = True Then
   Me.UFODruckerFilter.Form.Filter = "S/W=True"
   Me.UFODruckerFilter.Form.FilterOn = True
   Me.UFODruckerFilter.Form.SetFilter
  Else
   Me.UFODruckerFilter.Form.Filter = ""

End If
End Sub

Ich bedanke mich schon vorab für Eure Hilfe

AstraDyne



PhilS

Zitat von: AstraDyne am April 25, 2024, 12:52:19Allerdings sobald ich dann auf Optionsfeld "umstelle" und die Anpassungen vornehme, bekomme ich den oben genannten Laufzeitfehler.
Bitte schreib bei einer solchen Frage auch den Text der Fehlermeldung. Die Nummern kennt kein Mensch zuverlässig auswendig und der Fehlertext enthält oft Hinweise auf die Ursache.
Im Direktfenster der VBA-Umgebung kannst du nach einem Klick auf "Debuggen" in der Fehlermeldung eintippen:
? Err.DescriptionDas gibt dir den Text aus und du kannst ihn einfach kopieren und muss nicht mal tippen.


Zum eigentlichen Problem:

Das ....SetFilter gibt es so nicht. Diese Zeilen musst du löschen.

Feldnamen mit Sonderzeichen musst du in eckige Klammern einschließen:
Me.UFODruckerFilter.Form.Filter = "[S/W]=True"
Die beiden bisher genannten Punkte können technische Fehler auslösen.
Nachfolgend noch zwei Anmerkungen, die nicht unmittelbar mit dem akuten Problem zusammenhängen.

Sind deine opt...-Steuerelemente die einzelnen OptionButtons, oder die Optionsgruppe?
Du verwendest immer das GotFocus Ereignis. Für eine Optionsgruppe halte das ich für falsch und für die  OptionButtons zumindest fragwürdig, weil es ja nicht unbedingt eine Änderung des Wertes bedeutet. Das AfterUpdate-Ereignis ist aus meiner Sicht wahrscheinlich besser geeignet. - Ist schwer zu sagen, ohne alle Details zu kennen.

Dein Datenmodell macht es möglich, dass in einem Datensatz sowohl DINA3 als auch DINA4 gleichzeitig aktiv sind. - Ist das so sinnvoll? Wenn nein, wäre eine Spalte mit verweis auf eine Referenztabelle "Papierformat" o.ä. besser.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

AstraDyne

#2
Hallo Phil,
vielen vielen Dank für deine Tips und deine Antwort!

Zitat von: PhilS am April 26, 2024, 11:14:57Bitte schreib bei einer solchen Frage auch den Text der Fehlermeldung. Die Nummern kennt kein Mensch zuverlässig auswendig und der Fehlertext enthält oft Hinweise auf die Ursache.
Im Direktfenster der VBA-Umgebung kannst du nach einem Klick auf "Debuggen" in der Fehlermeldung eintippen:
? Err.Description
Ah, ok, sorry, das wusste ich nicht! Ich dachte, das sind "fest zugeordnete" Fehler in VBA.
Googlelt man das, ist derselbe Fehler mit 'Laufzeitfehler 2427 Sie haben einen Ausdruck ohne Wert angegeben' ....werde ich dann das nächste Mal komplett ausschreiben, da hast du natürlich vollkommen Recht.Mein Fehler, Entschuldigung.

ZitatDas ....SetFilter gibt es so nicht. Diese Zeilen musst du löschen.
Ok, ich hatte Access verwendet, die Optionsgruppe gezogen, meine Felder darin benannt in den 2 Feldern die erschienen und damit war diese Codezeile so im VBA Code hinterlegt ... ::)  :-\ ...wie gesagt: VBA kann ich nicht, daher bin ich da vollstens auf das Programm angewiesen.Diese Zeile mit SetFocus stand da dann irgendwo. Ich gebe zu, hier try-and-error probiert zu haben.

ZitatFeldnamen mit Sonderzeichen musst du in eckige Klammern einschließen:
Me.UFODruckerFilter.Form.Filter = "[S/W]=True"
Ahhhaaaa, ok....

ZitatSind deine opt...-Steuerelemente die einzelnen OptionButtons, oder die Optionsgruppe?
Du verwendest immer das GotFocus Ereignis. Für eine Optionsgruppe halte das ich für falsch und für die  OptionButtons zumindest fragwürdig, weil es ja nicht unbedingt eine Änderung des Wertes bedeutet.
Die "Felder" der "Radio"-Button habe ich mit "opt"davor dann bezeichnet (analog zu der Bezeichnungsweise- Komboboxfeld mit cmb abgekürt, textfeld mit txt davor usw....), damit ich weiss, dass es kein txtFeld ist sondern zum Optionsfeld gehört.
Die Optionsgruppe habe ich im Falle der Farbe mit "Farbe" bezeichnet. Die Optionsgruppe im DINA4/DINA3 Fall mit "Format"

ZitatDas AfterUpdate-Ereignis ist aus meiner Sicht wahrscheinlich besser geeignet.
Dieses hatte ich vorher, als ich manuell das "Anhakkästchen oder Auswahlkästchen" auf das Formular plaziert hatte. Es nutzt aber nichts, beides anzubieten, denn es kann nur ein Format gebe, in dem gesucht wird, deshalb wollte ich die Filterung nach DINA4 oder DINA3 mit den Optionsfeldern machen.Das "After Update" ist/war vorhanden, als ich die Anhakkästchen platzierte. Das sorgte aber auch dafür, dass ich gleichzeitig beides auswählen konnte und das ist verkehrt (ich vermute, weil mein Code VBA verkehrt ist und es deshalb zu diesem technischen Fehler gekommen ist, wie du ja auch schon sagtest).
Da Access mir mit Verwendung der Optionsgruppen dieses SetFocus irgendwo unterjubelte meine ich, dachte ich, die "AfterUpdate" Funktion gehört zu dem Auswahlkästchen, die "GotFocus" zu Optionsfeldern....
ich hab also zurückgestellt auf die "AterUpdate" Geschichte und dann macht er auch die Filterung, einmal nach anklicken von A4 UND A3 und dann A3 wieder rausnehmen.....dann alles wieder rausnehmen und umgekehrt anhaken von A3 filtert dann auch schön nur die A3 Drucker raus, dann wieder beides anhaken, dann listet er nur die A4 Drucker .....ich bin noch nicht dahinter gekommen, wo welche Aktion was auslöst und was ich "umswitchen" muss, damit er mir nur A4 filtert, wenn ich den Button nur einmal anklicke und dass er dann umspringt auf A3 NICHT ausgewählt.. Es wirkt auf mich so, als würde das erst zu spät aktualisiert werden. Dieses "ent-oder weder" ist irgendwie nicht vorhanden. Normalerweise wirkt ja nur ein Button aus der Optionsgruppe als angewählt zugelassen.
In den Eigenschaften (der von Access angebotenen Steuerelemente der Optionsgruppe und dessen Feldern) sind aber ganz andere Parameter gezeigt, als bei den selbstgebauten Auswahlkästchen. Da funktioniert aber auch das ent-oder weder. Dafür filtert er dort gar nichts. Vielleicht , weil zwei Optionsgruppen nebeneinander sich ausschließen? Ich weiss es nicht, VBA .....
Das warum erschließt sich mir nicht.

Kurz gesagt: Anklicken von DINA4 und er filtert korrekt. Buttona ushaken, alles wieder in Normalansicht....das funktioniert korrekt.
Dasselbe bei DINA3- man klickt A3 an, er filtert korrekt, aushaken führt wieder zu Normalansicht....funktioniert also korrekt.
Auch bei Farbe und Schwarzweiss- jeden Button einzeln angesteuert- funktioniert korrekt.
Der Umschaltprozess- das funktioniert gar nicht. Also der Wechsel von DINA4 auf DINA3. Auch bei Farbe auf Schwarz Weiss. Ähnlich wird es somit dann auch mit der Optionsgruppe MFP und "NURDrucker" vermutlich....

Im Standardwert steht beim einen "Wahr" (Hauptansicht DINA4), beim anderen DINA3 "False".....mit Werten (-1 und 0) hab ich das auch ausprobiert, auch das funktioniert. Nur eben das umschalten zwischen den beiden Button nicht.

Hier jetzt nochmal der geänderte Code:
Option Compare Database
Option Explicit

Private Sub MFP_AfterUpdate()
 If Me.MFP = True Then
   Me.UFODruckerFilter.Form.Filter = "MFP=True"
   Me.UFODruckerFilter.Form.FilterOn = True
 
  Else
   Me.UFODruckerFilter.Form.Filter = ""

End If
End Sub

Private Sub NURDrucker_AfterUpdate()
 If Me.NURDrucker = True Then
   Me.UFODruckerFilter.Form.Filter = "NURDrucker=True"
   Me.UFODruckerFilter.Form.FilterOn = True
 
  Else
   Me.UFODruckerFilter.Form.Filter = ""

End If
End Sub


Private Sub optFarbe_AfterUpdate()
 If Me.optFarbe = True Then
   Me.UFODruckerFilter.Form.Filter = "Farbe=True"
   Me.UFODruckerFilter.Form.FilterOn = True
 
  Else
   Me.UFODruckerFilter.Form.Filter = ""

End If
End Sub

Private Sub optDINA31_AfterUpdate()
  If Me.optDINA31 = True Then
   Me.UFODruckerFilter.Form.Filter = "DINA3=True"
   Me.UFODruckerFilter.Form.FilterOn = True
 
  Else
   Me.UFODruckerFilter.Form.Filter = ""

End If
End Sub

Private Sub optDINA41_AfterUpdate()
If Me.optDINA41 = True Then

   Me.UFODruckerFilter.Form.Filter = "DINA4=True"
   Me.UFODruckerFilter.Form.FilterOn = True
  Else
   Me.UFODruckerFilter.Form.Filter = ""

End If
End Sub
Private Sub optSchwarzW_AfterUpdate()
  If Me.optSchwarzW = True Then
   Me.UFODruckerFilter.Form.Filter = "Farbe=False"
   Me.UFODruckerFilter.Form.FilterOn = True
  Else
   Me.UFODruckerFilter.Form.Filter = ""

End If
End Sub


Der DINA4 und DINA3 Filter macht schon - fast- was es soll....da fehlt sicher nur eine Kleinigkeit.

Ich bin wirklich dankbar für jeden Vorschlag

Viele Grüße,
AstraDyne



Beaker s.a.

Hallo,
Du hast das Objekt "Optionsgruppe" noch nicht verstanden.
Zitatmit der Optionsgruppe MFP und "NURDrucker"
Das sind keine "Gruppen" sondern die Optionen.
Eine Optionsgruppe gibt den Wert der gewählten Option zurück.
D.h. du musst nicht die einzelnen Optionen abfragen, sondern
die Gruppe
Private Sub ogrFormat_AfterUpdate()
    With Me   
        Select Case .ogrFormat
        Case 1
            .UFODruckerFilter.Form.Filter = "DINA4=True"
        Case 2
            .UFODruckerFilter.Form.Filter = "DINA3=True"
        Case Else
            .UFODruckerFilter.Form.Filter = ""
        End Select
        .UFODruckerFilter.Form.FilterOn = (Len(.UFODruckerFilter.Form.Filter) > 0)
    End With
End Sub
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

AstraDyne

Hallo Ekkehard,

Danke für den Tip

Zitat von: Beaker s.a. am April 26, 2024, 16:54:49Hallo,
Du hast das Objekt "Optionsgruppe" noch nicht verstanden.
Das sind keine "Gruppen" sondern die Optionen.
Eine Optionsgruppe gibt den Wert der gewählten Option zurück.
D.h. du musst nicht die einzelnen Optionen abfragen, sondern
die Gruppe


Das hatte ich ja im Eingangs-Post geschrieben, dass ich da keine Ahnung von habe.
Danke für den Code, den habe  ich ausprobiert- das/der Code funktioniert leider nicht.

Da ich den "Fehler" den ich mache irgendwie beschreiben muss , habe ich mir erlaubt, die von Access verwendete Bezeichnung aus der Steuerelemente-Auswahl zu verwenden: "Wählen Sie Ihr Steuerelement: ...Optionsgruppe hinzufügen".....
Wie soll ich es anders bezeichnen?

Auf meine Bezeichnungen angepasst- da funktioniert jetzt nicht einmal der Filter.
Private Sub ogrFormat_AfterUpdate()
    With Me
        Select Case .ogrFormat
        Case 1
            .frmDruckerFilterM.Form.Filter = "DINA4=True"
        Case 2
            .frmDruckerFilterM.Form.Filter = "DINA3=True"
        Case Else
            .frmDruckerFilterM.Form.Filter = ""
        End Select
        .frmDruckerFilterM.Form.FilterOn = (Len(.frmDruckerFilterM.Form.Filter) > 0)
    End With
End Sub

Klicke ich die "Optionsgruppe" an, gibt mir Access im VBA eine andere Eingangsbezeichnung vor, nämlich

Private Sub grpFormat_AfterUpdate()
    With Me

Das abändern auf diese Formulierung im Code hat leider ebenfalls keinerlei Effekt gehabt....

Wofür steht das "Len" vor der Klammer nach FilterOn?



Viele Grüße,
AstraDyne


Beaker s.a.

Zitatdass ich da keine Ahnung von habe.
Dann verschaff dir welche.
Zitatder Code funktioniert leider nicht.
Gut zu wissen ;-).
ZitatWofür steht das "Len" vor der Klammer nach FilterOn?
Setze den Cursor drauf und drücke F1. Hast du diese Taste und ihre
Funktion noch nicht entdeckt?

Der Grund warum der Code bei dir nicht funktioniert dürfte darin
liegen, dass du die Optionswerte nicht (richtig) gesetzt hast; -
Eigenschaftenblatt - Daten - Optionswert

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

AstraDyne

#6


Tut mir leid für dich, dass du das so siehst...
Vielleicht gibts ja jemanden, der mir meine Frage beantwortet. Ich war der Meinung, dafür ist so ein Forum da. Schade.

Beaker s.a.

ZitatIch war der Meinung, dafür ist so ein Forum da.
Ein Forum ist primär als "Hilfe zur Selbsthilfe" gedacht, - Access muss man lernen.

Einfacher wäre deine Anforderung i.Ü. umzusetzen wenn du für die Eigenschaften (Format,
Farbe, MFG) statteines Boolean-Feldes ein Zahlenfeld (Integer reicht) verwendest, - Namen
einfach nur "DIN", "SWFarbe", "MFGJ_N" . Dann eine Lookup-Tabelle für die Eigenschaften
einrichtest mit jeweils zwei Datensätzen (DINA3 und DINA4, SW und Farbe, Ja und Nein) und
deren PK in den entsprechenden Optionswerten hinterlegst.
Dann reduziert sich der Code wie folgt (Namen für Felder und Gruppen anpassen!)
Private Sub DeineGruppe_AfterUpdate() 'hier Gruppenname anpassen
    With Me
        .frmDruckerFilterM.Form.Filter = "DIN = " & .DeineGruppe 'hier Feld- & Gruppenname anpassen
        .frmDruckerFilterM.Form.FilterOn = True
    End With
End Sub
Du könntest auch noch jeweils eine dritte Option ("Alle", Wert 0) anlegen um den Filter
wieder auszuschalten
Private Sub DeineGruppe_AfterUpdate() 'hier Gruppenname anpassen
    With Me
        If .DeineGruppe > 0 Then
            .frmDruckerFilterM.Form.Filter = "DIN = " & .DeineGruppe 'hier Feld- & Gruppenname anpassen
            .frmDruckerFilterM.Form.FilterOn = True
        Else
            .frmDruckerFilterM.Form.Filter = ""
            .frmDruckerFilterM.Form.FilterOn = False
        End If
    End With
End Sub
gruss ekkehard

P.S.: Ganz vergessen; - statt der Checkboxen zur Auswahl der Eigenschaften musst du dann jeweils ein
Kombinationsfeld hernehmen.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)