Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Feld im UF per VBA setFocus

Begonnen von Nicolo#22, August 19, 2026, 09:18:16

⏪ vorheriges - nächstes ⏩

Nicolo#22

Guten Morgen liebe Experten
Seit Stunden scheitere ich an einem für euch sicher simplen Fehler.
Aus ein HF mit einem UF wird mit VBA der Focus auf das erste vorhandene Feld gesetzt.
Das ist der Codeteil der dieses macht.
With subFrmKostenartKontoUfo
    .Form.PositionToLastRecord
    subFrmKostenartKontoUfo.SetFocus
  End With
  End Sub

Ich möchte aber den Focus in das Feld mit der Bezeichnung txtBuchDatum haben, aber in einem NEUEN Datensatz, nicht im LETZTEN.
Das wäre der Codeabschnitt dazu:
  With subFrmKostenartKontoUfo
    .Form.PositionToLastRecord
    subFrmKostenartKontoUfo.txtBuchDatum.SetFocus
  End With
  End Sub
Aber der erzeugt eine Fehlermeldung DATENOBJEKT NIVHT GEFUNDEN
Obwohl die Schreibweise des Feldes korrekt ist. Das Feld ist ein Datumsfeld.

Habe jeweils nur den entsprechenden Codeteil eingefügt.
Die kpl. Codes stammen von Knobbi38 glaube ich.

VG

Doming

Moin Nicolo,

versuch mal
  With Me!subFrmKostenartKontoUfo.Form
    .SetFocus
    DoCmd.GoToRecord , , acNewRec
    .Controls("txtBuchDatum").SetFocus
  End With

Gruß
 Doming

Knobbi38

#2
ZitatsubFrmKostenartKontoUfo.txtBuchDatum.SetFocus
Damit adressierst du irgendetwas, aber bestimmt kein Feld in einem Unterformular! Hier ist nochmal alles erklärt:
https://msofficeinside.blogspot.com/2017/12/access-fokus-auf-das-erste-mogliche.html

Wichtig ist die Reihenfolge:
' 1. Fokus auf das Unterformular-Steuerelement setzen
Me.NameDesUnterformularSteuerelements.SetFocus

' 2. Im Unterformular zu einem neuen Datensatz springen
DoCmd.GoToRecord , , acNewRec

' 3. Fokus auf das gewünschte Feld im neuen Datensatz setzen
Me.NameDesUnterformularSteuerelements.Form.NameDesFeldes.SetFocus
Allerdings sollte man dafür besser eine Prozedur im UF schreiben, welche dann vom HF aus aufgerufen wird - das wäre dann eine sauberere Lösung. Bitte verwende dann im UF anstatt DoCmd.GotoRecord besser DoCmd.RunCommand acCmdRecordsGoToNew, damit das Fokushandling stabiler funktioniert.

Knobbi38

PS:
verwende bitte die üblichen Namenskonventionen und für das SubForm-Steuerelement und das darin geladene Formular unterschiedliche Präfixe. Das Hilft anderen, den Code besser lesen zu können und vermeidet Folgefehler.

Nicolo#22

Hallo Knobbi38
Genau diese "Prozedur" hab ich, sie stammt von dir. Ich selber kann sowas nur begrenzt.
Dieser Code hat keine Me Anweisungen.

Der betreffende Teilcode ist so: Er setzt den Focus auf die "BuchID" des letzen DS.
Die BuchID steht im UF als ERSTES.

Wunsch wäre aber der Fokus auf dem Feld BuchDatum in einem NEUEN DS.

With subFrmKostenartKontoUfo
    .Form.PositionToLastRecord
    subFrmKostenartKontoUfo.SetFocus
  End With
  End Sub

Da ist nix mit Me. ??
Ersetze ich .Form.PositionToLastRecord  durch .Form.PositionToNewRecord, kommt eine Fehlermeldung.

Ich hab es geschafft den Focus in das Feld "txtBuchDatum" zu bekommen aber
leider im letzten Datensatz, nicht in einem neuen DS.

Das alles scheint mir mit dieser "sub" Funktion zusammen zu hängen.

1.  subFrmKostenartKontoUfo.SetFocus. Die setzt den Focus auf das UF.
2.  .Form.PositionToLastRecord. Springt zum letzen DS im UF. Richtig?

wobei das die jetzige Reihenfolge ist. Erst 1. dann 2.

Verwirrung pur. :)

Knobbi38

Ich glaube nicht, dass der Code so von mir ist, denn WITH verwende ich sehr selten und in diesem Kontext eher nicht.

Me ist ein Schlüsselwort und meint genau das, was es heisst:  es bezieht sich auf sich selber, in diesem Fall ein Formular. Steht der Code im HF, bezieht sich das auf das HF, und im UF dann auf das Unterformular - nicht mehr und nicht weniger.

