Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
152to156
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
152to156
152to156
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Warum muss ich Memory via 'END' löschen?

Warum muss ich Memory via 'END' löschen?
27.08.2002 19:04:06
Marc E.
hallo kollegen!

ich dreh noch durch. Wenn ich am ende meines codes kein END stehen hab, dann krieg ich andere resultate beim darauffolgenden ausführen desselben codes. END löscht anscheinend das ganze memory sauber. Warum nützen meine ERASE statements nix? das gibts doch gar nicht... muss doch ohne END gehen (das kappt nämlich ein paar channels die ich auch noch offen habe (und offen halten will!)

danke fuer jeden tip!
gruss marc

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Re: Warum muss ich Memory via 'END' löschen?
27.08.2002 20:05:24
Axel
Hallo,

vermutlich arbeitest Du (zu viel) mit globalen Variablen.

Diese behalten nach Abarbeiten von Makro-Prozeduren ihren Wert auch nach Beenden der Prozedur und werden erst duch eine "end"-Anweisung gelöscht.

Mit "erase" werden lediglich Datenfelder (Arrays) auf 0-Werte gesetzt.

Gruß
Axel

Re: Warum muss ich Memory via 'END' löschen?
28.08.2002 09:30:23
Marc E.
hm.. ich benütze in diesem code keine einzige globale variable, sind alle auf modulebene definiert.

könnts an meinen set range commands liegen, die auf Ranges verweisen? Beispiel:

set myrange(1)=Range("bla")

ich benütze jedoch ein

range("bla").clearcontents

vor dem set, deshalb sollten auch da keine alten daten zurueckbleiben, oder irre ich mich?

danke fuer deine hilfe!

Anzeige
Re: Warum muss ich Memory via 'END' löschen?
28.08.2002 09:43:01
Axel
Hallo,

das hat mit "set" und "range" nichts zu tun.

Du schreibst da, Du hättest keine globalen Variablen, wohl aber welche auf Modulebene.

Diese verhalten sich bzgl. der Lebensdauer aber wie globale Variablen:

Starte den Code des folgendes Beispiel mehrmals hintereinander und Du wirst sehen, dass i den Wert nach Beenden der Prozedur (und damit nach Beenden des kompletten Makro) behält.

Prozedurlokale Variablen werden dagegen direkt nach Beenden der Prozedur aus dem Speicher entfernt.

Gruß
Axel


Re: Warum muss ich Memory via 'END' löschen?
28.08.2002 10:10:32
Marc E.
Scheibenkleider.. S C H E I BEnkleider... tatsache!

hab ich bis heute nie festgestellt.. hatte nie probleme damit, argh.. was empfiehlst du mir:

a) die deklarationen in die procedur aufnehmen (prozedurlokal)
oder
b) sie auf modulebene sein lassen und korrekt löschen

gibts denn ne möglichkeit die auf modulebene deklarierten variablen auf einmal zurückzusetzen?

ich bin geschockt.. hmm das lässt mich jetzt nicht los, was mach ich denn z.b. wenn ich mehrere prozeduren habe (im gleichen modul) die variablen mit dem gleichen namen verwenden (weil die namnesgebung sinnvoll ist) jedoch aber NICHT den wert der variable übernehmen sollen sondern selber einen zuweisen oder berechnen. ich nehme an, ich hatte nie probleme, weil in diesem falle jeweils der inhalt einfach ueberschrieben wurde. dennoch, sollte ich in solchen fällen jede einzelne variable vorher auf 0 setzen? ist ja ätzend!

still shocked...

thanks!!!!!!!!!!!!!

Anzeige
Re: Warum muss ich Memory via 'END' löschen?
28.08.2002 10:40:14
Axel
Hallo,

es sollten grundsätzlich prozedurlokale Variablen verwendet werden. Dies hilft Fehler zu vermeiden und erhöht zudem die Übersichtlichkeit und Verständlichkeit des Codes. Es ist ja immer mal möglich, daß jemand anderes Deinen Code warten muß.

Natürlich gibt es Ausnahmen, in denen globale Variablen notwendig sind. Das gilt z.B. für Ereignisroutinen, bei denen die Übergabeparameter ja festgelegt sind und keine eigenen Parameter mitgegeben werden können.

Oder aber bei Aufruf von Prozeduren über die OnTime-Methode. Hier können auch keine Parameter übergeben werden.

Wenn in einem umfangreichen Projekt viele globale Variablen zusammenkommen, kann man diese ggf. in eine Struktur (type) einbetten.

Bei einer vernünftigen modularen und prozeduralen Programmierung, bei der für jede kleine Aufgabe eine eigene Funktion (BlackBox) entwickelt wird, sind globale Variablen eigentlich nie notwendig.

Gruß
Axel

Anzeige
Re: Warum muss ich Memory via 'END' löschen?
28.08.2002 10:53:24
Marc E.
aber was machst du, wenn du z.b. 5 prozeduren im gleichen modul hast, die alle folgendes feld benötigen (NICHT aber den WERT den möglicherweise ein der vier anderen bereits zugeteilt hat!)

Dim varClientNumber as variant

Muss ich jetzt in jeder Prozedur diese Zeile am Anfang aufrufen? Wenn ich das auf Modulebene mache, genügt eine Zeile, aber leider ist dann die Lebensdauer nicht nach ende einer Prozedur beendet. Sehe ich das richtig?

Danke vielmals Axel, da sieht man mal wieder, warum ich mal nen Programmierkurs hätte besuchen sollen. Learning by doing ist halt auch nicht alles...

Re: Warum muss ich Memory via 'END' löschen?
28.08.2002 11:11:01
Axel
Hallo,

das mit dem Hinweise auf einen Programmierkurs in Deinem Posting ist gar keine so schlechte Idee ;))

Wenn Du die Deklarationszeile

Dim varClientNumber as variant

in jede Prozedur setzt, arbeitest Du doch jeweils auf einer lokalen Kopie. Beim Durchlaufen der Prozeduren wird diese Variable jedesmal neu erzeugt und ist zunächst leer. Seiteneffekte sind damit ausgeschlossen.

In diesem Fall, da die Variable ja vermutlich einen Integer-Datentyp (läßt der Name vermuten) aufnimmt, wäre die direkte Benutzung einer Integer-Variable

Dim intClientNumber as Integer

angebracht. Diese braucht nicht nur weniger Speicherplatz, auch der Zugriff hierauf erfolgt deutlich schneller.

Variants sollten nur dort benutzt werden, wo dies unumgänglich ist, sonst bitte immer den direkten Datentyp (integer, string, etc.) verwenden.

Aber da wären wir schon beim nächsten Thema.

Gruß
Axel

Anzeige
Re: Warum muss ich Memory via 'END' löschen?
28.08.2002 11:22:22
Marc E.
ja klar, das mit dem variant ist mir bewusst, ich bin nur etwas schlampig weil speed und memory eh selten das problem sind, aber da wos 'crucial' ist hab ich mir in diesem punkt echt muehe gegeben :)

trotzdem aergerlich, dass ich dieselbe zeile in jeder procedure brauche, wos doch so schön uebersichtlich am anfang des moduls ging.. tja.. thats life!

thanks mate! du hast mir echt geholfen!

viele grüsse aus der schweiz!
marc

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige