プロシージャ

Sub 名前(引数)
End Sub
(Exit Sub でSub内から抜ける)
呼び出す時は
Call 名前(引数)
他のモジュールから隠蔽する場合には
Private Sub 名前(引数) のように書く。
引数は基本は参照渡し(ByRef)となっているので不都合なら値渡し(ByVal)とする。

Function 名前(引数) As 型名
名前=戻り値
End Function
(Exit FunctionでFunction内から抜ける
呼び出す時は
変数 = 名前(引数)
いわゆる関数とかサブルーチン。
VBではプロシージャという単位らしい。
値を返すものがfunctionで返さないものがsubという。

VBAでは例えばエクセルでボタンを作ったり、ショートカットキーで“マクロ”を呼ぶわけだ。
その"マクロ"の実態はこういう感じでSubでくくったプログラムとなる。

メイン関数のような概念はない。
マクロボタンを押した時に実行したり、シート上にリンクを張ったりするプロシージャは引数を持たないものすべてが使える。

Private宣言をすることで同じモジュール内以外からは呼べなくなるので、これでモジュールとしての隠蔽性を高めることができる。
また、マクロボタンを押した時の一覧から除外することができる。。

プロシージャの記述は以下のようになる。
Sub proc_a()
Dim i As Integer
i = 3
Call proc_b(i)
proc_c(i)
End sub

Sub proc_b(i As Integer)
maxi = i * 2
For i = 1 To maxi
・・・・
Next
End sub

Sub proc_c(i As Integer)
・・・・・
End sub
さてこのプログラムには潜在的なバグがある。
VBではなんとデフォルトで参照渡しなのである。
proc_b(i)から帰ってきたところでiの値は2倍+1されてしまうのだ。

値渡しをしたい時はByValと明示する。
参照渡しを明示的に書くときはByRef。
Sub proc_a()
Dim i As Integer
i = 3
Call proc_b(i)
End sub

Sub proc_b(ByVal i As Integer)
maxi = i * 2
For i = 1 To maxi
・・・・
Next
End sub
後は関数。返値は関数名に代入する。
Sub proc_a()
Dim i As Integer
i = 0
i = func_b(i)
End sub

Function func_b(ByVal i As Integer) As Integer
func_b = i * 10
End function
Callは書いても書かなくても良いといわれることが多い。
しかし、オブジェクトを引数にする時にはなぜかCallを書かなければならないので、Callは日頃から書くようにしておいた方が良いだろう。
書かないのが常態化すると、オブジェクトを引数とするプロシージャを記述した時に意味不明なエラー(Callを書かなかったのが原因とは思いつけないエラー)がでて戸惑い、悩むことになるだろう。
プログラミングスタイルとして「引数の型によってCallを書くか書かないかを決める」というのはおかしな話だ。
それなら「書くべき」とした方が覚えることが少なくて済む。
[後書き]
それにしても基本が参照渡しということを知ったときは驚いた。
普通は値渡しのほうが基本で、参照渡しは仕方ないときに使うものだ。
例えば返値を複数とりたいという場合。
また、オブジェクトや配列が大きく、値渡しにするとそのコピーを作るために負荷が高すぎる場合には参照だけ渡す。
モジュール毎の隠蔽性などより変数の引き渡しなどを簡単にということなのだろう。

宣言等はなんかすごく汚らしい感じがするのだがBASICらしいといえばらしい。
まあ、言語の美しさよりも実用性というか現実主義というか。
comments (2)

コメント

https://beckynunemaker.wordpress.com | 2017/07/31 04:17 PM
Do you have a spam problem on this blog; I also am a blogger, and I was
curious about your situation; many of us have developed some nice practices and we are looking to trade techniques
with others, be sure to shoot me an e-mail if interested.
How does Achilles tendonitis occur? | 2017/07/29 05:58 AM
Hi, the whole thing is going nicely here and ofcourse every one
is sharing data, that's genuinely excellent, keep up writing.

Comment Form