debug.print me.namewürde also immer den Namen des Formulars im Direktfenster ausgeben in dem die Zeile steht.

Die Bedeutung der Schritte sind genau kommentiert, du musst das nur auf deine Gegebenheiten anpassen. Erstelle im UF z.B. eine Prozedur "Public Sub Kikiralla" mit den Anweisungen für einen neuen DS anzulegen und den Fokus auf das entsprechende Steuerelement zu setzen. Danach rufst du diese neue Prozedur aus dem HF auf:

Me.NameDesUnterformularSteuerelements.Form.Kikiralla
Ob mit me. oder ohne me. ist hier egal.

Mit
ZitatErsetze ich .Form.PositionToLastRecord  durch .Form.PositionToNewRecord, kommt eine Fehlermeldung.
kann  ich nichts anfangen, denn ".PositionToLastRecord" ist keine "übliche" Methode eines Formulars.

Knobbi38

PS:
Hatten wir das nicht schon mal?
https://www.access-o-mania.de/forum/index.php?topic=28649.0

Nicolo#22

Hallo Knobbi38
Das ist sehr wohl von dir, alles genauso.
Im Beitrag von mir mit dem Titel "Kein Eintrag im Textfeld WENN"
Dort ist die Beispiel DB die von dir bearbeitet wurde.
Dort stehen bzw. steht der Code genauso.

Ich bin der Ansicht ich habe schon im UF eine Prozedur die gut ist.
Ich wollte diese nur erweitern / ergänzen, so das eben wie oben beschrieben,
der Focus im UF nicht am Anfang der letzten DS landet, sondern
in einem neuen DS im Feld mit dem Namen "txtBuchDatum".

Das der Focus dort landet hab ich zwar geschafft, aber im letzten DS und nicht im neuen DS.
Hier mal der ganze Code der das macht.
Private Sub cmbKtoID_AfterUpdate()
  MsgBox "Das DATUM bitte einstellen, Eingaben sind teilweise gesperrt", vbInformation, "ACHTUNG INFO!!"
'  MsgBox "DATUM eingestellt?", vbInformation, "Rückfrage!!"
  Dim strKriteria As String

  strKriteria = BuildCriteria("KontenID", dbLong, cmbKtoID.Value)

  Debug.Print "Kriterium:"; strKriteria
  Recordset.FindFirst strKriteria
  cmbKtoID.Value = Null

  With subFrmKostenartKontoUfo
    subFrmKostenartKontoUfo.SetFocus
    .Form.PositionToLastRecord
    .Form.txtBuchDatum.SetFocus
  End With
  End Sub

Knobbi38

Du hast Recht und die Codezeilen darfst du gerne wieder ändern. Warum ich das dort so geschrieben habe, kann ich jetzt auch nicht mehr nachvollziehen. 

Das Beispiel zeigt die aber genau, wie du in einem Unterformular eine Prozedur erstellst und diese dann aufrufst. Anstatt die Prozedur "PositionToLastRecord" zu ändern, der Name wäre dann ja sowieso falsch gewählt, schreibst du eine neue Prozedur, die genau das macht, was oben schon beispielhaft ausgeführt worden ist. Also einen neuen DS anlegen und dann den Fokus auf die gewünschte Textbox setzen. Die alte Prozedur dann natürlich nicht mehr aufrufen!

Nicolo#22

Zitat von: Knobbi38 am August 19, 2026, 20:11:53Du hast Recht und die Codezeilen darfst du gerne wieder ändern

Habe ich einfach mal durch testen gestern gegen 18 Uhr dann auch hinbekommen.
So schwer war das jetzt nicht. Man muss nur klar und logisch denken. Grad bei Access ist es aber möglich ein
Ziel auf unterschiedliche Wege zu erreichen.
Sieht man an deiner Reaktion, heute würdest du Details anders lösen, denke ich.
Das macht ein Problem (oder eine Aufgabe) nicht einfacher für User/Anwender wie mich.
Ich habe schon viel gelernt, auch durch das Forum hier und die Hilfen die ich immer nekommen habe.
Dafür Danke. Auch wenn ihr es nicht immer einfach habt mit mir.

Bevor ich hier poste, suche ich immer im Netz nach Möglichkeiten und teste. Aber oft sind meine Vorstellungen zu speziell.

Deine Frage in #4 "Hatten wir?"
Ja wir hatten. Gleiche Datenbank. Aber ich wollte diese Feinheiten (wie oben beschrieben) noch einbauen.
Auf diese Weise wird eine DB immer besser.
Diese hier, um die es geht ist schon ziemlich komplex ( für meinen Wissensstand)

Schöne Woche noch. :)

Knobbi38

Danke für die Rückmeldung und dann noch viel Spaß mit den neuen Features in deiner DB.

Gruß
Knobbi38