Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: Cherry Brandy am März 10, 2026, 23:57:29

Titel: Kombifelder leeren
Beitrag von: Cherry Brandy am März 10, 2026, 23:57:29
Hier: zu Access 2021 unter Windows 11

Guten Abend,
ich bin Laie, ,,langjähriger fortgeschrittener Anfänger" und bei meiner aktuellen DB mal wieder an meine Grenzen gestoßen, weswegen ich auf Tipps und Korrektur hoffe.

Konkret bastele ich an einer Vokabeldatenbank. Meine Tabelle

tbl_Vokabeln hat u.a. folgende Felder
ID_Vokabeln
txt_Deutsch
txt_Chinesisch
txt_Pinyin                  Pinyin ist ein System zur Umschrift der Schriftzeichen auf lateinische Buchstaben)

In meinem Formular frm_Vokabeln wird jede Vokabel mit einigen weiteren Informationen angezeigt.
Zur Auswahl habe ich drei Kombifelder angelegt, mit denen ich einen Vokabeldatensatz durch das deutsche Wort, das chinesische Wort oder die Umschrift auswählen kann.

Ich habe die Kombifelder (anfängerfreundlich) mit Access-Bordmitteln über das Makroereignis ,,nach Aktualisierung" Suchen nach Datensatz, Aufnahme: Erster, Bedingung: ="[ID_Vokabeln] = " & Str(Nz(Screen.ActiveControl;0)) angelegt und alles funktioniert gut.

Nun ärgert mich aber – zum wiederholten Male in einer meiner Datenbanken –, dass in den Kombifeldern immer der zuletzt gewählte Begriff aus dem Datensatz stehenbleibt. Wenn ich z.B. auf Deutsch ,,Haus" auswählen und anschließend einen weiteren, anderen Vokabelsatz über den chinesischen Begriff z.B. für ,,Auto", bleibt auch bei Auswahl des zweiten Datensatzes im ersten Kombifeld der Begriff ,,Haus" stehen.
Das stört mich maßlos.

Daher habe ich versucht, per VBA die Kombifelder zu leeren. Es sind Kombinationsfeld174, Kombinationsfeld180 und Kombinationsfeld285 – und ja, es ist mir an dieser Stelle bewusst und unangenehm, dass ich sie nicht besser benannt/umbenannt habe.  :-[

Der folgende VBA-Code macht jedoch genau was er soll:
Private Sub Kombinationsfeld285_Exit(Cancel As Integer)
  If Not IsNull(Me.Kombinationsfeld285) Then
    Me.Kombinationsfeld174 = Null
    Me.Kombinationsfeld180 = Null
    Me.Requery
  End If
End Sub

Private Sub Kombinationsfeld174_Exit(Cancel As Integer)
If Not IsNull(Me.Kombinationsfeld174) Then
Me.Kombinationsfeld285 = Null
Me.Kombinationsfeld180 = Null
Me.Requery
End If
End Sub

Private Sub Kombinationsfeld180_Exit(Cancel As Integer)
If Not IsNull(Me.Kombinationsfeld180) Then
Me.Kombinationsfeld174 = Null
Me.Kombinationsfeld285 = Null
Me.Requery
End If
End Sub

Mein Problem:
es funktioniert nur entweder-oder. ENTWEDER die Kombifelder suchen den richtigen Datensatz aus aber die Felder bleiben voll ODER der Code leert die Felder, aber es wird auch nach Auswahl und Verlassen des Kombifeldes nur der erste Datensatz angezeigt.

Meine diversen Versuche, entweder Kombifeldauswahl und Leeren verschiedenen Ereignissen zuzuordnen oder VBA-Code (wie Me.Recordset.FindFirst "ID_Vokabeln = " & Me.Kombinationsfeld174 oder Tests mit Me.Dirty oder Recordset.Bookmark) zu erraten, endeten alle in den unterschiedlichsten Fehlermeldungen.
An der Stelle merke ich, dass ich programmieren nie richtig gelernt, sondern immer so vor mich hingewurschtelt habe.

Ich wäre Euch dankbar für Tipps, wie ich das umsetzen kann.
Ich werde noch ca. 20 Minuten hier im Forum sein und dann erst ab morgen Nachmittag wieder nachsehen können. Vielen Dank schon mal vorab!
Titel: Re: Kombifelder leeren
Beitrag von: Knobbi38 am März 11, 2026, 09:30:06
Hallo,

zunächst würde ich mal sagen, dass deine Tabellen nicht normalisiert sind. Das solltest du auf jeden Fall tun, bevor du dich der GUI nzw. den Formularen zuwendest.

Als Lösung für dein Problem würde ich dir vorschlagen, dass du in den Komboboxen AfterUpdate Ereignis eine Suchbedingung zusammensetzt und dann eine gemeinsame Prozedur aufrufst, welche die jeweils anderen Komboboxen "leert" und mir FindFirst entsprechend der Suchbedingung auf den passenden DS, wenn vorhanden, positioniert.

Ist kein großes Ding, aber wie gesagt, musst du erstmal das Datenmodell etwas aufbereiten.

Knobbi38
Titel: Re: Kombifelder leeren
Beitrag von: Bitsqueezer am März 11, 2026, 09:33:37
Hallo,

am besten erst mal die Namen anpassen, je länger man das hinausschiebt, desto schwieriger wird es später.

Makros solltest Du tunlichst vermeiden, ein Mischmasch aus Makros und VBA kann man kaum debuggen, und alles, was Du mit Makros machen kannst, kannst Du immer auch in VBA machen. Also am besten vergessen, daß es Makros gibt und gleich richtig programmieren.

Der gezeigte VBA Code löscht die jeweils anderen beiden Komboboxen und führt dann einen Requery aus. Das lädt alle Datensätze neu und springt zum ersten Datensatz im Recordset.

Du mußt Dich mit der Reihenfolge der Events beschäftigen, siehe hier:
https://support.microsoft.com/de-de/topic/reihenfolge-von-ereignissen-f%C3%BCr-datenbankobjekte-e76fbbfe-6180-4a52-8787-ce86553682f9#bm1

Auszug von dort:
Die Ereignisse Exit und LostFocus für ein Steuerelement, dessen Wert sich ändert, treten nach den Ereignissen BeforeUpdate und AfterUpdate auf

Die Suche führst Du in "AfterUpdate" aus, es wird also gesucht, danach erst tritt Exit auf und Du leerst die Komboboxen und führst ein Neuladen des Recordsets aus, was wieder auf den ersten Datensatz springt.

Also:
1. Konsequent bei VBA bleiben
2. Events und ihre Reihenfolge kennenlernen (Exit wird in der Praxis fast nie verwendet, i.d.R. immer AfterUpdate)
3. Requery kennenlernen und richtig anwenden (zum Suchen brauchst Du das nicht)

Gruß

Christian