Neuigkeiten:

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

Mobiles Hauptmenü

Makro automatisch ausführen nach Eingabe/Änderung eines Datensatzes

Begonnen von Knopf, Juni 18, 2017, 10:04:17

⏪ vorheriges - nächstes ⏩

Knopf

Hallo VBA-Experten!

Dank eurer Hilfe konnte ich mein Makro erstellen. Jetzt soll es  automatisch ausgeführt werden können...Sobald in der Tabelle tblmop ein Datensatz eingefügt oder geändert wird, soll dieses Makro ausgeführt werden. (Das Makro fügt 2 Tabellen zusammen) Wie erreicht man die automatische Ausführung?
Vielen Dank für eure Hilfe!

Lachtaube

Datenmakros ab Version 2010 könnten auf die genannten Ereignisse direkt reagieren - jedoch keine andere Art von Makro oder gar VBA-Code ausführen. Ansonsten besteht noch die Möglichkeit in Formularen im Vor- und/ioder Nach Aktuslisierung Ereignis auch gespeicherte Makros und/oder VBA-Code auszuführen.
Grüße von der (⌒▽⌒)

Knopf

Hallo Lachtaube,
Ich habe eine funktion erstellt, die wie gewünscht funktioniert und diese auch als makro gespeicherr. Wenn ich nun versuche ein Datenmakro zu erstellen und dort meine Funktion einzufügen, passiert nichts...
Ist das gar nicht möglich? Was mache ich falsch? Es muss doch möglich sein selbst erstellte makros nach aktualisierung auszuführen?:(
Lg

bahasu

Hi,

im Formular gibt es das Ereignis "Nach Aktualisierung" (auf Ebene des Steuerelementes bzw des Datensatzes).

Dort kann im VBA-Code eingetragen werden:
DoCmd.RunMacro "Hier nun den Names des Makros eintragen"

Vielleicht hilft das.
Harald
Servus

DF6GL

Hallo,

ZitatDatenmakros ab Version 2010 könnten auf die genannten Ereignisse direkt reagieren - jedoch keine andere Art von Makro oder gar VBA-Code ausführen.

Knopf

Hallo Harald,

ich habe es ausprobiert: Ich habe in meinem Eingabeformular ein unterformular, welches bei der dateneingabe mit einem makro aktualisiert wird. Für das unterformular habe ich den code im entwurfsmodus eingegebn. DoCmd.RunMacro "macActMop" aber es tut sich nichts :(

Beaker s.a.

Hallo Knopf,
ZitatFür das unterformular habe ich den code im entwurfsmodus eingegebn. DoCmd.RunMacro "macActMop"
Wo hast du den eingegeben? So wie von Harald beschrieben?
Ausserdem, warum Macro, wenn du doch ein Formular(modul)
hast (siehe #1)
Zitatoder VBA-Code auszuführen.
Ich würde das gleich mit VBA machen, - Prinzip:
Private Sub Form_AfterUpdate()
    If Me.NewRecord Then
        CurrentDb.Execute "INSERT INTO ... "
    Else
        CurrentDb.Execute "UPDATE ... "
    End If
End Sub

Zudem solltest du vielleicht nicht vergessen in "Form_BeforeUpdate"
die Daten evtl. auf korrekte Eingaben zu überprüfen (z.B. leere Pflichtfelder).

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Knopf

Hallo!

Ja so habe ich es gemacht: Ich habe das Unterformular geöffnet, habe in dem Feld "Nach Aktualisierung" Ereignisprozedur gewählt und folgenden Code geschrieben:

Private Sub Form_AfterUpdate()
Call ActMo
End Sub
-------------------------
Function ActMo()

Set db = CurrentDb()


    DoCmd.SetWarnings False
    DoCmd.RunSQL "DROP TABLE tblMo;"
    DoCmd.SetWarnings True
     
    db.Execute "abfMo" 'Tabellenerstellung
   

    DoCmd.SetWarnings False
    DoCmd.RunSQL "DROP TABLE tblAuswMo;"
    DoCmd.SetWarnings True
     
    db.Execute "abfAuswMo"        'Tabellenerstellung

    db.Execute "ALTER TABLE [tblAuswMo] ALTER COLUMN [AuswertungMo] Single"

End Function
----------
Aber es will nicht funktionieren :( Die Funktion ist getestet und läuft wenn ich sie aus dem VBA-Editor starte...
Danke für eure Hilfe!

DF6GL

Hallo,

-- lass das "Call" weg.  Dies wird nur für Subs benötigt.
-- Wo steht die Funktion "ActMo()"  ?  Im selben Klassenmodul oder in einem Standardmodul?
-- Was steht in der Form-Ereignis-Eigenschaft "Nach Aktualisierung"?

btw: es muss zwischen VBA-Prozeduren (Functions, Subs) und Makros unterschieden werden!

Um eine VBA-Prozedur beim Auftreten eines Ereignis aufzurufen, muss in der entspr. Ereignis-Eigenschaft(enzeile) 
[Ereignisprozedur]
stehen.

Setze einen Haltepunkt in die AfterUpdate-Prozedur und prüfe, ob die Prozedur überhaupt aufgerufen wird.

Knopf

Hallo!
Dank eurer Hilfe konnte ich es lösen, Vielen Dank!:)
Meine Funktion war in einem Standardmodul Deshalb muss mein Aufruf wie folgt aussehen:

Private Sub Form_AfterUpdate()
Modact.ActMop
End Sub

Das Modul muss auch drinstehen...
Mein Makro habe ich so aufgebaut:

Function ActMop()

Dim db As DAO.Database

Set db = CurrentDb()

    CurrentDb.Execute "DELETE FROM tblAuMop;"
    db.Execute "abfMop"
    db.Execute "abfAuMop"
   
End Function

Jetzt funktioniert alles einwandfrei :):):)
Viele Grüße!

DF6GL

Hallo,

das ist kein Makro, sondern eine VBA-Prozedur.  Makros sind etwas anderes.

Zudem wäre sinnvoll:

ZitatFunction ActMop()

Dim db As DAO.Database

Set db = CurrentDb()

    db.Execute "DELETE FROM tblAuMop;"
    db.Execute "abfMop", dbFailOnError
    db.Execute "abfAuMop", dbFailOnError
   
End Function

Knopf

Ah vielen Dank! Das ist ein guter tipp. Wie kann ich eine meldung erhalten, falls ein fehler auftritt?
Lg

MzKlMu

Gruß Klaus