Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1940to1944
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Maximale Länge von Makro und Modul

Maximale Länge von Makro und Modul
04.08.2023 10:18:33
Klexy
Moin zusammen.
Frage:
Was ist die maximale Makro-Länge bevor "Prozedur zu groß" kommt? Die Info im Microsoft-Support ist (wie fast immer) unbrauchbar und voll am Thema vorbei.
Die reine Zeilenanzahl scheint es nicht zu sein.
Und wieviel darf man maximal in ein Modul reinpacken (falls es da eine Grenze gibt)?

Hintergrundgeschichte: (nicht wirklich relevant bis auf den letzten Absatz)
Ich erstelle immer wieder per Makro eine Datei, wo ich auch die Kopfzeilen usw. per Makro erstelle (als Gerüst für weitere Einträge).
Einige Blätter sind immer komplett gleich (z.B. die Anleitung) und bisher habe ich sie aus bereits bestehenden Dateien rauskopiert. Weil ich dazu zu faul bin, will ich das auch per Makro machen. Allerdings nicht mit Blatt.Kopieren, weil die Quelldatei immer unterschiedliche Namen hat, sondern direkt per Makro.
Dazu hab ich bei einer vorhandenen Datei alle Zellen im UsedRange ausgelesen und zu Makro-Zeilen verarbeitet. Das sieht dann so aus:
Ausgabe.End(xlDown).Offset(1, 0) = "Range(" & """" & Replace(Hier.Address, "$", "") & """).Style = """ & sty & """"

Ausgabe.End(xlDown).Offset(1, 0) = "Range(" & """" & Replace(Hier.Address, "$", "") & """).FormulaR1C1 = """ & Inhalt & """"
Ausgabe.End(xlDown).Offset(1, 0) = "Range(" & """" & Replace(Hier.Address, "$", "") & """).Interior.Color = " & ZellFarbe
Ausgabe.End(xlDown).Offset(1, 0) = "Range(" & """" & Replace(Hier.Address, "$", "") & """).Font.Color = " & SchriftFarbe
Ausgabe.End(xlDown).Offset(1, 0) = "Range(" & """" & Replace(Hier.Address, "$", "") & """).Font.Bold = " & Schriftfette

Das Ergebnis wird in eine Excel-Spalte geschrieben und sieht so aus. Diesen Code kopier ich dann in ein Modul und lass ihn laufen, um in der neuen Datei dieses Tabellenblatt zu erstellen:
Range("B2").Style = "Normal"

Range("B2").FormulaR1C1 = "Blatt"
Range("B2").Interior.Color = -4142
Range("B2").Font.Color = 0
Range("B2").Font.Bold = True
Range("B2").Borders(xlEdgeLeft).Color = 0
Range("B2").Borders(xlEdgeRight).Color = 0

Da es ca. 10.000 Zellen sind, die so erstellt werden, ist das Makro sehr lang und ich krieg die Meldung "Prozedur zu groß".
Mit ein wenig rumprobieren habe ich rausgefunden, dass ich das Makro in Teilmakros aufteilen kann, die sich dann der Reihe nach gegenseitig aufrufen.
Zuerst schien eine maximale Länge von 900 Zeilen in Ordnung zu sein. Dann aber plötzlich nicht mehr bei allen Teilmakros ("Prozedur zu groß"). Bei 850 Zeilen gab es zwischendrin auch Probleme, aber nicht bei allen Teilmakros (?!). Nachdem ich die maximale Zeilenzahl auf 500 runtergestellt habe, laufen alle Teilmakros durch.
Andererseits habe ich in meiner Werkzeugkiste Makros, die 1.500 Zeilen lang sind und problemlos laufen.

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Maximale Länge von Makro und Modul
04.08.2023 23:49:41
Piet
Hallo

es würde mich aufrichtig wundern wenn Microsoft diese Frage vernünftig beantworten kann. Daran glaube ich NICHT.

@Klexy ich sehe immer wieder im Forum gute Makrolösungen von dir. Dann solltest du eine passende Lösung zum Code verkürzen finden.
Ich sage dir dazu was als alter Mann aus Ankara! Wenn du den Code verkürzen willst solltest du in Blöcken mit Range/Union programmieren.

