Variablenübergabe/Werte gehen verloren

Moin auch,

schon wieder ich :smile:
Ich rufe ein Sub aus einem Sub auf. Dabei werden rund 100 Variablen übergeben, die ich per Type-Anweisung als Long definiert habe. Die Übergabe erfolgt mit der Anweisung byRef. Beim Ablauf erhalte ich den Laufzeitfehler 1004, was daran liegt, dass das Programm versucht, einen Wert in eine Zelle zu schreiben, wobei die Spaltennummer nicht definiert ist. Die liegt nämlich in einer der hundert Variablen und geht verschütt. Lustigerweise werden die Inhalte der ersten 30 Variablen dabei im Lokal-Fenster nicht angezeigt, erst ab 31, und die 31 verursacht den Fehler.
Zum Verständnis der Code:

Type HD
 pubRegHD1 As Long
...
pubRegHD96 As Long
End Type
Sub BuildRealPhysChem(startpt, strtss, subcnt, nextrr, vaicnt)
cc = 4
 Do Until Trim(Worksheets(pubwsresults).Cells(1, cc).VALUE) = ""
 cc = cc + 1
 Loop

 Worksheets(pubwsresults).Select
 Columns(cc).Select
 Selection.NumberFormat = "@"
 Worksheets(pubwsresults).Cells(1, cc).VALUE = "Zustand"
 Worksheets(pubwsresults).Cells(2, cc).VALUE = "1013\_001"
 Worksheets(pubwsresults).Cells(3, cc).VALUE = "STRING"
 pubRegHD1 = cc 'entsprechend für alle anderen pubRegHD's
If BV$ = "+BV" Then
 Select Case prop$
 Case "1013001"
 ActiveBVfor1013001$ = "Y"
 vaicnt = vaicnt + 1
 Call CntRealPhysChem(FilStr$, nextrr, rr, HD)
... mit end case etc.
End Sub
Private Sub CntRealPhysChem(ByVal FilStr$, nextrr, rr, HD)
blabla
If... Then
Call testRealPhysChem(laufzahl, inside, FilStr$, pubwsresults, nextrr, HD)
End If
End Sub

Private Sub testRealPhysChem(ByVal FilStr$, nextrr, rr, HD)
Select case...
Case "1013\_001\_VALUE"
 1013\_001\_VALUE = Trim(Worksheets(FilStr$).Cells(inside, 2).VALUE)'entprechend für rund 100 Werte
End Select
Worksheets(pubwsresults).Cells(nextrr, pubRegHD1).VALUE = 1013\_001\_VALUE
Worksheets(pubwsresults).Cells(nextrr, pubRegHD2).VALUE = 1013\_001\_EC\_TEMP\_PREC ' usw für rund 100 Werte
End Sub

Beim Aufruf der Zelle (nextrr,pubRegHD31) kommt der Laufzeitfehler. Lokalfenster sagt pubRegHD31="" (sowie für alle folgenden pubRegHDxx), die Werte für pubRegHD1 bis pubRegHD30 werden im Lokalfenster nicht angezeigt. Die Zellen (nextrr,pubRegHD1) bis (…,pubRegHD30) werden korrekt gefüllt.
Hilft das, umzu helfen?

Ralph

Hallo Ralph,

schon wieder ich :smile:

wenn du schon mal da warst könntest du wissen, immer angeben ob es sich um Vb oder Vba handelt und auch wichtig die Version.

Ich rufe ein Sub aus einem Sub auf. Dabei werden rund 100
Variablen übergeben, die ich per Type-Anweisung als Long
definiert habe. Die Übergabe erfolgt mit der Anweisung byRef.
Beim Ablauf erhalte ich den Laufzeitfehler 1004, was daran
liegt, dass das Programm versucht, einen Wert in eine Zelle zu
schreiben, wobei die Spaltennummer nicht definiert ist. Die
liegt nämlich in einer der hundert Variablen und geht
verschütt.

