VBA scheint Variablen Wertedefinition zu überlesen

Pyrukar

Captain
Registriert
Jan. 2013
Beiträge
3.468
hallo,

ich muss mich gerade mal wieder über VBA wundern und da ich weis, dass 99% aller Fehler vor dem PC sitzen hoffe ich, dass ihr mir hier weiter helfen könnt:

das Problem in kürze: j nimmt werte >6 an und bringt daher das array zum überlaufen obwohl es eigentlich durch k>=4 gedeckelt sein müsste

also ich habe in meinem code (relativ umfangreich und daher hier nur ein minimaler schnipsel) folgendes:


code/
j=0

For j = k To 1 Step -1

If L * act(1, 7) / (1.5 + sta(3, 1) / 25) / act(j + 1, 6) > 3.5 Then ...

Next
/code



j ist wie folgt inizialisiert und wird von diversen Subs als zählerschleifen variable verwendet: Dim j as Integer

die Variable k kann Werte von 1 bis 4 annehmen und hat diese laut debugger auch.

das Array act() ist bis act(7, 9) definiert

das Array sta macht keine probleme da ich es direkt zuweise selbiges ist über die variable L zu sagen




Ich habe keine Ahnung wo das programm j=8 hernimmt ( in einer anderen sub läuft j zwar von 1 bis 8 aber eigentlich wirds ja doppelt überschrieben. einmal mit 0 und einmal mit k) wenn ich den fehler debugge muss ich nur die letzte zeile (For j = k To 1 Step -1) noch einmal lesen lassen und auf einmal nimmt er tatsächlich j=k aber immer erst im zweiten Anlauf. ich habe keine Ahnung warum und auch die j=0 nimmt er immer erst wenn man ihn per debugger dazu zwingt :(

hat mir jemand einen Tipp wie ich dieses Problem in den griff bekomme? er scheint ja wirklich ganze zeilen zu ignorieren :(

gruß

Pyrukar
 
okay: der code sieht jetzt so aus:


Code/
j = 0

If k > 4 or k<1 Then MsgBox "Fehlerhaftes k"

For j = k To 1 Step -1

If L * act(1, 7) / (1.5 + sta(3, 1) / 25) / act(j + 1, 6) > 3.5 Then dwert (j)

Next
/code

ohne effekt, ich habe keine msgbox bekommen

also wie gesagt das k ist korrekt 1<k>4
 
Wie kann K bis 4 (inklusive) gedeckelt sein, wenn per Definition K>=4 (größer = 4) ist?
Das erlaubt ja auch K (und somit J) bis 6 und höher zu laufen.

Oder habe ich jetzt einen "Denkfehler" ? ;)

:edit: meine Antwort bezieht sich noch auf Deinen ersten Post - jetzt warst Du zu schnell oder ich zu langsam ;)
 
selbst wenn k=5 wäre würde das mir zwar den sinn meines codes zerstören aber nicht das array zum überlaufen bringen? also bitte nicht rumdiskutieren ob 5 jetzt für k noch nicht abgefangen wird oder nicht denn das erklärt nicht werte für j=8 und die bekomme ich andauernd

was ich allerdings überhaupt nicht verstehe:

ich bekomme ja die Fehlermeldung mit der möglichkeit zum debuggen: dann muss ich nichts weiter machen als die zeile ( For j = k To 1 Step -1) nochmal einlesen zu lassen und auf einmal klappt alles. ich verstehe nur nicht warum er es scheinbar ohne debug "nochmal lesen" nicht rafft j=k zu setzen. da ist doch eigentlich kein spielraum für spekulationen was den compiler angeht oder?
 
Zumal es ja ein Interpreter ist.

Ist auf jeden Fall seltsam.
Gehe doch mal direkt hinter FOR hin und lasse dir die Varablen in einer MsgBox anzeigen.
 
hmm das hat tatsächlich eine erkenntnis gebracht: es ist nicht der erste Durchgang in dem es schiefgeht sondern zufällig einer der ca. ersten 5

