たった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

End Sub

 

 このようにByValと書かれている場合が「値渡し」といい、「B」プロシージャの中でこの変数のiの値は変更することができません。

 

 ByRefもByValも書いてない場合は、参照渡しになります。必要に応じて使い分けることになります。