Ich würde mir Font.Color, Font.Bold, usw. mit Zelladresse in separate Spalten auflisten, und nachher jede Spalte mit der Zelladresse sortieren. Dann kannst du viele benachbarte Zellen zum Range zusammenfassen. Z.B. mit Union, für Font.Bold = True, und Union für Font.Bold = False. Dasselbe mit Schriftstyle, Farbe, Rahmen, Formeln etc.

Wäre interessant mal auszuprobieren wie weit du den Code für jede Option zusammenfasssen kannst??
Hilft dir dieser Tipp weiter das ganze mal klug durchdacht mit verkürztem Code zu Ende zu bringen???

mfg Piet
Anzeige
64 KB
07.08.2023 15:37:59
lupo1
Wow! Danke.
07.08.2023 16:57:25
Klexy
Wie hast du das nur gefunden?
Genau das hab ich gesucht.
Jetzt muss ich nur noch herausfinden, wieviel 64 kB sind. Denn wenn ich das Makro mit der maximal möglichen Länge (894 Zeilen inkl. Sub und End Sub) in eine TXT-Datei packe, ist diese nur 41 kB groß.
Die Makro-Struktur ist einfach, immer in dieser Art:
Range("CO180").Borders(xlEdgeRight).Weight = -4138

Range("A181").Style = "Normal"
Range("A181").FormulaR1C1 = "Bim bam bum tralala"
Range("A181").Interior.Color = -4142
Range("A181").Font.Color = 0
Range("A181").Font.Bold = False
Range("A181").Borders(xlEdgeRight).Color = 0
Range("B181").Style = "Normal"

Nur ganz selten sind längere Zeilen zwischendrin mit bis zu 1019 Zeilen pro Codezeile (.FormulaR1C1 = "Bim bam bum tralala usw.")
Kommentarzeilen können übrigens haufenweise dazugeschrieben werden, ohne die Fehlermeldung hervorzurufen.

Andererseits habe ich wesentlich längere Makros, die wunderbar laufen, aber vermutlich muss man da die Kommentarzeilen herausrechnen und die With...End With-Klammern und die Select Case-Klammern und die mit "_" am Ende umgebrochenen Zeilen als jeweils eine Zeile zählen, aber auch dann bleiben noch knapp 1000 Zeilen übrig.
Anzeige
Du solltest Daniels Hinweise befolgen. Deine Erwiderungen darauf ...
07.08.2023 17:12:43
lupo1
... waren Erwiderungen eines Ahnungslosen.

Ich habe XLAM rausgekramt, um Deine Frage ISOLIERT zu beantworten, was nicht bedeutet, dass irgendjemand hier schon mal an diese Grenze gestoßen ist, weil alle anderen es nämlich einfach richtig machen.

Somit ist auch die genaue Ermittlung der 64 KB irrelevant.
AW: Du solltest Daniels Hinweise befolgen. Deine Erwiderungen darauf ...
07.08.2023 19:14:43
Klexy
Ohne den vollen Kontext ist die Frage sicher absurd, aber im Kontext ist es eine Option, die für meinen Zweck sinnvoll ist.
Der Weg dahin war erstmal ein grober, bei dem ich an Grenzen gestoßen bin, die ich bisher nicht kannte (weil ich es sonst "nämlich einfach richtig" mache). Das hat mich neugierig gemacht. Mich interessiert die Tiefe des Wassers auch wenn mir eine Brücke zur Verfügung steht. Die genaue Ermittlung der 64 kB ist insofern irrelevant, als dass ich mir eine Brücke gebaut habe, aber auch die Frage, wieviele Engel auf eine Nadelspitze passen, ist irrelevant und trotzdem diskutiert worden. Ab und zu leiste ich mir First-World-Problems. Als Ahnugsloser kann ich dabei viel lernen. Wie dieses Mal auch.
Ich befolge jetzt die Verfeinerung, die Daniel zuletzt vorgeschlagen hat, auch wenn meine Brücke dies eigentlich überflüssig macht. Aber was macht man nicht alles, um die Haare schön zu haben. Irgendwann braucht man es mal wirklich.
Anzeige
Schön, dass Du ganz offen darüber gesprochen hast
07.08.2023 19:17:50
lupo1
Korrektur: 1019 Zeichen, nicht Zeilen
07.08.2023 18:07:46
Klexy
.
Im Prinzip schon, aber...
05.08.2023 10:28:17
Klexy
Hi Piet,
im Prinzip hast du Recht, aber in diesem speziellen Fall geht das nicht, weil die Zellen alle sehr unterschiedlich und durcheinander sind.
Außerdem wird das Makro, das ich letztlich ausführe, per Makro erzeugt. Das ist der Knackpunkt.
Dieses erzeugende Makro geht alle Zellen des auszulesenden Blattes nacheinander durch und schreibt die relevanten Merkmale als VBA-Code-Zeile in die jeweils nächste Zelle rechts neben den UsedRange. So entsteht der extrem lange Code, der mein ursprüngliches Problem darstellt. Dieses Problem habe ich relativ elegant gelöst (wie ich meine), aber die grundlegende Frage bleibt (auch wenn sie nicht mehr relevant ist, sondern nur sportlichen Charakter hat): Wie lang darf ein Makro sein und woran macht man das fest? Die einfache Anzahl der Zeilen ist es nicht.

