[EXCEL] Makro stürzt ab

sebi

Stammgast
Hi leute, ich hab mir mal in VB ein Makro programmiert. Aber immer, wenn ich es laufen lassen, stürzt Excel ab. Kann mir jemand sagen wiso, und wie man das verhindern kann ?
HTML:
For s = 1 To 100000
x = Round((Rnd()) * 56 + 1)
Y = Round((Rnd()) * 56 + 1)

Cells(x, Y).Interior.ColorIndex = Round((Rnd()) * 56)


Round ((Rnd()) * 56)
Next s

End Sub
 

froeschli

Stammgast
Code:
[COLOR="Blue"]Option Explicit[/COLOR] [COLOR="SeaGreen"]'IMO sollte man diese Zeile immer schreiben
                '=> erzwingt sämtliche Variablen deklarationen![/COLOR]

[COLOR="Blue"]Public Sub[/COLOR] [I]subName[/I]()[COLOR="SeaGreen"] 'Diese Zeile fehlt komplet bei dir... oder hast du die vergessen?[/COLOR]
[COLOR="Blue"]Dim [/COLOR]s [COLOR="Blue"]As Integer[/COLOR], X [COLOR="Blue"]As Integer[/COLOR], Y [COLOR="Blue"]As Integer[/COLOR] [COLOR="SeaGreen"]'Variablen immer deklarieren![/COLOR]

[COLOR="Blue"]For [/COLOR]s = 1 [COLOR="Blue"]To [/COLOR]100000
    X = Round((Rnd()) * 56 + 1, 0)[COLOR="SeaGreen"] 'die Funktion Round() verlangt zwei Parameter:[/COLOR]
    Y = Round((Rnd()) * 56 + 1, 0) [COLOR="SeaGreen"]'eine Zahl und die Anzahl Stellen![/COLOR]
    
    Cells(X, Y).Interior.ColorIndex = Round((Rnd()) * 56, 0) [COLOR="SeaGreen"]'dito[/COLOR]
    Round ((Rnd()) * 56) [COLOR="SeaGreen"]'was soll diese Zeile bewirken?[/COLOR]
[COLOR="Blue"]Next [/COLOR]s
[COLOR="Blue"]End Sub[/COLOR]

Ist es das, was du willst?

Gruss froeschli

EDIT:
PS. falls dein Code nicht läuft, kannst du mit der Taste F8 einzelne Zeilen durchlaufen lassen. Dann findest du die Zeile, in welcher der Fehler auftritt...

PPS. nette Flimmerkisten-Idee ;) Ich bin bei der Arbeit mal wieder priviligiert und habe einen 30" Monitor. Wenn ich nun die Excel-Mappe raus-zoome auf 10% und den Bereich erweitere auf 220x220 sieht das wirklich nett aus :)
 
Zuletzt bearbeitet:

Officer

Stammgast
Code:
[COLOR=blue]Dim [/COLOR]s, X, Y [COLOR=blue]As Integer[/COLOR] [COLOR=seagreen]'Variablen immer deklarieren![/COLOR]

Hallo froeschli

Noch kurz zu Deiner Zeile: Es muss jede Variable einzeln deklariert werden. Es reicht nicht, nur am Ende der Zeile den Wert zu setzen. In Deinem Code ist somit nur y as Integer deklariert, alle anderen sind somit Variant. Es muss so heissen:

Code:
[COLOR=blue]Dim [/COLOR]s as Integer, X as Integer, Y [COLOR=blue]As Integer[/COLOR]
[/QUOTE]
 

froeschli

Stammgast
Danke für den Hinweis. Bin seit zwei Jahren Java geschädigt ... ;)

Gruss froeschli

PS. werde es gleich entsprechend korrigieren...
 

sebi

Stammgast
Danke für die Hilfe, Froeschli, ich bin in diesem Gebiet halt ein blutiger anfänger...

nun aber noch ne andere Frage:
Für was sind diese 2 Zeilen gut ?
Public Sub subName() 'Diese Zeile fehlt komplet bei dir... oder hast du die vergessen?
Dim s As Integer, X As Integer, Y As Integer 'Variablen immer deklarieren!
 

Officer

Stammgast
Hallo sebi

Public Sub subName() 'Diese Zeile fehlt komplet bei dir... oder hast du die vergessen?

Dies ist der Anfang eines Makros. Das Public ist dabei nicht unbedingt nötig. Ein Code (das nennt man Prozedur) muss so aussehen:

Code:
[COLOR=#0000ff]Sub[/COLOR] [I]subName[/I]()
...DeinSuper code...
[COLOR=blue]End Sub[/COLOR]

Dabei musst Du anstelle von subName natürlich einen eigenen Namen geben. Dieser darf dann nur einmal vorhanden sein. Das heisst, wenn Du eine andere Prozedur machst musst Du einen anderen subName verwenden.

Es gibt dann noch Prozeduren, welche sich Funktionen nennen. Aber das wäre zu viel hier.

Dim s As Integer, X As Integer, Y As Integer 'Variablen immer deklarieren!

s, X und Y sind Variablen. Diesen können Werte zugewiesen werden, wie das in Deinem Code der Fall ist. Diese Variablen können verschiedene Werte beinhalten (Text, Zahlen, Auflistungen etc.). Um den Code schneller ablaufen zu lassen und um Fehler zu vermeiden sollten sie immer Deklariert werden (d.h. der Wert der Variable sollte bestimmt werden). In diesem Beispiel können alle Variablen Werte zwischen minus 32768 und plus 32767 annehmen.
 

froeschli

Stammgast
@Officer:
Danke fürs Einspringen! War in der Mittagspause ein wenig beschäftigt ;)

@sebi:
Was genau möchtest du eigentlich mit diesem Makro bezwecken??

Gruss froeschli
 

sebi

Stammgast
Einfach den Bildschirm ein wenig flimmern lassen, aus spielerei.
Wenn ich beim Makro For s= 1 to 10'000 eingebe, erscheint eine Warnmeldung: Laufzeitfehler 6: Überlauf. Bei meiner Version kann ich das aber ausführen, ohne probleme. Bei meiner Version habe ich noch das problem: das Makro startet, aber nach einiger Zeit stürzt Excel ab, fängt sich aber nach ca. einer min. wieder. Kann mir jemand sagen wiso ?
 

froeschli

Stammgast
Code:
[COLOR="Blue"]Option Explicit[/COLOR] [COLOR="SeaGreen"]'IMO sollte man diese Zeile immer schreiben
                '=> erzwingt sämtliche Variablen deklarationen![/COLOR]

[COLOR="Blue"]Public Sub[/COLOR] [I]subName[/I]()[COLOR="SeaGreen"] 'Diese Zeile fehlt komplet bei dir... oder hast du die vergessen?[/COLOR]
[COLOR="Blue"]Dim [u][/COLOR]s [COLOR="Blue"]As Long[/COLOR][/u], X [COLOR="Blue"]As Integer[/COLOR], Y [COLOR="Blue"]As Integer[/COLOR] [COLOR="SeaGreen"]'Variablen immer deklarieren![/COLOR]

[COLOR="Blue"]For [/COLOR]s = 1 [COLOR="Blue"]To [/COLOR]100000
    X = Round((Rnd()) * 56 + 1, 0)[COLOR="SeaGreen"] 'die Funktion Round() verlangt zwei Parameter:[/COLOR]
    Y = Round((Rnd()) * 56 + 1, 0) [COLOR="SeaGreen"]'eine Zahl und die Anzahl Stellen![/COLOR]
    
    Cells(X, Y).Interior.ColorIndex = Round((Rnd()) * 56, 0) [COLOR="SeaGreen"]'dito[/COLOR]
    Round ((Rnd()) * 56) [COLOR="SeaGreen"]'was soll diese Zeile bewirken?[/COLOR]
[COLOR="Blue"]Next [/COLOR]s
[COLOR="Blue"]End Sub[/COLOR]

Ich habe den Code nicht nochmals getestet, seit ich die Korrektur, die Officer bemängelt hat, korrigiert habe... Offenbar stösst Integer an seine Grenzen mit 100'000. Wenn du wie oben beschrieben, die Variable s als Long statt Integer definierst, wird es wieder laufen...

Gruss froeschli
 

Officer

Stammgast
Ich habe den Code nicht nochmals getestet, seit ich die Korrektur, die Officer bemängelt hat, korrigiert habe...

Ich habe nichts bemängelt, nur darauf hingewiesen, wenn Du richtigerweise schon mit den Deklarationen der Variablen kommst. Somit hast Du selbst bewiesen, dass, wenn Integer nur am Ende der Zeile steht, die anderen Variablen immer noch Variant sind. :)


–32768 bis +32767 um genau zu sein;)

Das steht auch in meinem Posting :)
 
Oben