Discussion:
Makro starten.... und stoppen!
(zu alt für eine Antwort)
Christian Rohrbach
2003-10-20 20:41:34 UTC
Permalink
Hallo Leute,

ich habe mir ein Makro gebastelt, welches einmal gestartet eine sehr lange
Zeit (30 Minuten) diverse Zahlen berechnet (und zur Laufzeit auf einem
Excelblatt ausgibt). Hin und wieder mächte ich dieses Makro unterbrechen,
dieses scheint aber nur per Strg+Pause zu funktionieren. Lieber wäre es mir,
wenn ich es mittes "Stopp"-Button (button auf dem Excelblatt) beenden
könnte.

Geht das? Ich denke dazu müßte das Makro als "Thread" bzw. im Hintergrund
laufen, oder?

Gruß, Christian
Reiner Wolff
2003-10-20 21:07:29 UTC
Permalink
Moin Christian,
Post by Christian Rohrbach
ich habe mir ein Makro gebastelt, welches einmal gestartet eine sehr
lange Zeit (30 Minuten) diverse Zahlen berechnet
wow, und das soll nicht schneller gehen?
Wenn es sich nicht um einen 486er handelt, mag ich das kaum glauben,
aber ....
Post by Christian Rohrbach
(und zur Laufzeit
auf einem Excelblatt ausgibt). Hin und wieder mächte ich dieses Makro
unterbrechen, dieses scheint aber nur per Strg+Pause zu
funktionieren. Lieber wäre es mir, wenn ich es mittes "Stopp"-Button
(button auf dem Excelblatt) beenden könnte.
Geht das? Ich denke dazu müßte das Makro als "Thread" bzw. im
Hintergrund laufen, oder?
Richtiger Weise müßte es dann in einem extra Thread laufen. Excel-VBA
kann sowas aber nicht. Daher hilft man sich hierbei mit einem (etwas
unschönen) Mittel weiter: Baue in Deine Prozedur einen DoEvents-Befehl
ein. Der sorgt dann dafür, dass alle anderen Threads die laufen, von
Windows Prozessorzeit zugeteilt bekommen (hierzu zählt auch Excel
selbst). Dadurch kannst Du zum einen inzwischen weiterarbeiten und zum
anderen wird Excel in die Lage versetzt überhaupt auf einen Stopp-Button
zu reagieren.
Über den Stopp-Button könntest Du dann eine globale Variable setzen, die
jeweils in Deinem Programmablauf abgefragt wird.
Ein Beispiel könnte so aussehen:

'In einem Modul
Public boolAbbrechen As Boolean
Public boolUnterbrechen As Boolean

Public Sub DeineSuppe()
Dim i As Integer

Do Until i = 1000000 Or boolAbbrechen
If Not boolUnterbrechen Then
i = i + 1
'DeineBerechnungen
DoEvents
End If
Loop
End Sub

'Im Code vom Excelblatt

Sub CommandButton1_Click()
'Die Ausführung der Berechnung lediglich unterbrechen
boolUnterbrechen = Not boolUnterbrechen
End Sub

Sub CommandButton2_Click()
'Die Berechnung komplett Abbrechen
boolAbbrechen = True
End Sub

Ich hoffe zum einen, dass es funktioniert und zum anderen, dass es Dir
hilft ;-)

