'Option Explicit
Private Sub BTN_Click() 'auslösendes Event
Dim para1, para2 As Integer
para1 = 1
para2 = 2
'weiterer Code
Call MeineUntersub(para1, para2)
'weiterer Code
MsgBox "Werte für para. weiterhin " & para1 & " , " & para2
End Sub
Rem ************************************************************************************
Rem Thema verfehlt, denn ....
Rem nur der Umstand, dass "ByVal" nicht angegeben wurde zählt als Fehler !
Rem
Rem Egal ob explizit "ByRef" oder ohne Angabe - WIRD IMMER NUR DIE SPEICHERADRESSE !
Rem an die Unterprozedur übermittelt - folglich ändert die Unterprozedur "diese" Variable
Rem daher ....
Rem Fehler beim Kompilieren - Argumenttyp ByRef unverträglich :
Rem diese Warnung bezieht sich auf "para1" - Variant kann nicht mehr verändert werden !
Rem
Rem dagegen expliziet "ByVal" wird eine neue Variable (hier zus. als Integer) erzeugt !
Rem ************************************************************************************
Sub MeineUntersub(ByVal para1 As Integer, ByVal para2 As Integer)
'Code der para1 und para2 auswertet
MsgBox "Werte für para. eingangs MeineSub " & para1 & " , " & para2
'diese Sub soll nichts an die obere Sub übergeben
para1 = 10
para2 = 20
MsgBox "Werte für para. jetzt in der MeineSub " & para1 & " , " & para2
End Sub
Sub Test()
para1 = 1
para2 = 2
Rem ***********************************************************************************
Rem und für das Handbuch des unnützen Wissens -
Rem die relevanten Fakten :
Rem nicht deklarierte Variable - somit Variant schlucken nicht nur Speicher -
Rem der Speicherinhalt muss eben auch mit unzählig unnötigen CPU- clock ticks
Rem umständlich verwaltet werden, d.s. ca. 200 % Mehraufwand je undeklarierter Variable
Rem was besonders erfreulich wenn das Makro das erste Mal startet und sich die RunTime
Rem einmalig alle nötigen API-Calls zusammenkratzt - ca. 800% im ersten Anlauf !
Rem (dagegen nimmt der Typ Long wegen der 32-bit Architektur nur 1 Schluck aus der ...)
Rem EGAL was soll´s (Die Väter des VBA haben sich schon etwas dabei gedacht)
Rem ***********************************************************************************
'weiterer Code
Call UnterTest(para1, para2)
'weiterer Code
MsgBox "Werte für para. weiterhin " & para1 & " , " & para2
Call FehlTest(para1, para2)
'weiterer Code
MsgBox "Werte für para. sind jetzt " & para1 & " , " & para2
End Sub
Sub UnterTest(para1, para2)
'Code der para1 und para2 auswertet
MsgBox "Werte für para. eingangs in der TestSub " & para1 & " , " & para2
'diese Sub soll nichts an die obere Sub übergeben
para1 = 1.111111111111 * para2
para2 = 2.222222222222 * para1
Rem ***********************************************************************************
Rem macht sie aber !!! - aber wie !!!!!!!
Rem soviel zum Nährwert von Variablendeklaration LOL
Rem denn .... 'diese Sub soll nichts an die obere Sub übergeben
Rem macht sie aber und zwar genau
Rem ***********************************************************************************
MsgBox "Werte für para. in der TestSub " & Format(para1, "#0") & " , " & Format(para2, "#0")
End Sub
Sub FehlTest(ByVal para1 As Double, ByVal para2 As Double)
Rem ***********************************************************************************
Rem ohne das "ByVal" fällt der auf die Schnauze !!!
Rem ***********************************************************************************
'Code der para1 und para2 auswertet
MsgBox "Werte für para. eingangs in der FehlSub " & para1 & " , " & para2
'diese Sub soll nichts an die obere Sub übergeben
para1 = CDbl(1.111111111111 * para2)
para2 = CDbl(2.222222222222 * para1)
Rem ***********************************************************************************
Rem macht sie aber !!! - aber wie !!!!!!!
Rem soviel zum Nährwert von Variablendeklaration LOL
Rem denn .... 'diese Sub soll nichts an die obere Sub übergeben
Rem macht sie auch nicht
Rem ***********************************************************************************
MsgBox "Werte für para. in der FehlSub " & para1 & " , " & para2
End Sub
|