AW: Verständnisproblem "ByVal" bei Objektvariablen
20.08.2014 13:03:28
Dieter
Hallo Sabrina,
ein interessantes Problem was du da angerissen hast. Wenn man schon lange im Geschäft ist, stellt man ja solche Fragen nicht mehr.
Ich habe mir das jetzt mal angeschaut und dabei festgestellt, dass man eine Objektvariable ByVal übergeben kann, wenn im Unterprogramm keine Veränderung in Excel vorgenommen wird.
Das siehst du an dem Beispiel Test_1. Dort wird einer Objektvariablen im Unterprogramm nur ein anderer Zellbereich zugewiesen, d.h. es wird keine Änderung im Tabellenblatt vorgenommen (ich habe das kurz "keine Veränderung in Excel" genannt). Hier funktioniert der Unterschied von ByVal und ByRef.
Dagegen wird im Beispiel Test_2 im Unterprogramm der Inhalt einer Zelle geändert. Jetzt gibt es keinen Unterschied zwischen ByVal und ByRef mehr.
Sub Test_1()
Dim rng1 As Range
Dim rng2 As Range
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Set rng1 = ws.Range("A1:B5")
Set rng2 = rng1
Keine_Veränderung_in_Excel_ByVal Bereich:=rng1
MsgBox Prompt:="Vorher: " & rng2.Address & _
vbNewLine & "Nachher: " & rng1.Address, _
Title:="ByVal"
Keine_Veränderung_in_Excel_ByRef Bereich:=rng1
MsgBox Prompt:="Vorher: " & rng2.Address & _
vbNewLine & "Nachher: " & rng1.Address, _
Title:="ByRef"
End Sub
Sub Keine_Veränderung_in_Excel_ByVal(ByVal Bereich As Range)
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Set Bereich = ws.Range("X3:Y7")
End Sub
Sub Keine_Veränderung_in_Excel_ByRef(ByRef Bereich As Range)
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Set Bereich = ws.Range("X3:Y7")
End Sub
Sub Test_2()
Dim rng As Range
Dim wert As Variant
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Set rng = ws.Range("A1")
rng = 4711
wert = rng.Value
Veränderung_in_Excel_ByVal Zelle:=rng
MsgBox Prompt:="Vorher: " & wert & _
vbNewLine & "Nachher: " & rng.Value, _
Title:="ByVal"
rng = 4711
wert = rng.Value
Veränderung_in_Excel_ByRef Zelle:=rng
MsgBox Prompt:="Vorher: " & wert & _
vbNewLine & "Nachher: " & rng.Value, _
Title:="ByRef"
End Sub
Sub Veränderung_in_Excel_ByVal(ByVal Zelle As Range)
Zelle = 5812
End Sub
Sub Veränderung_in_Excel_ByRef(ByRef Zelle As Range)
Zelle = 5812
End Sub
Viel Spaß bei der weiteren Forschungsarbeit und viele Grüße
Dieter