was heißt „verschütt“? wieso ist die Nummer weg? Gehe mal alles mit F8 ab…

Lustigerweise werden die Inhalte der ersten 30
Variablen dabei im Lokal-Fenster nicht angezeigt, erst ab 31,
und die 31 verursacht den Fehler.

*hust* Ich benutze das Lokalfenster für sowas nicht, k.A. warum da die ersten 30 nicht angezeigt werden.

Mein Problem ist, in deinem Code wimmelt es von globalen Variablen.
Woher soll ich wissen welechen Wert die haben wenn der Code gestartet wird?
Nun gibts zwei varianten, du reduzierst deine Codes auf etwas nachstellbares oder schickst den ganzen Code samt Beispielmappe.
Im zweiten fall kann es allerdings, habe da so meine Vorahnungen, dazu kommen daß ich mir den Code anschaue, scrolle und scrole, dann das Fenster schließe weil er mir zu lang ist.

w-w-w ist nicht dafür gedacht sich in langen Code zu vertiefen, eher und an sich für kleine klare frage, kleine klare Antwort.
Das Andere ist myhammer.de oder mich anmailen :smile:

Gruß
Reinhard

Hallo Reinhard,

wenn du schon mal da warst könntest du wissen, immer angeben
ob es sich um Vb oder Vba handelt und auch wichtig die
Version.

Guter Hinweis. Ich werde es mir hinter die Ohren schreiben.

was heißt „verschütt“? wieso ist die Nummer weg? Gehe mal
alles mit F8 ab…

Hab ich gemacht. Der Wert wird übergeben und ist dann weg.

Mein Problem ist, in deinem Code wimmelt es von globalen
Variablen.
-) Das ist auch mein Problem, jedenfalls eines meiner Probleme.
Nun gibts zwei varianten, du reduzierst deine Codes auf etwas
nachstellbares oder schickst den ganzen Code samt
Beispielmappe.
Im zweiten fall kann es allerdings, habe da so meine
Vorahnungen, dazu kommen daß ich mir den Code anschaue,
scrolle und scrole, dann das Fenster schließe weil er mir zu
lang ist.

Das wird wohl passieren, es sind nämlich mehrere tausend Zeilen. Es gibt aber eine pragmatische Lösung und die funktioniert sogar: pubregHDxx sind Spaltennummern. Über eine Routine wird geprüft, welchen Wert pubregHD1 haben soll, alle anderen sind jeweils eins größer. Also übergebe ich nur pubregHD1 und zähle dann jeweils eins hoch. Das funktioniert einwandfrei, auch wenn es meine Frage nicht beantwortet. Das Funktionieren ist mir aber definitiv wichtiger.

Trotzdem vielen Dank,

Ralph

Hallo,

Hab ich gemacht. Der Wert wird übergeben und ist dann weg.

Deine Fehlerbeschreibung liest sich, als würdest Du davon ausgehen, daß Dein Code für den Fehler nicht verantwortlich ist, daß VBA einen Bug hat und etwas falsch macht.

So wie sich der Fehler darstellt wäre er vor Jahren entdeckt und beseitigt worden. Du kannst davon ausgehen, daß VBA alles richtig macht, die Ursache für das Problem in Deinem Code steckt.

Wenn Daten verschwinden, dann entfernt die Dein Code. Du suchst nicht nach einer Lösung, ein Problem zu umgehen, das Dir Microsoft beschert hat, Du suchst nach einem Fehler, den Du selbst eingebaut hast.

Oft hilft die Erkenntnis, daß VB korrekt arbeitet, bei der Fehlersuche. :smile: Wenn Du jetzt nur das Symptom behandelt hast, die Ursache aber noch in Deinem Code steckt, können an unerwarteter Stelle weitere Probleme auftauchen, falsche Ergebnisse z.B. die schwer zu erkennen sind. Ich würde unbedingt weiter nach der Ursache suchen! Und zwar in Deinem Code. :smile:

Gruß Rainer

Hallo Rainer,

