Access Formulardaten mit VBA in Tabelle schreiben

Igäl

Erfahrenes Mitglied
Werte Gemeinde

Nach einiger Zeit Programmierabstinenz (Berufswechsel, Kind- und Kegel, was halt so dazwischen kommt) wage ich mich wiedereinmal an ein neues Projekt. Meine Kenntnisse in PHP / Mysql sind einigermassen profund, was mir beim Einstieg in VBA für Access hilft. Doch gibt es den einen oder anderen Stolperstein auf meinem Weg. Und einen davon habe ich nun bereits am Anfang schon. Verzeiht, falls das schon besprochen wurde, aber auch die Parametrisierung meiner Suche wird sich erst mit mehr Kenntnissen verfeinern :)

Folgende Ausgangslage zu Testzwecken:
Ich habe zwei Tabellen ("tblCity" / "tblKanton"). In "tblKanton" gibt es nur den Primärschlüssel als AutoWert und den Namen des Kantons. In der Tabelle "tblCity" gibt es den Primärschlüssel als AutoWert, den Namen der Stadt ("txtCityName") und "intKantonID" als Fremdschlüssel.

Meine erste, vermeintlich einfache Aufgabe: Ich möchte mittels Formular eine neue Stadt in die Tabelle "tblCity" eintragen (ohne Dropdown mit Kantonsnamen, Buttons etc. sondern via Direktfenster im VBA-Editor).

Dafür gibt es zwei Textfelder, die die Werte enthalten. In einer Testtabelle, mit nur einem Textfeld hat mein Codesnipet gut funktioniert. Der Wert eines Textfeldes wurde in die Tabelle eingetragen.

Bei zwei Textfeldern habe ich aber nun das Problem, dass folgende Debug-Meldung kommt: "Sie können auf die Eigenschaften oder Methoden eines Steuerelements nur verweisen, wenn das Steuerelement den Fokus hat". Wenn der Fokus im Formular auf dem ersten Textfeld liegt, zeigt mir der Debugger die Zuweisung des Wertes des zweiten Textfeldes an und vice versa.

Ich übersehe hier wohl ein grundlegendes Prinzip. Weil es liegt ja in der Natur der Sache, dass nur eines (oder später mit Buttons gar keines) der Felder den Fokus hat.

Darum meine Frage:
- Wie ist es möglich, die Werte aus allen Textfeldern in die verschiedenen Spalten der entsprechenden Tabelle zu schreiben?

Codesnipet:

Visual Basic:
Sub doInsert()
    Dim City As String
    Dim Canton As Integer
    Dim Wofueristdas As String
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
      
    City = Form_formAddCity.txtAddCityName.Text
    Canton = Form_formAddCity.txtAddKantonID.Text
  
    Set db = CurrentDb
    Set rs = db.OpenRecordset("tblCity", dbOpenDynaset)
  
    rs.AddNew
    rs!txtCityName = City
    rs!intCantonID = Canton
    rs.Update

    Wofueristdas = MsgBox("Successful", 0)
End Sub

Danke für die Geduld und die eventuelle Hilfe.

Gruss, dä Igäl
 
Lösung
Click-Event:
Den Event direkt im VBA hinter dem Formular Abfangen. Am einfachsten im Formularentwurf in den Eigenschaften in dem Klick-Event gehen. Ereignissprozedure auswählen und dann auf den Knopf mit den 3 Punkten klicken.
1675865622583.png
Visual Basic:
City = Form_formAddCity.txtAddCityName.Value
Canton = Form_formAddCity.txtAddKantonID.Value

Generell: Würde eher vielleicht modulweite Variablen nutzen.
Dann kannst du auch im Exit-Ereignis des jeweiligen Textfeldes zuweisen (ungetestet jedoch).

Ich mach zu wenig (bis gar nichts) in Access-VBA, von daher kenn ich diese Fehlermedlung gar nicht
 
Auf die Felder solltest du mit ! zugreifen und nicht mit .
Punkt wird für Eigenschafte & Funktionen verwendet. Das ! für Elemente innerhalb einer Liste.
Zudem würde ich das Formular aus der Formularliste auswählen.

Probier mal
Visual Basic:
City = forms("formAddCity")!txtAddCityName
 
Danke für den Hinweis mit dem Ausrufezeichen. Das Ergebnis war jedenfalls dasselbe. Habe aber ein Workaround gefunden:

Visual Basic:
    Forms("formAddCity")!txtAddCityName.SetFocus
    City = Forms("formAddCity")!txtAddCityName.Text
    Forms("formAddCity")!txtAddKantonID.SetFocus
    Canton = Forms("formAddCity")!txtAddKantonID.Text