Greetinx aus Kiel
Reiner
--
Es gibt Zeiten, wo einem alles gelingt. Aber das braucht niemanden zu
beunruhigen. Sie gehen sehr schnell vorüber...
Christian Rohrbach
2003-10-20 21:41:02 UTC
Permalink
Post by Reiner Wolff
wow, und das soll nicht schneller gehen?
Wenn es sich nicht um einen 486er handelt, mag ich das kaum glauben,
aber ....
ich habe die Exceldatei unter www.chrisinform.de/Lotto.zip zur Verfügung
gestellt..... dann wirst Du verstehen warum es so lange dauert
(es werden in einem Durchlauf knapp 14 Millionen "Ziehungen simuliert und
die Ergebnisse (ob 0,1,2,3,4,5,6 Richtige auf dem Excelbatt dokumentiert)
Die Abweichungen dokumentieren, bei genügend großer Zahl, wie gut die
RandomFunktion unter Excel ist (sie ist sehr gut!)
Sollte bei Dir mindestens 2 Stunden dauern bis der Zähler bei 14 Millionen
angekommen ist!

werde nun gleich mal Deine Idee einbauen, bin gespannt ob es klappt
Reiner Wolff
2003-10-20 22:06:31 UTC
Permalink
Moin Christian,
Post by Christian Rohrbach
ich habe die Exceldatei unter www.chrisinform.de/Lotto.zip zur
Verfügung gestellt..... dann wirst Du verstehen warum es so lange
dauert (es werden in einem Durchlauf knapp 14 Millionen "Ziehungen
simuliert und die Ergebnisse (ob 0,1,2,3,4,5,6 Richtige auf dem
Excelbatt dokumentiert) Die Abweichungen dokumentieren, bei genügend
großer Zahl, wie gut die RandomFunktion unter Excel ist (sie ist sehr
gut!)
Sollte bei Dir mindestens 2 Stunden dauern bis der Zähler bei 14
Millionen angekommen ist!
Uh oh, es wird wohl eher knapp 3 Stunden dauern ;-)
Aber vielen Dank für den download, er macht mich verstehen ;-)

Dabei viel mir noch etwas auf, was hinweiswürdig ist:
Ich vermute Du will - wie ich es früher auch versucht habe - mit
Dim x, y, z As Integer

alle Variablen als Integer deklarieren. Leider ergänzt der Compiler von
VBA das zu folgendem:
Dim x As Variant, y As Variant, z As Integer

Die Speichersparendere Variante - bei Deinem Programm vermutlich zwar
Speicher aber nicht wesentlich zeitsparend - sähe so aus:
Dim x As Integer
Dim y As Integer
Dim z As Integer

Diese Deklarationsversehen hast Du auch bei Deinen Arrays ...

Manchmal hilft einfach nur das Wissen drum ...
Greetinx aus Kiel
Reiner
--
Nur, weil der Arzt einen Namen für deinen Zustand
findet, heißt das nicht, daß er weiß, was dir fehlt.
Reiner Wolff
2003-10-20 22:10:34 UTC
Permalink
Moin Christian,

ach noch ein Nachschub:
Mit
Application.ScreenUpdating = False
dürfte der Durchlauf der Schleife erheblich schneller gehen.
Allerdings siehst Du dann zwischendurch keine Veränderung auf dem
Bildschirm. Vielleicht solltest Du es dann doch alle 50.000 Durchläufe
auf 'True' stellen, aber wenn der Bildschirm nicht aktualisiert werden
muss, spart das ungemein Zeit ;-)

Greetinx aus Kiel
--
Wie beschleunige ich einen Mac?
Mit 9,81 m/s².
Christian Rohrbach
2003-10-20 22:56:19 UTC
Permalink
Post by Reiner Wolff
Moin Christian,
Mit
Application.ScreenUpdating = False
dürfte der Durchlauf der Schleife erheblich schneller gehen.
Allerdings siehst Du dann zwischendurch keine Veränderung auf dem
Bildschirm. Vielleicht solltest Du es dann doch alle 50.000 Durchläufe
auf 'True' stellen, aber wenn der Bildschirm nicht aktualisiert werden
muss, spart das ungemein Zeit ;-)
Besten Dank!

Habe nun alles eingebaut, folgendes Ergebnis:

Stopp-Taste kostet rund 8% an Geschwindigkeit
Application.ScreenUpdating = False bringt 7 fache Geschwindigkeit...
StoppTaste funktioniert aber nicht mehr

naja, ist ja nur eine Spielerei..... (ich gebs ja zu). Aber immerhin hatte
ich 3 Richtige + Zusatzzahl am Wochenende (das erste mal das ich überhaupt
gespielt habe und gleich ein Gewinn!)

Loading...