Deine Fehlerbeschreibung liest sich, als würdest Du davon
ausgehen, daß Dein Code für den Fehler nicht verantwortlich
ist, daß VBA einen Bug hat und etwas falsch macht.

So vermessen bin ich nicht :smile: Mir ist schon klar, dass in meinem Code etwas nicht stimmt.

So wie sich der Fehler darstellt wäre er vor Jahren entdeckt
und beseitigt worden. Du kannst davon ausgehen, daß VBA alles
richtig macht, die Ursache für das Problem in Deinem Code
steckt.

Davon gehe ich aus.

Wenn Daten verschwinden, dann entfernt die Dein Code. Du
suchst nicht nach einer Lösung, ein Problem zu umgehen, das
Dir Microsoft beschert hat, Du suchst nach einem Fehler, den
Du selbst eingebaut hast.

Jepp

Wenn Du jetzt nur das Symptom behandelt hast,
die Ursache aber noch in Deinem Code steckt, können an
unerwarteter Stelle weitere Probleme auftauchen, falsche
Ergebnisse z.B. die schwer zu erkennen sind. Ich würde
unbedingt weiter nach der Ursache suchen!
Und zwar in
Deinem Code. :smile:

Wenn das Makro (dereinst irgendwann mal hoffentlich) fertig ist, wird es von Dutzenden Leuten hunderte Mal mit unterschiedlichsten Input-Dateien, speziell erstellt wie auch real life, getestet. Wenn also ein Fehler im Code noch enthalten sein sollte, wird der auch gefunden, da bin ich zuversichtlich. Nur sollte es eben vorher fertig sein.
Falsche Ergebnisse werden sehr einfach erkannt werden, weil das Ergebnis meines Codes weiter verarbeitet wird und wenn Fehler enthalten sein sollten, geht ein anderes Konvertierungsprogramm auf die Bretter.
Also, prinzipiell gebe ich dir recht, mache aber trotzdem einfach weiter und erbitte deine Absolution ob dieses Veorgehens.

Ralph

Hallo Ralph,

Also, prinzipiell gebe ich dir recht, mache aber trotzdem
einfach weiter und erbitte deine Absolution ob dieses
Veorgehens.

*gg* Ich wollte Dich nur auf überraschende Ereignisse vorbereiten. :smile:

Wenn Dein Code sich scheinbar unmotiviert verhält, bei zwei mal zwei plötzlich 9 errechnet, kann es passieren, daß Dir das in den hunderten Daten nicht auffällt.

Gruß Rainer

etwas off topic
Hallo Rainer.

Wenn Dein Code sich scheinbar unmotiviert verhält, bei zwei
mal zwei plötzlich 9 errechnet, kann es passieren, daß Dir das
in den hunderten Daten nicht auffällt.

Stimmt. Aber: Mein Code gibt eine Exceltabelle aus, die von einem anderen Programm eingelesen und konvertiert wird. Dieses andere Programm braucht einen exakten Aufbau des Excels in Punkto was steht in welcher Reihe und welcher Spalte, sonst läuft es auf Fehler. Die Werte in diesen Reihen und Spalten verändere ich nicht, die werden von meinem Makro nur aus einer Datei eingelesen und wieder im Arbeitsblatt ausgegeben. Das maximale, was also passieren kann ist, dass mein Makro einen Wert in einer falschen Reihe oder Spalte ausgibt, nicht aber, dass der Wert an sich falsch ist. Im ersten Fall meckert das andere Programm. Ergo finde ich alle Fehler.

Ralph

Hallo Ralph,

OK, dannn vergiss wieder, daß ich mich gemeldet habe. :smile:
Bei VBA kann ich ohnehin nicht helfen.

Gruß Rainer

Hallo Rainer,

OK, dannn vergiss wieder, daß ich mich gemeldet habe. :smile:

Aber bitte, Hilfe wird immer gerne angenommen.

Bei VBA kann ich ohnehin nicht helfen.

