初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

初心者のためのExcel(エクセル)マクロVBA入門-成績表マクロの作成:値渡しと参照渡し

これについては非常にわかりにくいと思うので、この回でこのテーマだけを取り上げます。

値渡しってなぁに?

今までやったメソッドの引数にはこう書いてありました。


InputCheck(ByVal shussekiNumber As String) As String

このカッコの中にある「ByVal」というのが「値渡し」であるという意味になります。値渡しとは、その名の通り引数に値(生のデータそのものを渡すという意味です。今回の例で言えば出席番号が6なら「6」という文字列そのものが渡されます。これはなんとなく理解できると思います。


f:id:drumer2sh:20131017110403p:plain


問題は参照渡しです。

参照渡しってなぁに?

参照渡しはカッコの中が「ByRef」となります。参照渡しとは「変数」そのものを渡すという意味です。一言で言うと本当にこれだけなんですが、もう少し説明すると、参照渡しで変数を渡すと引数には変数そのものが入ります。したがって渡された関数の中でこの引数に何らかの値を代入すると、渡した元の変数の中身も書き換わります。値渡しでは値のみが渡されるので引数の値をいくら書き換えても元の変数は変わりませんが、参照渡しでは書き換わってしまうんです。


f:id:drumer2sh:20131017110404p:plain

っで?参照渡しだと何が便利なのか?


関数(メソッド)の戻り値は基本的に1つです。ですがそれ以外にも値を返したい。例えば、BooleanのTrue、Flase以外にもその結果そのものであるデータも渡したい!とか、Flaseと一緒にエラーメッセージも返したい!という時に参照渡しは非常に便利です。引数に結果を入れる用の引数を参照渡しで用意してあげて、呼び出し元で結果を入れる変数を渡してあげればいいわけです。後は関数の中でその変数にメッセージを入れて、戻り値はFalseとかTrueとかにすれば良い。
他にも、パフォーマンス的にも優れているところはあります。
また配列処理なんかも、参照渡しにした方が良い場合もあります。

いずれにせよ、呼び出す側と呼び出された側で同じ変数を「共有」できるイメージです。

普段は値渡しにしよう


このように何か特別なことがない限りは、値渡しをするようにしましょう。そうしないと呼び出し元の変数が意図せず書き換わってしまうことになるからです。意図的に書き換えるのと意図せず書き換わってしまうは全然違いますので、普段は値渡しをするようにしてください。

ByValって書かないと参照渡しになる


これ結構重要です。ByValがないと自動的に参照渡しになってしまうので特に注意してください。結構引数にByValを付け忘れる人が多いので、それがもとで参照渡しになり、意図せず変数が書き換わり・・・なんか結果がおかしいんだけど・・・なんてことになってしまうことが「結構しょっちゅう」あります。(笑)

ByValは引数には必ず付ける

ということを忘れないようにしてください。

配列を引数にしたい場合は参照渡し


今回のように配列を引数にしたい場合は基本的には参照渡しになります。値渡しにしたい場合は、引数の型をVariant型指定してあげると値渡しにできます。
ケースバイケースで使い分けることができるようになると良いと思います。


今日はここまで!


かしこ