Das erzeugende Makro kann aber nicht auch noch analysieren, welche der umliegenden Zellen möglicherweise in eine Union zusammengefasst werden könnten. Könnte, aber das würde meinen Aufwandsrahmen sprengen. Da ist es doch einfacher, mehrere Teilmakros nacheinander zu erstellen und ablaufen zu lassen.
https://www.herber.de/bbs/user/162190.xlsm
Es darf nur eine Zelle in der Anleitung markiert sein, sonst wird der Code nur über die markierten Zellen erzeugt.
1. Code erstellen drücken (gib als Nummer "1" ein)
2. erstellten Code ins Modul erstellen packen
3. erstes Makro des erstellten Codes laufen lassen (ruft automatisch alle weiteren Teilmakros auf)
Anzeige
Im Prinzip schon, aber...
07.08.2023 16:40:54
daniel
die Frage ist, was sinn und zweck der Übung ist.
Lupo hat ja gezeigt, dass eine Prozedur maxmial 64 kb Text haben darf.
Dein Problem ist, dass du hier versuchst, Daten im Code darzustellen.
Muss das zwingend so sein?

ich würde mir für jede Zelle eine Textzeile erzeugen, die Trennzeichengetrennt zuerst die Zelladresse und dann nacheinander alle relevanten Eigenschaftswerte enthält.
das wird dann wesentlich kürzer, weil du nur eine Zeile für jede Zelle benötigst und sich die Eigenschaft, zu der der Wert gehört, sich aus der Position im Text ergibt und somit nicht für jede Zelle zusätzlich gespeichert werden muss.
der Text für beispielsweise E98 könnte dann so aussehen:
"E98;Normal;21-4142;0;false;11513775;11513775;11513775;11513775"
diese Textzeile generierst du dann und hierlegst sie als Code, beispielsweise indem du den Text immer an eine Variable anhängst.

dann brauchst du nur noch ein kurzes Makro, das diesen Text analysieren und die entsprechenden Formatierungen durchführen kann.
den Text müsste man auch gar nicht als Code hinterlegen, man könnte ihn:
- in ein Tabellenblatt schreiben
- als CSV-Datei speichern
- in einer CustomDocumentproperty hinterlegen (wo bei ich nicht weiß, wie lang hier ein String sein darf)

auf jeden Fall würde dir das dein Makro erheblich vereinfachen.
das allereinfachste wäre wahrscheinlich, das ganze Blatt zu duplizieren und über .visible = xlsheetveryhidden auszublenden.
Dann hast du eine Sicherungskopie, auf die der Anwender nicht zugreifen und auch nicht verändern kann, das geht nur über Makro.

Gruß Daniel
Anzeige
Danke, aber...
07.08.2023 18:52:14
Klexy
Das mit der Variablen, die alle Merkmale einer Zelle enthält, klingt sehr interessant. Daran hatte ich bisher nicht gedacht. Das werde ich ausprobieren.

