Functionプロシージャーを使おう大きなプログラムをコーディングするときは、関数を多用する必要が出てきます。
ここでは、値の受け渡しが出来るようFunctionプロシージャーを勉強しましょう。
最初にByVal、ByRefを勉強してそれからFunctionプロシージャーに入ります。
■ この章で学ぶこと |
次のコードを実行してみましょう。関数が2つあるので注意してください。
Sub Main() Dim a As Integer a = 1 Dim i As Integer For i = 0 To 5 Call Message1(a) MsgBox a Next End Sub -------------------------------------------------------------------- Private Sub Message1(ByVal b As Integer) b = b + 1 MsgBox b End Sub |
Call Message1
上のコードサンプルは2つの関数から構成されていることがお分かりになると思います。
@Main関数、A関数1という名前ですが、@Main関数を実行中に関数1を実行させるとき
Callを使用します。条件によってはCallを使用しなくてもよい場合がありますが、
すべてCallをつけておけば安心なのでとりあえず付けておきましょう。
Call Message1(a)
Callに関しては上で説明しましたが、その後ろに怪しげなaが付いています。これは
引数と呼ばれるもので関数Message1にaという変数を渡すという意味です。
Message1(Byval b As Integer)
いつもはMessage1()で終わるところですが、なにやら奇妙な変数が定義されています。
勘のいいかたはお気づきかもしれませんが、先ほどMessage1関数で渡そうとしていたaという
変数を受け取りますよ、その受け取った変数をここではbとして使いますよ、という意味です。
Message1関数で変数3を渡してきたらbに3を代入してメッセージボックスで4を表示する関数
ということになります。
下のコードを実行してみてください。先ほどとは少し結果が違ってくると思います。
Sub Main() Dim a As Integer a = 1 Dim i As Integer For i = 0 To 5 Call Message2(a) MsgBox a Next End Sub -------------------------------------------------------------------- Private Sub Message2(ByRef b As Integer) b = b + 1 MsgBox b End Sub |
先ほどとの違いはMessage2(ByRef b As Integer)の部分がByValがByRefになっただけです。
意外と参考書等には記載されていませんがとても重要です(とわたしも会社の方から教えてもらいました)。
違いは、ByValが値渡しにたいしてByRefが参照渡しという違いがあります、と大抵の参考書には書いてあります。
先ほどの結果はMessage関数がaの値に影響を与えませんでしたが、今回はaの値ごと変更していることが
わかります。
うまく説明できませんが、サンプル関数の結果をよく考えて理解してください。
下のコードを実行してみてください。
Sub Main() Dim i As Integer For i = 1 To 5 MsgBox Message(i) Next End Sub -------------------------------------------------------------------- Function Message(ByVal a As Integer) As String If a > 3 Then Message = "引数は3より大きいです" ElseIf a = 3 Then Message = "引数は3です" Else Message = "引数は3よりちいさいです" End If End Function |
Msgbox Message(i)
Msgboxはメッセージを表示させるものですが、メッセージ内容はMessage(i)
ということまではわかってもらえると思います。
Function Message(Byval a As Integer) As String
Message関数でInteger型の引数を入れることによって、処理をしてString型の
値を返します。ここでは、引数の値が3より大きい、小さい、同じかによって
Messageにコメントを代入して返します。
Message = "3よりおおきいです"
Message関数に値を代入しています。String型にしているのはこのためです。
これだけでは、説明不足かも知れませんが活用できるようになりましょう。