Neuigkeiten:

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

Mobiles Hauptmenü

Formularfelder ausblenden

Begonnen von Rainer_73, Dezember 05, 2025, 15:53:20

⏪ vorheriges - nächstes ⏩

Rainer_73

Hallo,
ich bin ganz neu hier und alles, was ich bisher in Access gemacht habe, habe ich mir irgendwie selbst beigebracht. Dabei habe ich VBA bisher vermieden. Nun möchte ich aber ein Formular so einrichten, dass einige Felder nur angezeigt werden, wenn ein Ja/Nein-Feld aktiviert wurde.
Ich habe dazu untenstehenden Code eingegeben, bekomme dann aber immer eine Fehlermeldung "Fehler beim Kompilieren: Methode oder Datenobjekt nicht gefunden"

Markiert wird ".finanzierung". Kann es sein, dass dieses Feld nicht gefunden wird, weil es das nur in der Tabelle "Fahrzeuge" gibt? Falls ja, wie kann ich VBA dazu bringen, dass dieses Feld (und auch alle weiteren genannten Felder) in der Tabelle "Fahrzeuge" gefunden werden?

Hier nun der verwendete VBA-Code.

Private Sub Form_AfterUpdate()
' Prüfen, ob das Kontrollkästchen aktiviert (Ja/Wahr) ist
    If Me.finanzierung.Value = True Then
        ' Felder einblenden
        Me.eur_darlehnsbetrag.Visible = True
        Me.txt_zinssatz.Visible = True
        Me.txt_laufzeit.Visible = True
        Me.dat_auszahlung.Visible = True
        Me.dat_rate_beginn.Visible = True
        Me.dat_rate_ende.Visible = True
        Me.eur_annuität.Visible = True
        Me.eur_annuität_laufzeit.Visible = True
        Me.eur_zinsen_laufzeit.Visible = True
    Else
        ' Felder ausblenden
        Me.eur_darlehnsbetrag.Visible = False
        Me.txt_zinssatz.Visible = False
        Me.txt_laufzeit.Visible = False
        Me.dat_auszahlung.Visible = False
        Me.dat_rate_beginn.Visible = False
        Me.dat_rate_ende.Visible = False
        Me.eur_annuität.Visible = False
        Me.eur_annuität_laufzeit.Visible = False
        Me.eur_zinsen_laufzeit.Visible = False
    End If

End Sub

PhilS

Zitat von: Rainer_73 am Dezember 05, 2025, 15:53:20Markiert wird ".finanzierung". Kann es sein, dass dieses Feld nicht gefunden wird, weil es das nur in der Tabelle "Fahrzeuge" gibt? Falls ja, wie kann ich VBA dazu bringen, dass dieses Feld (und auch alle weiteren genannten Felder) in der Tabelle "Fahrzeuge" gefunden werden?
Die Fehlermeldung deutet tatsächlich darauf hin, dass es das Feld "finanzierung" in deinem *Formular* nicht gibt.
Tabellen sind hier nicht relevant, es geht ja um ein Formular. Schau im Entwurf des Formular nach, wie das  Kontrollkästchen, das an das Feld "finanzierung" gebunden ist, heißt. Falls der Name Kontrollkästchen123 ist, solltest du es umbenennen zu "Finanzierung" oder "chkFinanzierung"und diesen Namen dann in deinem Code verwenden.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Debus

Hey, generell würde ich aber mal versuchen, die vielen Felder zu einem Tag zusammen zu fassen. Wenn es immer die gleichen sind die ein oder ausgeblendet werden sollen.

