none
Grundsätzliche Probleme mit Excel und VBA

    Frage

  • Bei der zufälligen Entwicklung eines Spiels in Excel bin ich auf ein grundsätzliches Problem gestoßen: Angeregt durch meinen Sohn, der im Informatikunterricht als Eigenidee das Mensch-Ärger-dich-nicht-Spiel in JAVA geschrieben hat, habe ich mir überlegt, dass man dieses Spiel auch in Excel umsetzen kann. Kombiniert mit Formeln und VBA ist das Spiel soweit fertig. Aber beim Spielen stürzt Excel immer wieder ab. Es ist aber weder ein Problem mit den Formeln noch ein Programmierfehler. Ich habe dann nach jedem Spielzug auf Speichern geklickt und dann weiter gespielt. Nach ca. 5 bis 6 Spielern (manchmal mehr, manchmal weniger), die an der Reihe waren, hängt sich Excel auf. Der Spielzug wird entweder nicht beendet oder die Bilder der Figuren werden nicht mehr vollständig angezeigt. Teilweise muss ich dann Excel über den Taskmanager beenden.

    Ein weiteres Problem ist der Zufallsgenerator. Der hinterlegte Algorithmus führt nach relativ kurzer Zeit zu Wiederholungen, was bei diesem Spiel zu periodischen Spielzügen führt. Dieses Problem ist mir schon bei der Erstellung von Arbeitsblättern für die Mathe-Nachhilfe aufgefallen. In dem Spiel habe ich eine andere Variante für die Zufallszahlenerzeugung verwendet.

    Zum Nachvollziehen der Probleme (zweites Problem ist in VBA als Kommentar gesetzt), kann ich die Datei zusenden.

    Viele Grüße
    Maxima Tino

    Sonntag, 15. Juli 2018 21:55

Alle Antworten

  • Moin,

    von der Sinnhaftigkeit des Vorhabens, Spiele in Excel zu programmieren, einmal komplett abgesehen:

    • es gibt meines Wissens kein *grundsätzliches* Problem mit der Stabilität von VBA-Makros in Excel. Wenn sich ein Makro nach Benutzung aufhängt, dann werden offenbar irgendwo Ressourcen gehortet, die nicht frei gemacht werden, oder die Ausstiegsbedingung aus einer Schleife berücksichtigt nicht alle möglichen Fälle, oder so was in der Art.
    • der Zufallszahlengenerator in VBA ist wirklich nicht der Hit. Die empfohlene Vorgehensweise ist, von jedem Rnd-Aufruf einmal Randomize aufzurufen. Oder halt eine eigene Funktion zu schreiben, Algorithmen gibt es tonnenweise im Netz. Man kann ja auch profane Sachen als Zufallszahlengenerator missbrauchen wie z.B. den Millisekunden-Teil der Systemzeit. Gerade bei interaktiven Sachen bestimmt somit der Spieler den Wert mit, indem er auf "Würfeln" klickt.

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Montag, 16. Juli 2018 05:46
  • "Es ist aber weder ein Problem mit den Formeln noch ein Programmierfehler. "

    Auch meine Erfahrungen besagen, dass es keine Probleme mit VBA gibt.
    Wenn Excel hängenbleibt und nicht mehr reagiert, ist ein Problem des VBA-Codes, dass dieser in einer Endlos-Schleife läuft.

    Wenn man eine Schleife programmiert hat, so kann man durch einfügen eines "DoEvents" eine Reaktion von Excel zulassen, so dass ein Makro in der Schleife unterbrechbar ist.

    Ein häufiger Fehler ist die Anweisung "on Error Resume next"!
    Wenn dann z.B. eine IF-Anweisung einen Fehler provoziert, wird in den True-Zweig gesprungen.
    Wenn in ein einer Do-Schleife die While/Until-Bedingung auf einen Fehler läuft, läuft die Schleife weiter.

    Vorschlag:
    Entferne erst mal alle "On Error Resume Next", wenn ein Fehler auftritt, so muss die verursachende Bedingung vorher geprüft werden, so dass man i.W. ohne "On Error..." auskommt.
    Füge in Schleifen mal ein DoEvents ein.

    Montag, 16. Juli 2018 07:36
  • Danke erstmal Euch beiden, für die schnelle Antwort. Wie bereits erwähnt, ist das Spiel nicht allein als VBA-Makro geschrieben (bzw. mehrere Makros). Es ist auch kein Quellcode-Problem, da bei einem neuen Start, alles erstmal wieder ganz normal arbeitet, auch über den abgebrochenen Punkt hinaus. Es stoppt dann wieder an anderer Stelle. Schleifen sind wenn nur als Zählschleifen implementiert. Dort stoppt aber das Programm nicht. Ansonsten bestehen die Makros hauptsächlich aus Case- und If-Anweisungen. Die Ausführung stoppt wenn dann beim Zurückschreiben in die Excel-Zellen bzw. beim Rücksprung in die Excelanwendung. Dabei ist zu beachten, dass Werte, die in Excelzellen zurückgeschrieben werden, dann weitere Berechnungen auslösen bzw. die Anzeige der Spielfiguren auf dem Spielfeld (erfolgt als Bildanzeige anhand von Zellinhalten) aktualisiert wird. Über die Makros werden auch die Buttons als Aktivitätsschaltflächen aktiviert und deaktiviert.

    Das Excel nicht zur Spielentwicklung da ist, weiß ich selber. Es war nur ein Test. Das ich Excel an seine Grenzen bringen kann aber auch. Schon vor 20 Jahren hatte ich Excel-Lösungen zu supporten und hatte eine Anwendung eines Kunden, die bei Aktualisierung der Berechnungen (nur Formeln auf den Tabellenblättern) über 30 Minuten benötigte.

    Ich kann Euch beiden die Datei zumailen, wenn Ihr Interesse habt. Die Anwendung ist natürlich sehr komplex. Den Zufallsgenerator hatte ich ähnlich wie oben beschrieben über die Systemzeit erzeugt, damit waren wir auf dem gleichen Gedanken.

    Viele Grüße
    Maxima Tino

    Mittwoch, 18. Juli 2018 14:05