Kompilierfehler zuwenig Speicherplatz

  • Excel

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Kompilierfehler zuwenig Speicherplatz

    Hallo zusammen,

    ich bin gerade dabei, eine Anwendung in Excel 2003 mit VBA zu erstellen.

    IN dieser Excel-Datei habe ich eine VBA-Form angelegt und innerhalb dieses Formulars den Quellcode abgelegt.

    Das Programm ist sehr umfangreich und umfasst auf mehrere Reiter Verteilt bestimmt an die 90 / 100 Textfelder, Labels etc. Über dieses Formular werden Daten erfasst und in anderen Dateien und teilweise in Datenbanken gespeichert.

    Das funktioniert auch sehr gut. Nun habe ich aber versucht, noch zwei Textfelder hinzuzufügen und seit dem kann ich das Programm (Makro) nicht mehr starten.

    Es wird die Fehlermeldung: Kompilierfehler Nicht genug Speicherplatz ausgegebenen.

    Lösche ich die Felder, kann ich das Programm wieder starten! Füge ich das Feld wieder hinzu, schon lässt es sich nicht mehr kompilieren.

    Die Exceldatei hat ca. 1 -1,3 MB größe. Die Anzeige ändert sich ständig.

    Könnt ihr mir sagenm woran das liegt? und wie ich die Felder noch hinzufügen kann?

    Danke und Gruß
    Excel ist für solche großen Anwendungen nicht gedacht. Ab einer Modulgröße über 64kB kann es zu Problemen kommen. Es gibt mehrere Lösungsansätze:

    • Code in mehrere Module (Userformen) aufteilen.
    • Code optimieren. (Objekte wegrationalisieren...)
    • Eine "richtige" Programmierumgebung nutzen (VB Express gibt es kostenlos). Am meisten Arbeit, aber weniger Probleme, wenn auf ein neueres Office gewechselt wird.
    • ...
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Ich hatte mal ein ähnliches Problem.
    Da wurden auf einem Sheet ca. 300 Controls verwendet.
    Das Sheet wurde im selben Workbook 15 mal kopiert.

    Irgendwann liefen die GDI-Handles ans Limit.
    Du kannst im Taskmanager in der Lasche "Prozesse" unter "Ansicht" weitere Spalten auswählen und "GDI-Objekte" anzeigen.
    Es gibt von Nirsoft auch einen GDI-Viewer.

    Bei mir war damals die kritische Grenze bei ca. 6000, bevor Excel nicht mehr wollte.
    Du kannst das Limit mit dem Registry-Parameter
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\GDIProcessHandleQuota
    erhöhen, theoretisch bis 65536, praktisch geht allerdings vorher das dem Prozess zuteilbare Memory aus.

    Der richtige Weg zur Problemlösung besteht darin, alle unnötigen Controls zu entfernen.
    Meist lässt sich durch ein vernünftiges Design da vieles optimieren.

    Viel Erfolg!
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Hallo zusammen,

    schon mal vielen Dank.

    Es liegt nicht an der Modulgröße. Diese habe ich bereits so aufgeteilt, das die 64 Kb-Grenze nicht überschritten wird.

    Die Steuerelemente befinden sich auf einer eigenen Form.

    Es sind einfach zu viele Steuerelemente. LEider kann ich die nicht einsparen. Es sind halt zahlreiche Eingaben zu machen.

    Ja, ím .Net wäre mir das nicht passiert. Leider ist das Projekt sehr klein gestartet und ist mit der Zeit deutlich angewachsen.

    Ich werde am Montag ausprobieren, ob die größenbeschränkung für die ganze Arbeitsmappe gilt oder "nur" für die Form. Dann werde ich einfach mal versuchen die Steuerelemente auf eine zweite Form zu verteilen.

    Gruß
    Adressierst du die Controls im Makro über deren Namen?
    Da gibt es nämlich auch eine Beschränkung (ich glaube 84).
    In dem Fall hilft es, die Controls über die Indexnummer zu adressieren.

    Oder die namentlich adressierten zuerst anzulegen und danach die nicht verwendeten (z.B. Labels).

    Allerdings dürfte das nicht zu einem Compile-Fehler führen, sondern müsste sich in einem Runtime-Error niederschlagen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Musst du alle Controls ansprechen?
    Wenn nein, die Controls, die du nicht adressieren musst zuletzt anlegen.

    Oder das Objekt direkt ansprechen und nicht über den Namen.
    Notfalls über die Collection "rein loopen":

    Visual Basic-Quellcode

    1. For Each Ctl in MyForm.Controls
    2. If Ctl.Name="was ich suche" Then Set MyCtl=Ctl
    3. Exit For
    4. Next


    Kannst du mal ein Stück Code posten, wie du die Controls in VBA verwendest?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --