datagott > microsoft.public.* > microsoft.public.office.excel

BBert (30.05.2006, 00:00)
Beste Excellers,

Sommige variabelen blijven hun waarde behouden, ook al is de procedure
helemaal beeindigd. Met als gevolg verkeerde resultaten. Ik dacht dat
als de procedure opnieuw gestart wordt, alle variabelen als het ware op
nul beginnen (behalve de constanten dan).
Hoe kan dat (dat er nog een waarde in zit)?
emil (30.05.2006, 00:29)
kijk een in de help [nl] op:
De levensduur van variabelen
]-[oRus (30.05.2006, 01:18)
BBert vertrouwde ons het volgende toe:

> Beste Excellers,
> Sommige variabelen blijven hun waarde behouden, ook al is de
> procedure
> helemaal beeindigd. Met als gevolg verkeerde resultaten. Ik dacht
> dat
> als de procedure opnieuw gestart wordt, alle variabelen als het ware
> op nul beginnen (behalve de constanten dan).
> Hoe kan dat (dat er nog een waarde in zit)?


Er kunnen statische (static) of algemene (public) variabelen worden
gedeclareerd. Deze blijven ook buiten de proc hun waarde behouden.
BBert (30.05.2006, 11:01)
On Tue, 30 May 2006 00:29:46 +0200, wrote...

> kijk een in de help [nl] op:
> De levensduur van variabelen


Excel 2002 Engels
Help geeft weinig uitkomst. Ingetikt in VBE Help (F1) "scope"
Geeft als een van de resultaten:
Understanding Scope and Visibility en gaat over dat er 3 scope levels
zijn: procedure-level, private module-level, en public module-level.
Maar mij gaat het er om dat de variabelen hun waarden lijken vast te
houden ook al is de complete procedure afgerond.

Kijk even naar onderstaande (primitieve) voorbeeld.
Als ik Excel helemaal opnieuw opstart, zijn alle variabelen (t1 t/m t4)
leeg. Vervolgens start ik die macro een aantal keren opnieuw en dan
blijven de waarden in die variabelen zitten. Dat snap ik niet. Bij elke
nieuwe start van de macro tesjuh zouden volgens mij alle waarden gereset
moeten zijn (maar dat is niet het geval). Pas als ik Excel helemaal
afsluit, opnieuw start en vervolgens de macro laat lopen, is alles weer
leeg.
Hoe kan dat?

**********
Dim t1
Dim t2
Dim t3
Dim t4

Sub tesjuh()
geef_waarde
Debug.Print "t1 = " & t1 & Chr(13) & _
"t2 = " & t2 & Chr(13) & _
"t3 = " & t3 & Chr(13) & _
"t4 = " & t4 & Chr(13)
End Sub

Sub geef_waarde()
If t1 = Empty Then
t1 = 1
t2 = Empty
ElseIf t2 = Empty Then
t2 = 2
t3 = Empty
ElseIf t3 = Empty Then
t3 = 3
t4 = Empty
Else
t4 = 4
t1 = Empty
End If
End Sub
**********
]-[oRus (30.05.2006, 11:25)
BBert vertrouwde ons het volgende toe:

[..]
> t3 = Empty
> ElseIf t3 = Empty Then
> t3 = 3
> t4 = Empty
> Else
> t4 = 4
> t1 = Empty
> End If
> End Sub
> **********


t1 t/m t4 zijn buiten de subs gedefinieerd en dus public. Gelden dus
voor beide subs.

Wat gebeurt er als je het volgende gebruikt?
**********
Sub tesjuh()
Dim t1
Dim t2
Dim t3
Dim t4
geef_waarde
Debug.Print "t1 = " & t1 & Chr(13) & _
"t2 = " & t2 & Chr(13) & _
"t3 = " & t3 & Chr(13) & _
"t4 = " & t4 & Chr(13)
End Sub

Sub geef_waarde()
If t1 = Empty Then
t1 = 1
t2 = Empty
ElseIf t2 = Empty Then
t2 = 2
t3 = Empty
ElseIf t3 = Empty Then
t3 = 3
t4 = Empty
Else
t4 = 4
t1 = Empty
End If
End Sub
**********
BBert (30.05.2006, 11:54)
On Tue, 30 May 2006 11:25:41 +0200, ]-[oRus wrote...

> Wat gebeurt er als je het volgende gebruikt?
> **********
> Sub tesjuh()
> Dim t1
> Dim t2
> Dim t3
> Dim t4
> geef_waarde
> Debug.Print "t1 = " & t1 & Chr(13) & _


Tja, dan maak je de variabelen Private en dus alleen te zien door de
macro tesjuh. En ik moet de waarden nog in andere macro's gebruiken,
vandaar dat ik ze bovenaan declareer.

Het verbaast me dat de waarde behouden blijft ook al is alles afgerond.
Blijkbaar zit de waarde nog in het geheugen of zoiets.
Ik begrijp dat niet goed. Nog andere suggesties of uitleg?
BBert (30.05.2006, 23:37)
On Tue, 30 May 2006 01:18:39 +0200, ]-[oRus wrote...

[Lifetime variabelen]
> Er kunnen statische (static) of algemene (public) variabelen worden
> gedeclareerd. Deze blijven ook buiten de proc hun waarde behouden.


Zoiets is het ja. Ik heb nog even verder rond gekeken:

De waarde van private and public variabelen blijft behouden zolang de
werkmap is geopend en ze BOVENAAN de module gedeclareerd zijn. (Dat wist
ik dus niet).
Zijn ze BINNEN de macro gedeclareerd (met DIM) dan verliezen ze hun
waarde als de macro is voltooid, behalve als je ze als Static
declareert.

Weer wat geleerd!
Soortgelijke onderwerpen