Hallo Mo,
das zu erklären ist ein bisschen schwierig. Aber ich versuchs mal:
Erstens hast du die Konstante innerhalb der Sub deklariert weshalb sie auch nur dort wirkt. Durch den Funktionsaufruf übergibst du die Konstante a an den Parameter a der Funktion. Das ist jetzt aber eine Variable, die innerhalb der Funktion höhergewichtig ist. weil sie zuerst aufgerufen wird. Du kannst die Variable innerhalb der Funktion verändern, bei Rückgabe an die Konstante durch ByRef passiert jedoch nix, da Konstanten nunmal nicht verändert werden. Daher ist der DebugPrint in der Sub weiterhin 1. VBA verhält sich also hier richtig.
Zur Verdeutlichung habe ich deinen Code mal etwas abgeändert:
'Konstante Deklarieren
Const a As Integer = 1
Sub main()
'a = a + 1 'erzeugt einen Kompilierungsfehler
'Zuweisung zu einer Konstanten nicht zulässig.
'Funktionsaufruf
fkt a
Debug.Print a ' Ausgabe--> 1
End Sub
Function fkt(ByVal b As Integer)
b = b + 1
'a = a + 1 'erzeugt einen Kompilierungsfehler
'Zuweisung zu einer Konstanten nicht zulässig.
Debug.Print b 'Ausgabe --> 2
Debug.Print a 'Ausgabe --> 1
End Function
Die Konstante a übergibt nun den Wert an Variable b. Über Byval wird sichergestellt, dass die Veränderungen der Variablen b keinen Einfluss auf die Konstane a hat. Selbst wenn a ebenfalls eine Variable wäre. Konstanten die du im gesamten Modul bzw. Projekt verwenden willst gehören in den Modulkopf, also vor die erste Sub. Dadurch wird sie auch innerhalb der Funktion als Konstante behandelt und lässt sich nicht verändern.
Vielleicht hilft dir das ja weiter.
Gruß Mr. K.
|