Neuigkeiten:

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

Mobiles Hauptmenü

Makro Konvertierung "Neuer Mitarbeiter"

Begonnen von Hpseel, Februar 02, 2026, 15:13:14

⏪ vorheriges - nächstes ⏩

Hpseel

Hallo,
drei Fragen:

1. Könnte mir jemand das Makro "Neuer Mitarbeiter" aus der Nordwind-DB nach VBA konvertieren?
   (die Konvertierfunktion ist bei mir ausgegraut)
   (ich brauche es als VBA, um bestimmte Datenfelder im neuen Record vorzubesetzen)

2. Wofür sind im Makro die "Refresh" Aktionen?

3. Bekommt man mit DomMax die letzte gültige ID, oder die nächste freie?
   Wie kommt dann ggf. "+1" zustande für die nächste freie ID?

Schon mal vielen Dank !!!
Hps
   

Bitsqueezer

Hallo,

normalerweise gibt es für alle Makro-Befehle ein Pendant in VBA per "DoCmd".
Du mußt also nur die einzelnen Befehle mit DoCmd und dem passenden (natürlich englischen) Namen aufrufen und kannst dort die gleichen Parameter verwenden. Mehr macht der VBA-Konvertierer auch nicht.

Ob das gerade "gutes" VBA ist, bezweifle ich zwar stark, aber so kannst Du jedes Makro konvertieren.

Der Code wird nicht gerade sehr lang sein, Du könntest dann auch gleich darüber nachdenken, das in "richtiges" VBA umzuwandeln. Es gibt natürlich Ausnahmen wie "DoCmd.OpenForm", was man i.d.R. so beläßt.

Gruß

Christian

werner budde

Zitat von: Hpseel am Februar 02, 2026, 15:13:14Bekommt man mit DomMax die letzte gültige ID, oder die nächste freie?
   Wie kommt dann ggf. "+1" zustande für die nächste freie ID?

Dommax liefert den aktuell höchsten Wert.
Vorsicht: (Dieser + 1) ist ggf. nicht mehr frei!
Wenn das ID-Feld ein Autowert-Feld ist, kann es folgende Konstellation geben:
es wurden bereits allerneueste Datensätze wieder gelöscht, welche eine höhere ID hatten als der jetzt höchste. Die Autowert-ID's  gelöschter Datensätze werden nie wieder neu vergeben.
Gruß Werner

PhilS

Zitat von: Hpseel am Februar 02, 2026, 15:13:141. Könnte mir jemand das Makro "Neuer Mitarbeiter" aus der Nordwind-DB nach VBA konvertieren?
  (die Konvertierfunktion ist bei mir ausgegraut)
Es gibt über die Jahre einige verschiedene Versionen der Nordwind-DB. In meiner sind keine Refresh-Aktionen im Makro, daher vermute ich, dass wir nicht von derselben Version reden.
Du kannst das Makro konvertieren, indem du ein neues Makro erstellst, dir den Katalog der Makro-Aktionen einblendest, darin das bestehende "Neuer Mitarbeiter"-Makros auswählst und dann "Kopie von Makro hinzufügen" aus dem Kontextmenü ausführtst.
Damit hast du die Aktionen des "Neuer Mitarbeiter"-Makros in deinem neuen Makro und kannst es nach VBA konvertieren. - Aber Vorsicht: Das ursprüngliche Makro lief im Kontext eines Formulars und der neue, konvertierte VBA-Code ist unabhängig in einem Modul. D.h. der erzeugte VBA-Code funktioniert u.U. nicht mehr so wie das ursprüngliche Makro. Das ist vermutlich auch der Grund, warum man diese Embedded Macros nicht konvertieren kann.

Zitat von: Hpseel am Februar 02, 2026, 15:13:142. Wofür sind im Makro die "Refresh" Aktionen?
Die gibt es bei mir nicht.

Zitat von: Hpseel am Februar 02, 2026, 15:13:143. Bekommt man mit DomMax die letzte gültige ID, oder die nächste freie?
  Wie kommt dann ggf. "+1" zustande für die nächste freie ID?
Alle Domänen-Aggregatfunktionen beziehen sich immer auf bestehende Daten.
Deine Frage zu +1 verstehe ich nicht.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Hpseel