Das stimmt so nicht. Du hast mir doch wunderbar erklärt, wie sich rekursive Prozeduren verhalten. Das war richtig gut!
Ralph

Hallo Ralph,

Du hast mir doch wunderbar erklärt, wie
sich rekursive Prozeduren verhalten.

das war VB!

An so zentralen Stellen sind VB6 und VBA identisch.
Sobald Du auf Deine Arbeitsmappe zugreifst, verstehe ich den Code nicht mehr.

Apropos ‚rekursive Funktion‘ …

Etwas weiter unten habe ich dafür noch ein hübsches Beispiel:
/t/vb6-rangfolge-von-zahlen-in-einer-flexgrid-zeile/…

Aber die Funktion Quicksort ist natürlich nicht von mir, die ist kopiert und nur angepasst. Die kannst Du Dir aber mal ansehen! Quicksort sortiert fast so schnell, wie das Auflisten geht. Jeder Datensatz wird nur einmal angefasst und wenn nötig verschoben.

Gruß Rainer

Hallo Ralph,

wenn du schon mal da warst könntest du wissen, immer angeben
ob es sich um Vb oder Vba handelt und auch wichtig die
Version.

Guter Hinweis. Ich werde es mir hinter die Ohren schreiben.

*grins* scheinbar ist die Tinte verlaufen, bei deiner neuen Anfrage fehlt die Versionsangabe, aber immerhin die Angabe Vba ist da *lob* :smile:

was heißt „verschütt“? wieso ist die Nummer weg? Gehe mal
alles mit F8 ab…

Hab ich gemacht. Der Wert wird übergeben und ist dann weg.

Wie weg? Dazwischen MU? doch eine Codezeile gewesen sein die ihn „weg“ machte!

Mein Problem ist, in deinem Code wimmelt es von globalen
Variablen.
-) Das ist auch mein Problem, jedenfalls eines meiner Probleme.

Minimiere die Anzahl an globalen Variablen.
Soweit ich weiß sagen Profis das. Lieber Subs mit Übergabeparametern aufrufen.
Die Subs klein halten. Also mehrere kleinere Subs nacheinander aufgerufen als eine große Sub.

Nun gibts zwei varianten, du reduzierst deine Codes auf etwas
nachstellbares oder schickst den ganzen Code samt
Beispielmappe.
Im zweiten fall kann es allerdings, habe da so meine
Vorahnungen, dazu kommen daß ich mir den Code anschaue,
scrolle und scrole, dann das Fenster schließe weil er mir zu
lang ist.

Das wird wohl passieren, es sind nämlich mehrere tausend
Zeilen.

Mehrere tausend Codezeilen? Jeder mensch wächst an seinen Aufgaben (oder scheitert gnadenlos dran *gg*).
Wenn ich erahne daß das Projekt was ich vorhabe riesengroß wird, würde ich unbedingt vorher viel Gedanken um die Organisation des Codes machen.
Also Benennung der Module. Benennung der Variablen.
Stichwort „ungarische Notation“ u.v.m.

Denn es gibt schon fähige leute die tagtäglich mit sehr vielen Codezeilen umgehen, dadurch können sie auch viel schneller als ich Ungeübter fremden langen Code „überblicken“ und ggfs. einen Fehler finden.
Aber nur wenn du dich an die Standards bei benennungen gehalten hast.
Sonst brauchen auch die Vollprofis viele Stunden/tage bis sie deinen Code ansatzweise „begriffen“ haben, erst dann kann die eigentliche Fehlersuche beginnen.

Das funktioniert
einwandfrei, auch wenn es meine Frage nicht beantwortet. Das
Funktionieren ist mir aber definitiv wichtiger.

Rainer hat sehr Recht, langfristig bringt reine Wirkungsbekämpfung nix, die Ursache muß geklärt werden.

Gruß
Reinhard

Trotzdem vielen Dank,

Ralph

Hallo Reinhard,

Mein Problem ist, in deinem Code wimmelt es von globalen
Variablen.

Ich werde das npch ändern und sie nur da deklarieren, wo sie auch gebraucht werden. Das dauert aber, weil: Ich lese ca. 100 Eigenschaften ein, die aus je bis zu 15 Merkmalen bestehen plus je 5 Sonderfelder. Macht also, worst case scenario, 2000 Variablen. Aktiv abgrufen werden pro Durchaluf nur ca. 300, aber deklarieren muss ich trotzdem alle.

Lieber Subs mit Übergabeparametern aufrufen.
Die Subs klein halten. Also mehrere kleinere Subs nacheinander
aufgerufen als eine große Sub.

Schon gemacht. Momentan sind es 30 Subs, ich bin aber noch nicht fertig.

Mehrere tausend Codezeilen? Jeder mensch wächst an seinen
Aufgaben (oder scheitert gnadenlos dran *gg*).

On verra, wir der Franzose sagt :smile:

Wenn ich erahne daß das Projekt was ich vorhabe riesengroß
wird, würde ich unbedingt vorher viel Gedanken um die
Organisation des Codes machen.
Also Benennung der Module. Benennung der Variablen.

Ist (größtenteils) gemacht.

Stichwort „ungarische Notation“ u.v.m.

Die brauche ich eher nicht. Die Variablen sind schon fast alle ziemlich eindeutig benannt und ich weiß, was drin steht.

Rainer hat sehr Recht, langfristig bringt reine
Wirkungsbekämpfung nix, die Ursache muß geklärt werden.

Habs gefunden. Alle >pubregHD30 waren nicht deklariert. Sie spare ich mir auch, dann habe ich weniger Variablen und zähle einfach eins hoch, wie schon getan.

Ralph

Stichwort „ungarische Notation“ u.v.m.

Die brauche ich eher nicht. Die Variablen sind schon fast alle
ziemlich eindeutig benannt und ich weiß, was drin steht.

Hallo Ralph,

schön daß du jetzt weißt was die namen bedeuten, wie sieht es in 3 Wochen aus, weißt du dann auch noch ohne Zeitaufwendiges Recherchieren was denn deine Variablen:

vin,sline,ilinecnt,statcnt,msgcnt,puptxt15,Str$,i,filestr$,qrystr

so alles darstellen/beinhalten und welchen Datentyp sie darstellen?

Grad wenn du viel Codezeilen hast solltest du meine wie ich finde hilfreiche Kritik absolut nicht als Angriff sehen sondern versuchen die Tipps umzusetzen.

Jeder tut sich einfacher, also weniger Zeitverlust=Effektivität wenn man am Variablennamen sofort ablesen kann, den Datentyp, ob Mappen-global Modul-public oder nur Prozedur bekannt.

Gruß
Reinhard

Hallo Reinhard,

vin,sline,ilinecnt,statcnt,msgcnt,puptxt15,Str$,i,filestr$,qrystr

Die sind alle nicht von mir :smile: Aber die meisten davon werde ich noch wissen (von den pubtxt gibt es rund 50 Stück).

Grad wenn du viel Codezeilen hast solltest du meine wie ich
finde hilfreiche Kritik absolut nicht als Angriff sehen
sondern versuchen die Tipps umzusetzen.

Ich empfinde deine (und Rainers) Kritik nicht als Angriff, sondern als wirklich hilfreich. Ich werde die Variablen auch noch umbenennen, sobald der Code läuft. Was daran liegt, dass es, wenn ich fertig bin, viele hundert Codezeilen geben wird, die nie abgerufen werden und deswegen gelöscht werden. Solange das Ding aber nicht läuft, weiß ich noch nicht, welche Zeilen ich brauche.

Jeder tut sich einfacher, also weniger
Zeitverlust=Effektivität wenn man am Variablennamen sofort
ablesen kann, den Datentyp, ob Mappen-global Modul-public oder
nur Prozedur bekannt.

Jepp. kein Widerspruch.

Ralph