|
▼ON さん:
こんにちは
////////////一番大きな違い////////////
値渡し:
渡したいデータをコピーして、コピーしたデータへの参照を渡す。
従って、コピーしたデータを関数などで弄くっても元のデータには影響を及ぼさない
参照渡し:
渡したいデータが格納されているデータへの参照を渡す。
関数などでこのデータ弄くると、元のデータを弄くることになり、
元のデータに影響を及ぼすことになる。
////////////////////////////////////
↑を踏まえた上で下記を読んで下さい。
解説をちょっと書いてみました。
Sub Test()
' ByValの時は123のようになるよな気がするのですが hoge fuga になってしまいます
Dim str1 As String
Dim str2 As String
Dim out As String
Dim ret As Long
str1 = "hoge"
str2 = " fuga"
out = "123"
' 変数outは渡しているが、Functionで処理されていない。
'従って、変数outの内容はByVal_strの戻り値には全く関係ない。
Debug.Print "Test1:" & ByVal_str(str1, str2, out)
'上記と同じ
Debug.Print "Test2:" & ByRef_str(str1, str2, out)
'結果としてはByVal_st、ByRef_strは同じ処理をしている。
'ByVal、ByRefは関係ない。
'参照渡しの戻り値を使い且つ、関数の戻り値を使う場合はこんな場合
'もあります。(たまにですが)
ret = sample(str1, str2, out)
Debug.Print "sample : sample(str1, str2, out)"
Debug.Print "結合された文字列 :" & out
Debug.Print "結合された文字列の文字数 :" & ret & "個"
End Sub
'sample:渡された文字列を結合した文字列を返す
'引数 pret:pa、pb を結合したデータを格納する
Function sample(ByVal pa As String, ByVal pb As String, ByRef pret As String) As Long
On Error GoTo trap
pret = pa & pb
sample = Len(pret)
Exit Function
trap:
sample = 0
End Function
Function ByVal_str(ByVal idx1 As String, ByVal idx2 As String, ByVal modori As String) As String
ByVal_str = idx1 & idx2
Debug.Print "ByVal_str:" & ByVal_str
End Function
Function ByRef_str(ByVal idx1 As String, ByVal idx2 As String, ByRef modori As String) As String
ByRef_str = idx1 & idx2
Debug.Print "ByRef_str:" & ByRef_str
End Function
|
|