文系seの備忘録

Excelの改行でひたすらスペースを打っていた機械音痴の文系seが日々の備忘録を綴る。

【Excelv VBA】 VBAにおける値渡しと参照渡し


<値渡し、参照渡しって?>

・関数の渡しかたは大きく分けて「値渡し」「参照渡し」の2種類ある。 


※ 言語によっては(JavaC#Python等)上記以外に「参照の値渡し」と分類されることもある。
   ポインタ渡しとも言ったりする。オブジェクトを渡す際に使われることが多い




・「値渡し (call by value)」


変数の値をコピーして関数に渡す方法。


例えば、
1.呼び出し元で文字列を宣言
2. 1を引数に、文字列を変更する関数を呼び出し
3. 2の結果をメッセージボックスで表示

というソースを作って違いを確認してみます。





以下のような文字列を宣言して・・・

str = "もとの文字です(*`▽´*)"

値渡しの関数に渡します。

Call CallByVal(str)


f:id:ron623:20180802163050p:plain

↑のように、変数はコピーして関数に渡されます。


f:id:ron623:20180802163321p:plain
そして、渡された関数にて値がかきかえられます。・・・関数内では、ですよ!


さて、関数内で文字列が色々と書き換えられて、呼び出し元に戻ってくるのは・・・
コピーした変数です。もとの値は何も変わっていません。

f:id:ron623:20180802164128p:plain


(全文)





・「参照渡し (call by reference)」


変数の参照情報を渡す方法。
先ほどの値渡しとは異なり、変数の在りかを渡します(変数を共有するといった感じ)ので、変数の中身を書き換えれば呼び出し元も変更されます。




先ほどと同じく、文字列を変更する関数を呼び出します。

f:id:ron623:20180802170927p:plain

この際、文字列がメモリのどこに格納されているかが情報として渡されます。





上記の図では、文字列は1001番地に格納されていることが分かります。


そして、変数そのものが書き換わりますので
f:id:ron623:20180802171518p:plain
✳︎すみません、、関数名がvalのままになってしまっています。refに読み替えて見てみてください


出力されるメッセージは変更された文字列となります。
f:id:ron623:20180802172129p:plain


(全文)







おまけ1
値渡しでもfunction関数を使用して戻り値を受け取れば変更値を受け取れる


おまけ2
javaの参照渡し(だいーーーぶ昔に書いた記事)
samooooon.hatenablog.com
javaのstring型は参照渡しだけど、呼び出し元で値を変えられない(immutable)