Vielen Dank für eure Hinweise!
Ich komme erst in den nächsten Tagen dazu, sie auszuprobieren.
Ich werde dann Bescheid geben.

VG Hps

jens05

Hallo
vielleicht als Konvertierung des gewünschten Makros
    With CodeContextObject
        DoCmd.OpenForm "Mitarbeiterdetails", acNormal, "", "1=0", , acDialog
        On Error Resume Next
        DoCmd.Requery ""
        DoCmd.SearchForRecord , "", acFirst, "[ID]=" & Nz(DMax("[ID]", .Form.RecordSource), 0)
    End With
mfg
jens05

Hpseel

Vielen Dank für eure Antworten und das Darstellen des konvertierten VBA Codes.

Kann mir jemand erklären, wie durch "Suchen des letzten Datensatzes" quasi "automatisch" ein leeres Eingabeformular für die Personal-Daten erscheint?

Verwendet das Makro hier irg.einen eingebauten "Trick"?
(den man in VBA nur sehr schwer nachbilden kann?)

VG HPS

Bitsqueezer

Hallo,

der "Trick" besteht darin, als WHERE-Bedingung in OpenForm "1=0" zu schreiben.
Das ist eine Bedingung, die niemals wahr wird, und damit bekommst Du immer ein leeres Formular. Wenn die RecordSource das Anhängen eines neuen Datensatzes erlaubt, bist Du bereits auf der neuen Zeile.

Der folgende Code bedeutet: Da das Formular mit "acDialog" geöffnet wurde, hat es den unbedingten Fokus (modales Formular) und VBA wartet bei diesem Kommando an dieser Codezeile (OpenForm) darauf, bis das Formular geschlossen wurde.

Damit bezieht sich "Requery" und "SearchForRecord" auf das Formular, daß das andere Formular mit OpenForm geöffnet hat.
Da VBA nach dem Schließen hier weitermacht, wird ein Requery angestoßen, um mögliche Änderungen im zuvor geöffneten Formular im aktuellen mit anzuzeigen, außerdem mit Search dann auf die höchste ID zu springen. Das aktuelle Formular zeigt daher wohl eine Liste von Mitarbeitern an und der Code soll einen neu eingegebenen Mitarbeiter im aktuellen Formular anzeigen.

Gruß

Christian

Hpseel

Vielen Dank, vor allem Bitsqueezer!

Jetzt ist mir Vieles klar geworden,  und ich glaube, vielen anderen Lesern auch!
Das scheint so eine "Schlüsselstelle" in der Nordwind-DB zu sein, über die wohl schon viele gegrübelt haben...

Dies ist wirklich ein prima Forum !!!

VG Hps

Knobbi38

Hallo,

einfacher und verständlicher ist es vielleicht, wenn beim Öffnen der DataMode-Parameter mit acFormAdd übergeben wird:
DoCmd.OpenForm Formname:="Mitarbeiterdetails", DataMode:=acFormAdd, WindowMode:=acDialog
Das ist zwar eine 1:1 Umsetzung des Makros, aber normalerweise werden Makroaufrufe in VBA mit DoCmd vermieden und durch native Objektmethoden ersetzt, also Form.Requery und anstatt SearchForRecord eine Find Methode des Recordsets. Lediglich für OpenForm gibt es keine direkt passende Entsprechung. 

Knobbi38

Bitsqueezer

Hallo,

das kann man so auch nicht sagen. Lediglich acDialog ist ein besonderer Parameter, weil er den VBA-Code im aufrufenden Formular anhält, bis das aufgerufene Formular geschlossen wurde.

Das geht natürlich auch in VBA mit Objektmethoden, es ist nur eine ganze Ecke aufwendiger. Man verwendet eine Formular-Objektvariable mit WithEvents-Deklaration, dann kann man einen Event im Formular definieren und dort in Form_Close oder Form_Unload feuern. Das aufrufende Formular bekommt die passende Eventsub und kann dann auf das Schließen des anderen Formulares reagieren. Nebenbei kann dem Event die erzeugte ID auch gleich als Parameter mitgegeben werden, so daß man gezielt positionieren kann, statt einfach "blind" nach der höchsten ID zu suchen, die auch die eines anderen Users sein könnte.

Das wäre die entsprechende VBA-Methode, aber das wird eher sehr selten so gemacht, eben weil acDialog so schön einfach ist.

Gruß

Christian