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 - Fehler 2525

Begonnen von Gagsli, Juni 12, 2025, 10:35:24

⏪ vorheriges - nächstes ⏩

Gagsli

Moin, ein Neuzugang mit einem Problem.

Vorab ein paar Eckdaten

Ich arbeite seit knapp 30 Jahren mit Access, dabei eigentlich immer ohne VBA.
Konnte bisher alles ohne Programmierung lösen.
Angefangen mit Access 97.
Hier habe ich im Laufe der Zeit fast alle Datenbänke an die neue Generation angepasst.
Nur eine Datanbank noch nicht, aus (für mich) gutem Grund.

Hiermit arbeiten nur eine Handvoll Personen, dazu haben wir einen virtuellen Rechner auf 32BIT.
Diese Datanbank läuft immer noch mit Access 97.

Nun bin ich dabei dieses zu ändern bzw. immer noch bei dem Versuch.

Es handelt sich um eine Deckungsbeitragsrechnung bei der für Kundengruppen ca. 50 Abfragen
nacheinander alle kalkulatorischen Daten incl. Hochrechnung erfolgen.

Dazu wurden bisher 2 identische Makros aufgerufen, die dieses vornehmen.
Knapp 200 Kundengruppen.
Ist das erste Makro durchgelaufen ruft dieses Nr. 2 auf, diess wiederum Nummer 1 usw.
Bis zur letzten Gruppe.

Läuft einwandfrei bisher, Betonung auf bisher.

Wie geschrieben habe ich bisher alles ohne VBA gelöst.
Entsprechend habe ich damit nicht viel Erfahrung, Kleinigkeiten habe ich mir aus dem Netz geholt.
Richtig Verständnis habe ich damit nicht gewonnen.


Nun zu dem Problem.

Mit der letzten Generation ist eine "Sicherheit" eingebaut worden.
Ein Makro kann nur 19x aufgerufen werden.
Danach kommt eine Fehlermeldung mit Abbruch.

Mit Start der Berechnung wird jeder Makroaufruf innerhalb der Berechnunen summiert.
Zu Anfang war nach 6 Gruppen der Abbruch, konnte ich ändern auf 15 Durchläufe.
Makrostruktur geändert.

Dann dachte ich, dass ich nach 3 Durchläufen den Makroaufruf umgehe und per Modul ein Formular
öffne, dieses wiederum startet die Makros wieder.
Innerhalb des Makros werden diese am Ende per Befehl gestoppt.

Klappt nicht, solange hier eine Abfolge ohne ein Ende abgearbeitet wird bleibt der interne
Makrozähler erhalten und die Meldung kommt wieder.

Das Makro habe ich nuin mit den Bordmitteln in ein Modul umgewandelt.
Bevor ich mich damit beschäftige (wie gesagt, keine Erfahrungen), wollte ich einmal in die Runde fragen.


Hat jemand Erfahrung mit der Fehlermeldung 2525 und evtl. eine Lösung?
Heißt, gibt es einen Trick die Anzahl von 19 Aufrufen zu umgehen?


Schon mal vielen Dank für eure Unterstützung


Sie dürfen in diesem Board keine Dateianhänge sehen.


Knobbi38

#1
Hallo,

ich vermute mal, daß dein Makro rekursiv aufgerufen wird und dann ist ab einer bestimmten Rekursionstiefe
schlichtweg Schluss und als Folge davon dürfte dann der Laufzeitfehler 2525 auftreten. Diese Rekursionstiefe dürfte übrigens nicht von eine bestimmte Anzahl beschränkt, sondern lediglich durch den verwendeten Speicher auf dem Stack begrenzt sein.

Vermeide eine solche hohe Rekursionstiefe und begrenze diese oder stelle deine Lösung auf ein iteratives Verfahren um.

Gruß Knobbi38

Gagsli

Danke für die Antwort.

Rekursiev ist dieses meiner Meinung nach nicht.

1. Makro A wird aufgerufen und durchgelaufen, ohne dass ein anderes Makro aufgrufen wird.

2. Nach der Abarbeitung wird dieses Makro verlassen und gestoppt.

3. Makro B gestartet und am Ende Schwenk auf A und B wird gestoppt.

4. usw. usw.


Vorher waren hier noch jeweils ein Makroaufruf mehr vorhanden.

Und wie oben beschrieben war zu Anfang nach 6 Durchläufen Schluss, jetzt nach 15.


Es wird hier jeder Makroaufruf gezählt und dann ist Schluß.
Sonst hätte sich die Anzahl nicht geändert, da der Rest unverändert geblieben ist.

