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
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
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.
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.
Vielen Dank für eure Hinweise!
Ich komme erst in den nächsten Tagen dazu, sie auszuprobieren.
Ich werde dann Bescheid geben.
VG Hps
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
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
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
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
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
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
@ Christian
Zitat... das kann man so auch nicht sagen.
Das es auch noch andere Möglichkeiten gibt, war schon klar. Deshalb habe ich ja auch davon geschrieben , dass es "... keine
direkt passende Entsprechung", ich hätte auch "einfache" schreiben können, gibt.
Da von dem Erzeugen einer neuen Formularinstanz in VBA so selten Gebrauch gemacht wird, habe ich von der Erwähnung abgesehen, zumal es hier nicht um fortgeschrittene Techniken ging. Das wäre dann eine ganz andere Baustelle, bei der es doch einiges zu beachten gibt.
Grüße Ulrich
Hallo Ulrich,
das ist allerdings Haarspalterei.
Der Satz liest sich für mich, als ob es KEINE Entsprechung gäbe und ich denke, daß ich nicht der Einzige bin, der das so liest. Ich wollte damit klarstellen, daß es in VBA IMMER eine Entsprechung gibt, auch wenn sie ggf. aufwendiger ist. Damit nicht der Eindruck entsteht, daß es irgendeinen DoCmd-Makro-Befehl gibt, den man nicht durch VBA ersetzen kann.
Gruß
Christian
Huh,
Haarspalterei wollte ich eigentlich nicht betreiben und habe ich auch nicht so gemeint.
ZitatVBA IMMER eine Entsprechung gibt, auch wenn sie ggf. aufwendiger ist
Wohl war, wenn du passende Entsprechungen zu SendObject() hast, immer her damit.
Gruß Knobbi38
Hallo Ulrich,
schau in die Doku, da steht, wie es in VBA geht ohne SendObject:
https://learn.microsoft.com/en-us/office/vba/api/access.docmd.sendobject?f1url=%3FappId%3DDev11IDEF1%26l%3Den-US%26k%3Dk(vbaac10.chm4180)%3Bk(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue
Gruß
Christian
Das MS dabei das eigene Produkt Outlook ins Spiel bringt, ist klar, aber wie sieht es z. B. mit Thunderbird aus, das ja mit SendObject funktioniert, obwohl keine COM-Schnittstelle angeboten wird? Immerhin kann so über die MAPI-Schnittstelle eine E-Mail versendet werden. Mit VBA allein ist so etwas nur indirekt über die Kommandozeile möglich. Es gibt sicherlich auch noch andere Komponenten, mit denen man E-Mails versenden kann, die aber nicht immer zur Verfügung stehen oder bei denen es andere Restriktionen gibt.
Da das ,,neue" Outlook die klassische Version immer öfter verdrängt, greifen die Beispiele von Microsoft sowieso nicht mehr. Automation per COM wird vom neuen Outlook nicht mehr unterstützt, sondern nur noch die Microsoft Graph API, die sich nicht einfach von VBA aus handhaben lässt.
Ein anderes Beispiel wäre PrintOut, wo es auch keine direkte Entsprechung gibt, zumindest ist mir keine bekannt.
Ich möchte nur darauf hinweisen, dass es viele native Entsprechungen in VBA gibt. Wenn diese einfach anzuwenden sind, sollte man sie dem DoCmd-Objekt vorziehen. Das ist jedoch nicht immer sinnvoll oder machbar.
Grüße Ulrich
Hallo Ulrich,
man braucht nicht für alles eine COM-Schnittstelle.
https://www.devhut.net/vba-thunderbird-automation-with-embedded-images/
Hier enthalten eine Demo-Datenbank mit einem Modul von Daniel Pineault zum Senden von Mails über Thunderbird.
Und bevor die Aussage weiter verdreht wird: Ich habe nicht gesagt, daß man VBA-Makro-Aufrufe (DoCmd) unter gar keinen Umständen verwenden sollte, ich habe mich nur an Deiner Aussage gestoßen, daß es keine Entsprechung in VBA gibt, auch wenn Du Dir eine Hintertür offengehalten hast. Es ist schlichtweg falsch, daß man nicht jeden DoCmd-Befehl in VBA nachstellen kann. Auch PrintOut, was auch nur der Aufruf eines Access-internen Moduls ist, mit Programmieraufwand aber auch nachzustellen wäre.
Ich suche Dir aber jetzt nicht für jedes neue Beispiel ein Pendant raus, darfst Du gerne selbst suchen.
Ich denke, ich habe meinen Standpunkt hinreichend erläutert und beende das hier jetzt für mich.
Gruß
Christian
ZitatIch suche Dir aber jetzt nicht für jedes neue Beispiel ein Pendant raus, darfst Du gerne selbst suchen.
Musst du auch nicht, aber für Printout habe ich tatsächlich noch keine Entsprechung gesehen. Was Thunderbird betrifft, hatte ich ja schon darauf hingewiesen, dass so etwas mit der Kommandozeile möglich ist, nichts anderes wird letztendlich mit der Funktion TB_SendEmail() gemacht, der Rest ist einem anderen Thema geschuldet.
Hallo Christian,
und mir ging es genauso, dass du daran festhalten möchtest, dass es für
alle DoCmd-Methoden eine VBA Entsprechung geben soll. Hier vertrete ich allerdings einen anderen Standpunkt, aber zum Glück darf man hierzulande ja durchaus (noch) unterschiedlicher Meinung sein und darüber diskutieren.
In diesem Sinne ...
Grüße Ulrich