『たった1秒で仕事が片づくExcel自動化の教科書』(技術評論社)にて、
紙面の都合で書けなかった詳細をこちらで解説します。
■プロシージャのタイトルについている()の意味
Sub sample() End Sub |
プロシージャのタイトルの後ろにはこのように必ず確固()が追加されますが、
これは何のためにあるものかを理解するのは、まず「プロシージャがプロシージャを呼び出す」
という方法を理解する必要があります。
本書の第6章、223Pでも解説していますが、
一つのプロシージャがかなり長くなってしまう作業を自動化しようとする場合、
開発を簡単にするにはちょっとしたコツがあります。
一つのプロシージャにすべて詰め込もうとするより、
いくつかに分けてプロシージャを作りあとでそれをまとめたほうが開発はやりやすくなるのです。
その例が本書223Pで紹介しているような、Callステートメントで、
あるプロシージャが別のプロシージャを呼び出して実行するという方法です。
このように別のプロシージャを呼び出して実行する場合、
例えばAというプロシージャが別に作ったBというプロシージャを呼び出して実行する場合、
Aプロシージャで使った変数をそのままBプロシージャでも使えるように、変数を渡してあげることができます。
この変数の受け渡しのために、実はプロシージャ名のあとの括弧()はあるのです。
例えば、次の例を見てください。
Sub A() Dim i As Long i = 100 Call B(i) End Sub Sub B(i As Long) MsgBox i End Sub |
「A」というプロシージャにて、整数型の変数iをDimステートメントにて宣言し変数iに100を入れ、
Callステートメントで「B」というプロシージャを呼び出しています。
このとき、呼び出すプロシージャ名「B」のあとに変数iを括弧で囲んで書くと、
呼び出される「B」プロシージャ内でこの変数をそのまま使えるということです。
Bプロシージャ内ではこの変数iをDimで宣言する必要はありません。
プロシージャ名のあとにある括弧はこのように、呼び出されるプロシージャが、
親となるプロシージャから変数を受け取るためのものなのです。
・「参照渡し」と「値渡し」
親プロシージャがから変数を受け取るプロシージャの括弧内に、
ByRefとかByValと書かれているものに出会うことがあるかも知れません。
Sub A() Dim i As Long i = 100 Call B(i) End Sub Sub B(ByRef i As Long) MsgBox i End Sub |
このようにByRefと書かれている場合が「参照渡し」で、
「B」プロシージャの中でこの変数iの値は変更することができます。
一方、
Sub A() Dim i As Long i = 100 Call B(i) End Sub Sub B(ByVal i As Long) MsgBox i |
このようにByValと書かれている場合が「値渡し」といい、
「B」プロシージャの中でこの変数のiの値は変更することができません。
ByRefもByValも書いてない場合は、参照渡しになります。必要に応じて使い分けることになります。
『たった1秒で仕事が片づく Excel自動化の教科書』執筆陣が自ら直接指導。
実務直結・一日集中・受講後無期限サポート付きのマクロVBAセミナー