Du kannst allen betroffenen Feldern im Eigenschaftsblatt (Register ,,Sonstiges") einen gemeinsamen Tag geben, z.B. Gruppe1. Dann wie folgt ein oder ausblenden:

Dim ctl As Control
    For Each ctl In Me.Controls
        If ctl.Tag = "Gruppe1" Then
            ctl.Visible = False
        End If
    Next ctl

Dim ctl As Control
    For Each ctl In Me.Controls
        If ctl.Tag = "Gruppe1" Then
            ctl.Visible = True
        End If
    Next ctl

Gruß
Holger







Bitsqueezer

Hallo,

ich empfehle Dir, die Umschaltung so zu machen:

Private Sub Form_AfterUpdate()
' Prüfen, ob das Kontrollkästchen aktiviert (Ja/Wahr) ist
    Dim bolSichtbar As Boolean
   
    bolSichtbar = (Me.finanzierung.Value = True)
    Me.eur_darlehnsbetrag.Visible = bolSichtbar
    Me.txt_zinssatz.Visible = bolSichtbar
    Me.txt_laufzeit.Visible = bolSichtbar
    Me.dat_auszahlung.Visible = bolSichtbar
    Me.dat_rate_beginn.Visible = bolSichtbar
    Me.dat_rate_ende.Visible = bolSichtbar
    Me.eur_annuität.Visible = bolSichtbar
    Me.eur_annuität_laufzeit.Visible = bolSichtbar
    Me.eur_zinsen_laufzeit.Visible = bolSichtbar

End Sub

Das spart 50% Code ein und es ist viel einfacher zu warten.
Solltest Du bei einem Feld die umgekehrte Logik brauchen, schreibst Du einfach:
Me.MeinFeld.Visible = Not bolSichtbar
Außerdem empfehle ich Dir, sowas in eine eigene Sub im Formularcode zu hinterlegen. Vorteil ist, daß Du die Aktualisierung der Sichtbarkeit dann von vielen Stellen aus aufrufen kannst, da wäre als erstes "Form_Current", wenn der Datensatz angezeigt wird.

Gruß

Christian





Rainer_73

Danke PhilS, das war schon mal ein Teil des Problems. Nachdem ich die Feldnamen im Formular nun angepasst habe, kann ich die Felder ein- und ausblenden. Allerdings leider nicht so, wie ich mir das vorgestellt habe.

Wenn ich das Ja/Nein-Feld namens Finanzierung aktiviere, muss ich erst die Bearbeitung schließen (auf den kleinen Stift unterhalb des Formulars klicken), dann werden alle anderen Felder eingeblendet. Und diese werden dann auch in den Datensätzen eingeblendet, in denen das Feld Finanzierung gar nicht aktiviert ist.
Hast du da auch noch eine Idee, was falsch sein könnte.

Doming

wie wäre es, das Ereignis des Kontrollkästchens zu nehmen, statt des Formulars?
Dann werden die betroffenen Felder direkt nach dem Klicken verschwinden.

Solche Formatierungsgeschichten lagere ich gern in eigene Sub um, dann wird der Ereigniscode übersichtlicher und man kann solche Formatierungen auch beim Wechsel des Datensatzes triggern (Form_Current).

Also
Kontrollkästchen_AfterUpdate
    Elementesicht Me.Kontrollkästchen
End Sub
----------------------------------------------------------------------------------
Private Sub ElementeSicht(Sichtbar As Boolean)
    Me.eur_darlehnsbetrag.Visible = Sichtbar
    Me.txt_zinssatz.Visible = Sichtbar
    Me.txt_laufzeit.Visible = Sichtbar
    Me.dat_auszahlung.Visible = Sichtbar
    Me.dat_rate_beginn.Visible = Sichtbar
    Me.dat_rate_ende.Visible = Sichtbar
    Me.eur_annuität.Visible = Sichtbar
    Me.eur_annuität_laufzeit.Visible = Sichtbar
    Me.eur_zinsen_laufzeit.Visible = Sichtbar
End Sub
 
Gruß
 Doming

Knobbi38

Hallo Rainer,

wenn du schon Präfixe für Steuerelemente verwendest, dann solltest du das auch durchgängig machen.

nur mal so am Rande ...

Knobbi38

MzKlMu

Hallo,
Zitat... nur mal so am Rande ...
Auch am Rande (und meine persönliche Meinung):
Ich würde auf Präfixe bei Feldnamen unbedingt verzichten. Die machen nur Arbeit und sind nicht wirklich hilfreich, im Gegenteil. Dass die annuität ein Währungsfeld ist erkennt man auch am Namen, da braucht es kein Präfix.

Warum ist z.B. Zinssatz und Laufzeit ein Textfeld, sollten das nicht Zahlen sein ?
Wenn Du das jetzt ändern willst, musst Du txt in ein anderes Präfix ändern. Und das überall, in Tabellen, Abfragen, Formularfeldern, VBA Code. Was dann der oben erwähnten Arbeit entspricht.

Um das noch mal klar zu stellen, ich meine nur die Präfixe in den Tabellenfeldern.
Gruß Klaus

Knobbi38

@klaus:

Ich finde Feldnamen mit Präfixen auch nicht so gut, aber ich bin von Steuerelementnamen ausgegangen, weil ich bei der Eigenschaft ".Visible" nicht auf ein Feld-Objekt schließe.

Gruß Knobbi38

PhilS

Zitat von: Rainer_73 am Dezember 05, 2025, 16:43:06Wenn ich das Ja/Nein-Feld namens Finanzierung aktiviere, muss ich erst die Bearbeitung schließen (auf den kleinen Stift unterhalb des Formulars klicken), dann werden alle anderen Felder eingeblendet. Und diese werden dann auch in den Datensätzen eingeblendet, in denen das Feld Finanzierung gar nicht aktiviert ist.
Hast du da auch noch eine Idee, was falsch sein könnte.
So direkt falsch ist da nichts.

Dein Code behandelt das Form_AfterUpdate-Ereignis. Das tritt ein, wenn der ganze Datensatz gespeichert wird. Du kannst, wie hier von anderen bereits vorgeschlagen, das AfterUpdate-Ereignis des Kontrollkästchens verwenden, damit der Code sofort nach der Änderung des Wertes ausgeführt wird.

Dass alle angezeigten Datensätze von dem Ausblenden der Steuerelement betroffen ist, ist in einem Endlosformular so. Das Formular ist für alle Datensätze gleich. Nur Eigenschaften, die eine unmittelbare Abhängigkeit von den Daten haben, werden pro Datensatz dargestellt.
Ein-/Ausblenden von Steuerelementen funktioniert in einem Endlosformular nicht pro Datensatz. Als Alternative kannst du eine Bedingte Formatierung verwenden. Damit könntest du die nicht benötigten Steuerelemente, abhängig von dem Wert in Finanzierung, aktivieren oder deaktivieren.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

MzKlMu

@Ulrich
Zitataber ich bin von Steuerelementnamen ausgegangen,
Auch dann ist das von mir gesagte zutreffend. Wobei ich überzeugt bin, dass die Tabellenfelder auch so benamt sind.
Gruß Klaus