es werden nicht alle subs linear durchlaufen sondern es könnte durchaus sein, dass nur, wenn eine bestimmte sub durchlaufen wurde später der fehler auftritt aber verstehen kann ich es dennoch nicht :(
 
Vielleicht änderst Du k noch irgendwo.

Weise k einer anderen Variablen vor dem FOR zu und nimm diese dann im FOR.
 
also meinst du:

j = 0

If k > 4 or k<1 Then MsgBox "Fehlerhaftes k"

x=k

For j = x To 1 Step -1


?

EDIT: Kein effekt :( außerdem die msgbox gibt für k ja noch in der Forschleife einen richtigen wert aus

EDIT2: ich habe jetzt mal j durch x ersetzt und bekomme scheinbar keinen fehler mehr. verstehe aber immer noch nicht, wie j an dieser stelle 8 werden kann da ja immernoch die zeile j=0 drinsteht und in der for schleife noch immer msgbox j ausgegeben wird kann ich sehen, dass j immer noch alle 3-5 mal den wert 8 annimmt. wie kann das sein?
 
Zuletzt bearbeitet:
Könnte ich mir auch vorstellen, dass die Variablen global definiert wurden.

Wenn dann in einer anderen Sub k oder j oder was auch immer bereits verwendet wird, übergibt er den ermittelten Wert mit.
 
also j ist wie erwähnt so definiert : Dim j as Integer

und dass ich j öfter verwende habe ich auch schon erwähnt. was mich wundert ist, dass da steht: j=0 und in der nächsten zeile sagt das lokalfenster dass j=8 ist das kann doch eigentlich nicht sein oder?
 
Klingt schon sehr komisch. Du gehst da im Debugger in Einzelschritten durch? Trotz der globalen Definition sollte j ja in der for Schleife korrekte Werte annehmen. Hast du vielleicht eine Beispieldatei, bei der das Problem auftritt?
 
DIM kann man auch in der Sub anwenden. Dann wird die Variable auf den Stack gesichert. Bei globalen Variablen wird der Wert überschrieben.
 
@simpsonfan: da das problem scheinbar nur mit j und nur wenn eine bestimmte andere sub ( die ich bisher nicht analysieren konnte) auftritt wird es glaube ich schwierig das problem auf ein kleines beispiel runterzubrechen :(
@Miac: ja natürlich könnte ich j in jeder sub einzeln definieren aber auch eine global definierte sub sollte doch eigentlich von einem =0 befehl betroffen werden oder? außerdem wäre das jetzt ne heiden arbeit das alles zu ändern zumal ich jetzt ja ein x2 verwende anstatt von j und auf einmal klappts :)


gruß

Pyrukar

PS: ich will kein neues thema aufmachen aber kann mir jemand sagen, ob bzw wie man abhänig von einem Zähler die ausgabe auf ein neues tabellenblat umschalten kann? also eine funktion die aus Tabelle1.cells() ein Tabelle2.cells() macht. ich bräuchte das bis ca 7 was ein select case nicht unmöglich aber schon umständlich macht ;)
 
Wenn die globale Vaariable j in einem anderen SUB-Aufruf innerhalb der Schleife verändert wird, wird j auch innerhalb der äußeren Schleife verändert.

Grundsätzlich solltest Du die EXPLICIT Anweisung verwenden und so wenig wie möglich globale Variablen verwenden.

Zum Durchlaufen der Tabellenblätter mußt Du dir die Excel Objektreferenz anschauen. Da gibt es die Sheets-Auflistung.
Du solltest die Tabellenblätter also mit Sheets(1) usw. ansprechen können.
 
Beachte bei der Verwendung von Sheets(1) usw., dass die Reihenfolge der Sheets durch die Anordnung der Tabs für die Tabellenblätter bestimmt wird. Wenn also einer "Tabelle1" ganz nach rechts schiebt, so wäre die dann "Sheets(3)"
 
zum thema expicit: ich habe es unterschlagen aber ganz oben steht option expicit ;)

aber in der schleife wird ja nichts außerhalb der Sub aufgerufen und somit sollte j=8 immer noch gelten oder? und was lokale variablen angeht: schön und gut aber bei laufvariablen wie i, j, x1,x2,x3 o.ä. ist der aufwand doch unnötig groß sie lokal in jeder sub neu zu definieren :)

das mit den sheets muss ich dann mal ausprobieren falls ichs nicht auf die reihe bekomme melde ich mich nochmal :)
 
>aber in der schleife wird ja nichts außerhalb der Sub aufgerufen und somit sollte j=8 immer noch gelten oder?

Da hinter deinem THEN ein "..." steht, wissen wir nicht was in der Schleife und damit mit deinen Variablen passiert

> schön und gut aber bei laufvariablen wie i, j, x1,x2,x3 o.ä. ist der aufwand doch unnötig groß sie lokal in jeder sub neu zu definieren

Wie du siehst ist der Aufwand globale Variablen zu debuggen weil du vergessen hast dass du die irgendwo doch verwendest, größer. Testen ist 50% von Entwicklung, machs dir leicht und mach soviel wie möglich lokal.

Zum Problem allgemein: Benutz das Watch Window, pack da j und k rein und steppe über deine Funktion rüber. Wirst schnell sehen wo komische Werte kommen.
 
Zurück
Oben