Gagsli

Die Fehlermeldung bezieht sich auf die Art, wie ich diese Lösung bisher angegangen bin.

Microsoft will dadurch eine Endlosschleife vermeiden.

Kann man verstehen, nur blöd für mich.

Knobbi38

Hallo,

Zitat von: Gagsli am Juni 12, 2025, 13:03:58Microsoft will dadurch eine Endlosschleife vermeiden.
MS möchte mit Sicherheit keinen Endlosschleife vermeiden, sonder zur Laufzeit dürfte der freie Speicher ausgehen.

In der Regel deutet so etwas auf eine rekursive Programmierung hin, aber ohne die Details zu kennen, kann man nur Vermutungen anstellen.

Im Übrigen wird es sicherlich nicht mehr viel Unterstüzung für die Makroprogrammierung geben, die meisten Helfer beschäftigen sich eigentlich nur mit VBA.

Gruß Knobbi38

 

Debus

Hallo und ja Ulli hat da vollkommen recht hier noch ein Zitat aus dem Technet von MS:

ZitatDer Fehler 2525 in Microsoft Access tritt auf, wenn ein Makro sich selbst zu oft aufruft. Die genaue Fehlermeldung lautet:
"A macro can call itself a maximum of 20 times."
Das bedeutet, ein Makro darf sich selbst (direkt oder indirekt) maximal 20-mal rekursiv aufrufen. Wird dieses Limit überschritten, bricht Access den Vorgang ab und gibt Fehler 2525 aus.


Und hier noch der Lösungsansatz von MS:

Umgehungsmöglichkeiten
ZitatMakrostruktur anpassen:
Überprüfen Sie die Makros auf rekursive oder zirkuläre Aufrufe. Vermeiden Sie, dass ein Makro sich selbst oder über andere Makros mehr als 20-mal aufruft. Oft hilft es, die Logik so zu gestalten, dass die Rekursion frühzeitig endet oder durch eine andere Schleifenstruktur ersetzt wird.

Makro in VBA umsetzen:
Wenn die Aufgabe tatsächlich mehr als 20 Durchläufe benötigt, sollten Sie das Makro in VBA-Code umwandeln. In VBA können Sie eigene Schleifen und Rekursionskontrollen implementieren, die nicht dieser Beschränkung unterliegen.

Schleifen statt Rekursion:
Verwenden Sie, wenn möglich, Schleifenstrukturen (z.B. For- oder While-Schleifen) statt rekursiver Makroaufrufe. So umgehen Sie die 20er-Grenze, da Schleifen in Makros nicht limitiert sind.

Gruß
Holger

Knobbi38

@holger:

Danke nochmal für den Hinweis. Bisher bin ich immer davon ausgegangen, daß es kein Limit für die Rekursionstiefe bei Makros gibt und bei meinen Recherchen habe ich darüber auch nichts gefunden - man lernt doch immer noch dazu  :)

Grüße Ulrich
 

Gagsli

Zitat von: Debus am Juni 13, 2025, 10:41:27Schleifen statt Rekursion:
Verwenden Sie, wenn möglich, Schleifenstrukturen (z.B. For- oder While-Schleifen) statt rekursiver Makroaufrufe. So umgehen Sie die 20er-Grenze, da Schleifen in Makros nicht limitiert sind.

[/quote]

Mit der Rekursion lasse ich mal so stehen.
Fazit ist, es klappt nicht.

Zu dem Zitat - soweit ich es gefunden habe kann man in Makros keine Schleifen einbauen.
So stand es auf den Seiten, die ich dazu gefunden habe.
Bei diesem Zitat sieht es so aus, als wenn es doch gehen würde?

Was stimmt nun?

Vielen Dank.


Knobbi38

Hallo,

ich meine mich erinnern zu können, daß ich mal ein Beispiel mit Makros und Schleifen in einem anderen Forum gepostet hatte, auf jeden Fall geht das; ist aber schon etwas länger her und ich habe im Moment auf dieses Beispiel keinen Zugriff mehr.

Andererseits würde ich in Makros auch keine Arbeit mehr investieren wollen, schließlich kann man das auch mit VBA umsetzen.

Gruß Knobbi38
 

Gagsli

Da versuche ich mich gerade dran.

Da es aber um reine Berechnungen mit knapp 50-Abfragen geht, ist es für mich als Makro übersichtlicher.


Erster Versuch mit DoCmd.RunMacro "VBABonusstatistik" bringt leider kein Ergebnis.


