Autor: Peter Haserodt  --- Aus Excel VBA - Gruppe: Tutorials

Parameterübergabe und ihreTücken

Autor: Peter Haserodt - Erstellt: --      - Letzte Revision: --

Parameter - aber Achtung

Die Frage, warum der folgende Code einen Fehler bringt und wie man dies vermeiden kann
Option Explicit
	
Public Sub TueEs()
	'Die Prozedur (Das Makro) welches ausgeführt wird
	Dim i As Integer
	i = 10
	MsgBox Quadrat(i)
End Sub
	
Private Function Quadrat(DerWert As Long) As Long
	Quadrat = DerWert ^ 2
End Function
Wenn man die Sub TuEs startet, kommt eine Fehlermeldung:
Argumenttyp ByRef unverträglich.

Was bedeutet dies?
Wenn ich an eine Sub oder Function einen Parameter(Argument) übergebe, muss dies auch in der entsprechenden Routine(Sub,Function) deklariert sein:
In unserem Beispiel haben wir die Function Quadrat die das Argument DerWert haben will.
DerWert haben wir aber gesagt, dass dieser vom Typ Long sein soll. Wir übergeben aber einen Integer.
Dies ist aber tatsächlich nicht der wirkliche Grund zum Husten für VBA (bzw. nur bedingt)

Das Problem ist, dass ich ein Argument ByRef oder ByVal übergeben kann.
Dies bedeutet:
ByRef meint, dass wenn ich das Argument innerhalb meiner Routine verändere diesen Wert an die Variable zurückgebe.
ByVal meint, dass ich den Wert nur an die Funktion übergebe, aber keine Rückgabe einleite.
Schreibe ich nichts vor die Deklaration, ist dieses per Default  ByRef.

Eine kleine Änderung würde VBA nicht mehr husten lassen:
	
Private Function Quadrat(ByVal DerWert As Long) As Long
	Quadrat = DerWert ^ 2
End Function
Der Grund:
Jetzt wird das Argument nur mit seinem Wert übergeben. Und ein Integer passt ja wunderbar in einen Long.
Da kein Wert an die Aufrufende Variable zurückgegeben wird, kann auch nichts passieren.
Selbst wenn ich die Variable in der Routine verändere, also aus einem Integer ein Long würde.

Auch hier ein Beispiel:
Option Explicit
	
Public Sub TueEs()
	'Die Prozedur (Das Makro) welches ausgeführt wird
	Dim i As Integer
	i = 1000
	MsgBox Quadrat(i)
	MsgBox i
End Sub
	
Private Function Quadrat(ByVal DerWert As Long) As Long
	DerWert = DerWert ^ 2
	Quadrat = DerWert
End Function
Und hier das Gegenbeispiel mit ByRef und gleicher Deklaration:
Option Explicit
	
Public Sub TueEs()
	'Die Prozedur (Das Makro) welches ausgeführt wird
	Dim i As Long
	i = 1000
	MsgBox Quadrat(i)
	MsgBox i
End Sub
	
Private Function Quadrat(ByRef DerWert As Long) As Long
	DerWert = DerWert ^ 2
	Quadrat = DerWert
End Function
Aber jetzt:
Kommen wir zurück auf unseren Ursprung:
Eine ganz kleine Änderung in unserem Ursprungscode macht es wieder möglich:
Option Explicit
	
Public Sub TueEs()
	'Die Prozedur (Das Makro) welches ausgeführt wird
	Dim i As Integer
	i = 10
	MsgBox Quadrat((i))
End Sub
	
Private Function Quadrat(DerWert As Long) As Long
	Quadrat = DerWert ^ 2
End Function

Durch die Klammerung der Variablen übergebe ich diese wieder ByVal sm3 (1K)

Weitere Artikel der Gruppe: Tutorials Aus Excel VBA
Nach oben