Muss das zwingend so sein?
Im Zuge dieses Experiments, ja. Ich will einfach wissen, was möglich ist. Ein Luxus-Problem.

Ziel des Experiments war es, keine Vorlage, Tabellenblatt usw. zu haben, sondern nur einen Code. Klingt komisch, ist aber so.
Vorteil: Man kann ihn überall ausführen und ist nicht auf eine Vorlage angewiesen, die dann zuerst an die richtige Stelle gebracht werden muss, um vom Makro angesprochen werden zu können (aber manchmal steht nur das Laufwerk X zur Verfügung, manchmal nur das Laufwerk Y). Das Makro macht nachher noch Sachen in dem Tabellenblatt. Was es da macht, ist von der jeweiligen Datei abhängig, aus der heraus eben erst die Datei, dann das Blatt (eigentlich mehrere Blätter) erstellt werden. Die Ausgangsdatei ist nicht nur eine einzige, sondern viele unterschiedliche, im Prinzip jede beliebige Excel-Datei in der es Eingabe- und Berechnugsfelder gibt. Es entsteht praktisch eine individuelle Analyse- und Test-Datei, mit der man unterschiedliche Testfälle in die Ursprungs-Datei einspielen kann, um zu sehen, ob die Berechnungen korrekt reagieren. Bei Dateien mit mehreren hundert Eingabefeldern, die über x verschiedene Blätter verteilt sind, ist das sonst sehr mühsam und die Leute tendieren dazu, überall nur eine "1" einzugeben und das als validen Test anzusehen. Im richtigen Leben gibt dann einer eine 1000 ein und schon geht die Berechung in die Grütze weil nicht ordentlich getestet.

In meiner eigenen Umgebung verwende ich eine fertig strukturierte Vorlage, denn ich weiß immer, wo meine Vorlage ist und wie ich Hand anlegen muss, um sie entsprechend zu individualisieren.
Anzeige
Maximale Länge von Makro und Modul
04.08.2023 12:12:18
Rudi Maintaire
Hallo,
anderes Vorgehen:
Erstelle dir eine Vorlage( .xltm) und gib deren Namen in Workbooks.Add an.
Das gleiche kannst du auch für einzelne Worksheets machen.

Gruß
Rudi
Maximale Länge von Makro und Modul
04.08.2023 12:06:52
Rudi Maintaire
Hallo,
weil die Quelldatei immer unterschiedliche Namen hat
Erstelle ein Musterblatt in der Datei mit deinem Makro und kopiere das.

Gruß
Rudi
Aber wie lang darf ein Makro sein?
04.08.2023 12:40:22
Klexy
hallo Rudi, das Ganze ist viel komplexer als ich es dargestellt habe. Klar geht es auch damit irgendwie. Und mit deiner anderen Lösung. Werde ich vermutlich auch irgendwie einbringen.

Aber meine Frage ist: wie lang darf ein Makro sein und woran macht man es fest?
Und wie lang darf ein Modul sein?
Anzeige
AW: Maximale Länge von Makro und Modul
04.08.2023 11:16:04
daniel
Hi
das Problem hatte ich noch nicht.
vermutlich nutzt du Methoden:
- Bearbeitung in Schleifen
- Untermakros mit Parameterübergabe
- Bearbeitung von Zellbereichen statt Einzelzellen
noch nicht nicht in ausreichendem Maß, denn damit lässt sich der Code in er Regel genügend einkürzen.
Gruß Daniel
AW: Maximale Länge von Makro und Modul
04.08.2023 12:01:51
Klexy
Der Code lässt sich nicht verkürzen, weil er jede einzelne der 10.000 Zellen individuell erstellen muss. Manche sind grün, manche blau, manche mit Rand, manche ohne manche mit dickem Rand, usw. - alles unterschiedlich und nix, was man verkürzen könnte.

Maximale Länge von Makro und Modul
04.08.2023 12:37:50
daniel
auch dann lässt sich das verkürzen.
du definierst die Werte für die einzelnen Formate als Übergabeparameter und gibst die beim Aufruf mit an.
dann benötigt im Code jede Zellformatierung nur eine Zeile und nicht mehrere, und du kannst trotzdem jede Zelle individuell formatieren.