Das Makro wird aufgerufen, aber die Verbindung mit dem Modul besteht nicht mehr ==> ist das so korrekt?
Jegliche Version einer Schleife wird ignoriert.
Das Makro wird einmal abgearbeitet, dann ist Schluss.

Wäre auch zu einfach gewesen - hatte ich mir aber schon gedacht.


Also doch alle Objekte in das Modul bringen und hoffen, dass es dann mit der Schleife funktioniert.


Ich fange dann erst einmal klein an und erweitere dann die Abfolge.


Beaker s.a.

ZitatDa es aber um reine Berechnungen mit knapp 50-Abfragen geht, ist es für mich als Makro übersichtlicher.
Was an Macros übersichtlicher sein soll, erschliesst sich mir leider nicht.

Werden die Berechnungen in den Abfragen gemacht, oder werden daraus nur die Werte
für die Berechnungen geholt?

Wenn ich so einen Namen für ein Macro sehe, kommen mir schon wieder Zweifel am Datenmodell.
Vielleicht zeigst du uns das mal.
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)

Knobbi38

#11
Hallo,

was soll das bringen, wenn du ein Makro aus VBA heraus aufrufst. Eine Schleife ist auch nicht zu erkennen.
Du kannst doch erstmal ganz grob die Makros nach VBA per Assistent kopieren konvertieren und das dann als Grundgerüst für deinen VBA-Code nehmen und dann natürlich noch anpassen, weil nicht alles was der Assistent generiert, so in VBA sinnvoll ist - oft gibt es einfachere Möglichkeiten.

Knobbi38

Debus

Hallo Gagsli,

ich glaub um Dir hier mal den richtigen Weg zu zeigen, solltest Du mal etwas hochladen. Vielleicht mal eine kleine Demo, wo aber Dein Problem raus hervorgeht. Dann kann sicherlich einer das ganze mal in vba Skizzieren.
Wenn wir hier nur darüber reden was eh nicht geht kommt man nicht weiter.

Also schicke bitte mal was hoch und es wird Dir sicherlich geholfen.

Holger

Gagsli

Besten Dank für das Angebot, falls ich Probleme bekomme werde ich mich melden.

Makros aus VBA = Makro wird einfach abgearbeitet und die Verbindung zum Modul ist nicht mehr vorhanden.
Habe ich nach 2 Testläufen mit einfacher Struktur selber festgestellt.
Ist halt Neuland für mich.


Zum Thema Makro vs. VB

Wie beschrieben handelt es sich um reine Berechnungen für eine GuV-Rechnung.
Knapp 200 Kundengruppen mit unterschiedlichen Konditionen:

Rabatte
Vertreterboni
Mindermengenzuschlag
Steigerungsrabatte
WKZ
TVP
Lizenzen auf einzelne Artikel
Sonderboni auf Artikel
Werbungskosten
Rabatte
usw.


Die Berechnungen erfolgen immer im gleichen Ablauf über Abfragen.

Muss die Reihenfolge geändert werden verschiebe ich innerhalb des Makros.
Neue Objekte werden einfach in die Struktur reingezogen.

Das finde ich nun mal einfacher als jede Menge Programmzeilen.

Ist halt so gewachsen.


Hätte ich ein komplettes Programm mit Formularen, Berichten usw. wird VBA sinnvoller sein.


Makros sind nicht immer schlecht  ;)


Jetzt wird erst eimal umgewandelt.

Zum Glück gibt es ja das Internet und Hilfe in Access.
Und natürlich dieses Forum...



Beaker s.a.

Hallo,

Generische Lösung (allerdings mit VBA).
Erstelle dir eine Tabelle, in der du die Namen deiner Abfragen speicherst.
Zur Auswertung erstellst du ein Formular. Darauf platzierst du ein Listfeld
mit erweiterter Mehrfachauswahl auf der Basis dieser Tabelle. Daraus kannst
du/der Anwender dann genau die auswählen, die er gerne hätte.
Mit einem Button werden dann die ausgewählten Abfragen ausgeführt
(Luftcode)
Private DeinButton_Click()
    Dim varQry As String

    For Each varQry in DeinListfeld.ItemsSelected
        CurrentDb.Execute(varQry)
    Next varQry

End Sub
Deine Macros entfallen damit komplett. Eine neue Abfrage ist dann einfach ein
neuer Datensatz in der o.a. Tabelle.
Zitatals jede Menge Programmzeilen.
"jede Menge" ist wohl Ansichtssache ;-).

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)