Nur dünkt mich das irgendwie unsauber, respektive vermute ich, dass die Sprache in irgendeiner Art selber durch die Felder von Formularen iterieren kann. Oder täusche ich mich?
 
Schneller Test. Die Dinger heissen bei dir natürlich anders
Visual Basic:
    Dim ctr As Control
    For Each ctr In Forms("FRM_TEST").Controls
        'Verstecktes Property controlType des Types AcControlType.
        'Findet man mit Debuggen -> Shift+F9 auf die Variable und im Watch-Windows anzeigen lassen
        If ctr.ControlType = AcControlType.acTextBox Then
            Debug.Print ctr.name, ctr.text
        End If
    Next ctr

Im Watchwindow (heisst ev. in der deutschen Version anders) kann man anschauen, was das Objekt für Eigneschafte hat. Auch solche die nicht direkt im CodeWindow zur AUswahl stehen
1675860595451.png
 
Interessant. Eigentschaft "Typ" --> "Control/TextBox" übernimmt den eingegebenen Wert. Danach wird aber dieselbe Fehlermeldung, wonach nur auf das Steuerelement verwiesen werden kann, das den Fokus hat, ausgeworfen. Ev. kann innerhalb der Schleife jeweils der Fokus gesetzt werden. Mit

Forms("formAddCity")!ctr.Name.SetFocus

innerhalb der Schleife, bin ich jedoch gescheitert. "ctr" und auch "ctr.Name" (wenn ich ctr.Name im obigen Ausdruck in eckige Klammern schreibe) kann nicht gefunden werden. Sieht aber auch nicht richtig aus. Nun weiss ich nicht genau, wie ich die nächste Textbox ansprechen muss, um sie in Fokus zu nehmen.
 
Jedenfalls würde mir mein Workaround atm reichen, da ich wohl irgendwann auf eine solidere Lösung stossen werde und meine Übungsformulare noch nicht so wahnsinnig umfangreich sind.

Woran ich momentan jedoch komplett scheitere ist nur schon, wie ich einen Klick auf einen Button abfange.

Visual Basic:
Sub btnAddCitySubmit_Click()
    MsgBox ("Üble Sache, Maloney")
End Sub

Es tut sich nichts. In den Anleitungen, die ich dazu gefunden habe, wird nur via Buttonname_Click() referenziert. Ich dachte mir, dass ich vlt noch sagen muss, in welchem Formular sich der Button befindet, aber wenn ich Forms("undsoweiter") voran stelle, bekomme ich Syntaxerrors. Kennt jemand vielleicht ein gescheites Tutorial, wie man mit Access und VBA ein gescheites Frontend herstellt? Dann kann ich mir da den einen oder anderen Trick abschauen.
 
Jedenfalls würde mir mein Workaround atm reichen, da ich wohl irgendwann auf eine solidere Lösung stossen werde und meine Übungsformulare noch nicht so wahnsinnig umfangreich sind.

Woran ich momentan jedoch komplett scheitere ist nur schon, wie ich einen Klick auf einen Button abfange.

Visual Basic:
Sub btnAddCitySubmit_Click()
    MsgBox ("Üble Sache, Maloney")
End Sub

Es tut sich nichts. In den Anleitungen, die ich dazu gefunden habe, wird nur via Buttonname_Click() referenziert. Ich dachte mir, dass ich vlt noch sagen muss, in welchem Formular sich der Button befindet, aber wenn ich Forms("undsoweiter") voran stelle, bekomme ich Syntaxerrors. Kennt jemand vielleicht ein gescheites Tutorial, wie man mit Access und VBA ein gescheites Frontend herstellt? Dann kann ich mir da den einen oder anderen Trick abschauen.
*seufz*

Visual Basic:
City = Form_formAddCity!txtAddCityName.Value
Canton = Form_formAddCity!txtAddKantonID.Value
*michwiederhol*
 
Click-Event:
Den Event direkt im VBA hinter dem Formular Abfangen. Am einfachsten im Formularentwurf in den Eigenschaften in dem Klick-Event gehen. Ereignissprozedure auswählen und dann auf den Knopf mit den 3 Punkten klicken.
1675865622583.png
 
Lösung
Asche auf mein Haupt Zvoni. Werde das jetzt umsetzen :)

Danke Yaslaw. Danke euch beiden für die Hilfe. Werde das bei Gelegenheit versuchen. Hoffentlich habe ich die Basics bald. Es ist ungewohnt, mit Access zu arbeiten. Mit PHP hatte ich wenigstens im Griff, wo ich die Werte herbekomme :)
 
Zurück