VBScriptのsubとFunctionの動作の違い
VBScriptの sub と Function の動作の違い
ぶっちゃけ全てのプロシージャをFunctionで書いても問題ないのであまり気にしてなかったけど...。
最大の違いは【戻り値】が扱えるか
sub:戻り値を扱えない
Function:プロシージャ名 = 戻り値 で値を渡せる
デカいね、この違い。
だからFunctionでばかり書いてしまうわけだけど。
subプロシージャの使いどころ
IEブラウジングだったら処理完了まで一貫して行うパーツとか、親元に答えを返さなくていい時が使いどころ。
スクレイピングだったら、処理全体の纏りをSubで書いてその中の細かい処理をFunctionで値受け渡すとか。
'呼出し hoge 引数1,引数2,引数3 'これでもOK Call hoge 引数1,引数2,引数3 Sub hoge(引数1,引数2,引数3) 'プロシージャの動作 End Sub
Callを使った方が判り易さはあるけど、省略して書きたいものだから書かない事が多いですね。
Functionプロシージャの使いどころ
私の場合はsubはほぼ使わず全面Functionで書いてます。
戻り値があるものはFunctionで書く事必須ですが、それ以外は整理整頓しやすい自分流ルールでいいと思います。
「見返してわかりやすい」がプログラムには必要な条件ですから。
▼Subと同じ(戻り値の無い)使い方
'呼出し hoge 引数1,引数2,引数3 'これでもOK Call hoge 引数1,引数2,引数3 Function hoge(引数1,引数2,引数3) 'プロシージャの動作 End Function
▼戻り値のあるFunctionだけの使い方
'呼出し Dim backData backData = hoge(引数1,引数2,引数3) MsgBox(backData) Function hoge(引数1,引数2,引数3) 'プロシージャの動作 hoge = "fugafuga" End Function
※こう書くとメッセージボックスに fugafuga が表示される。
Functionで複数の戻り値を渡す
ここら辺はPHPとかと同じで、基本的に配列に入れて返します。
'呼出し
Dim backData
backData = hoge(引数1,引数2,引数3)
MsgBox(backData(0))
MsgBox(backData(1))
Function hoge(引数1,引数2,引数3)
'プロシージャの動作
hoge = array("fuga","hega")
End Function
※こう書くと最初のメッセージボックスに fuga、2つ目に hega が表示される。
その他にも、カンマ区切りの文字列にして受け取り側で split(backData,",") という方法もあるけど...CSVに書き出さない限り有用な方法ではないと思います。
戻り値は1つの値として返さないといけない
他のプログラム言語と同じで理解しやすく助かります。
まとめ
書きながら強く思いましたが、やっぱり取り合えずFunctionで書いとけばOKじゃね?