10.000 Zellen nur über Code zu formatieren ist sowieso Unfug.
entweder gibt es eine Regel, nach der gerechnet werden kann, dann sollte sich das über eine Schleife programmieren lassen.
Wenn es keine Regel gibt aber die Formatierung den Zellen fest zugeordnet sind, dann kann man ich auch ein Vorlagenblatt erstellen, dass die Formate enthält.
dann kann man entweder das Format vom ganzen Blatt übernehmen oder auch von einzelnen Zellen, mit Copy-Paste übertragen, dann hat man auch nur 2 Zeilen pro Bereich und nicht eine Zeile für jede Formateigenschaft
Gruß Daniel
Anzeige
Die Frage ist: Wie lang darf ein Makro sein?
04.08.2023 13:00:41
Klexy
Es gibt unzählige Kombinationen von Zellfarbe, Schriftfarbe, Rahmen, Formatvorlagen usw.
Um das anzuwenden, müsste man die Datei erstmal analysierren, was viel mehr Zeit in Anspruch nehmen würde als alle Zeilen einzeln auszulesen (6 Minuten´)
Und nein, es gibt keine Regel.
Natürlich kann man mit einer Vorlage arbeiten und die kopieren. Das mach ich aktuell auch.
Aber aus sportlichen Gründen habe ich das o.g. Makro gebaut und meine Frage ist nicht die nach der besten Lösung, sondern wie lang ein Makro sein darf und woran man es festmacht.
Die Frage ist: Wie lang darf ein Makro sein?
04.08.2023 13:05:08
daniel
Das Makro darf so lang sein, wie Microsoft das beim Programmieren von VBA vorgesehen hat.
mehr kann dir wahrscheinlich keiner dazu sagen.
Was da jetzt das Limit ist (Zeichen, Zeilen, what ever) kann dir hier wahrscheinlich auch keiner sagen, weil jeder erfahrene Programmierer versuchen wird, die Anzahl der Codezeilen zu minimieren.
Anzeige

Links zu Excel-Dialogen

Anzeige

Infobox zum Thema

EXCEL - Was ist die Fehlermeldung "Prozedur zu groß" in VBA?


Inhaltsverzeichnis

Was ist die Fehlermeldung "Prozedur zu groß"?


Die Fehlermeldung "Prozedur zu groß" tritt in VBA auf, wenn eine einzelne Prozedur die Grenzen des zulässigen Code-Umfangs überschreitet. Diese Grenze ist durch die Kapazität des Kompilers bedingt und liegt bei etwa 64 Kilobytes an kompiliertem Code.

Einsatzzweck


Die Fehlermeldung dient als Indikator dafür, dass eine Prozedur zu umfangreich ist und in kleinere, handhabbare Einheiten aufgeteilt werden sollte, um die Lesbarkeit, Wartbarkeit und Performance des Codes zu verbessern.

Syntax


"Prozedur zu groß" ist eine Fehlermeldung und hat daher keine Syntax. Sie wird von der VBA-Umgebung ausgegeben, wenn der Code kompiliert wird und die Größenbeschränkung überschreitet.

Anwendungsbeispiele aus der Praxis


In der Praxis sollte man darauf achten, den Code in kleinere Einheiten aufzuteilen, bevor diese Fehlermeldung auftritt. Dies kann durch die Verwendung von mehreren Subprozeduren oder Funktionen erreicht werden.

Tipps


  • Teile große Prozeduren in kleinere Teile auf.
  • Vermeide redundante Codeblöcke.
  • Nutze modulare Programmierung.

Verwandte Funktionen


  • Sub und Function: Für kleinere, handhabbare Codeblöcke.
  • Call: Zum Aufrufen anderer Prozeduren.
  • Code-Module: Für eine bessere Organisation des Codes.

Zusammenfassung


Die Fehlermeldung "Prozedur zu groß" ist ein Hinweis darauf, dass eine Prozedur in VBA die maximale Größe überschritten hat und optimiert oder aufgeteilt werden sollte. Die Grenze liegt bei etwa 64 Kilobytes kompilierten Codes. Durch modulare Programmierung und Aufteilung in kleinere Prozeduren kann dieser Fehler vermieden werden.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige