こんにちは、ふみです。みなさんは VBScript のプロシージャとファンクション(関数)を使っていますか?
プロシージャとファンクションは同一プログラムで同じ命令を繰り返したり、複数のプログラムで同じ命令を使いまわすときに使うと便利です。
今回は VBScript のプロシージャとファンクションの使い方について紹介します。
CONTENTS
プロシージャとファンクションの違い
プロシージャとファンクションは共通した数式を括弧でまとめる因数分解のようなものです。同じような命令を集約してコードの記述をすっきりさせることができます。
プロシージャとファンクションはほとんど同じように機能しますが、戻り値(返すデータ)の有無だけが違います。
命令を集約したもので戻り値を返さないのがプロシージャです。
VBScript や VBA では「Call プロシージャ名(引数)」の形で記述して呼び出して使います。同じような命令を繰り返すときにプロシージャにまとめておくとプログラミングの効率が良くなります。
命令を集約したもので戻り値を返すのがファンクションです。
VBScript では「変数 = ファンクション名(引数)」の形で記述して、変数に戻り値を代入する形で使うことが多いです。
また、VBScript や VBA には Array関数や Split関数等の組み込み関数が予め多数用意されているので、使えそうなものがあれば積極的に活用しましょう。
引数と戻り値
引数(ひきすう)はプロシージャやファンクション(関数)の括弧内の変数ことです。プロシージャやファンクションはこの変数を利用して動作します。
戻り値はファンクションが返す値です。「変数 = ファンクション名(引数)」で変数に代入したり、「MsgBox ファンクション名(引数)」のように変数を介さずに取り出したりすることができます。
1次元配列をメッセージ用の文字にするプロシージャ
プロシージャを使った VBScript のプログラムは次のとおりです。
サンプルコード
Option Explicit Dim strArray(), strMsg ReDim strArray(2) strArray(0) = "りんご" strArray(1) = "みかん" strArray(2) = "バナナ" Call ConfirmationTextForArray1D(strMsg, strArray) MsgBox strMsg, , "配列データの表示" WScript.Quit 'スクリプトの終了 '****************************************************************************** '処 理:1次元配列のデータをメッセージ表示用の文字列で返す ' '引 数:strText - メッセージ表示用の文字列 ' strArray1D - 1次元配列 ' '備 考:配列の要素数が表示させる個数の上限を超えた分は残りを省略 ' Sub ConfirmationTextForArray1D(ByRef strText, ByRef strArray1D) Dim intN, strTemp Const c_intI = 10 '表示させる個数の上限 For intN = LBound(strArray1D) To UBound(strArray1D) If intN > LBound(strArray1D) Then strTemp = strTemp & vbCrLf '改行の追加 End If If c_intI >= 1 And intN >= c_intI + LBound(strArray1D) Then '上限超過時 strTemp = strTemp & "他" & UBound(strArray1D) - (c_intI - 1) Exit For Else strTemp = strTemp & "配列(" & intN & ") = " & strArray1D(intN) End If Next strText = strTemp End Sub
上記のコードを Windows 10 のアクセサリから開いたメモ帳へコピー&ペースト後、文字コードを「ANSI」に設定し、適当なファイル名に拡張子「.vbs」をつけてデスクトップ等に保存すると、すぐに動作確認できます。
保存した vbsファイルをダブルクリックすると、配列データの内容がメッセージで表示されます。
解説
9行目は Call でプロシージャを呼び出しています。括弧内の変数、strMsg と strArray が引数です。
これらの引数は23行目の「Sub ~」で始まるプロシージャ名の括弧内に対応しています。「ByRef」が前についている引数はプロシージャ実行後に変更された値を戻します。
「ByVal」が前についている引数はプロシージャ実行後に変更されても引数の値を変更しません。
指定しない引数は全て ByRef になりますが、プログラムの構造を分かり易くするため、ByRef、ByVal の記述は推奨です。
VBA では配列の変数に ByVal を指定するとエラーになりますが、VBScript ではエラーになりません。しかし、後で VBA に移植する場合等の互換性を考慮すると、配列の変数は ByRef にしておいたほうが無難です。
また、引数は変数名の後ろに()をつけると、VBScript ではエラーになります。(VBA ではエラーになりません)
13行目はスクリプトの終了です。プロシージャは「Call」で呼び出さないと実行されないので、ここでスクリプトを終了しなくても実行されませんが、プログラムの終点をわかりやすくするために記載しています。
15行目のアスタリスクから下は23行目から始まるプロシージャについての説明を記述しています。
プロシージャやファンクションは冒頭にコメントアウトで処理の内容や戻り値、引数等の説明を書いておくと第3者が見てもわかりやすくなります。
プロシージャは23行目の「Sub ~」で始まり、最終行の「End Sub」で終わります。
プロシージャを途中で終了させる場合は「Exit Sub」を記述します。プロシージャが終了すると、命令はプロシージャを呼び出した直後に移動します。
このプロシージャはExcel等の VBAでも動作しますが、VBAで動作させる場合、引数、変数、定数の型を「As ~」と記載したほうが良いです。VBA は引数の型が同じでないとエラーになります。
1次元配列をメッセージ用の文字にするファンクション
プロシージャを使った VBScript のプログラムは次のとおりです。
サンプルコード
Option Explicit Dim strArray(), strMsg ReDim strArray(2) strArray(0) = "りんご" strArray(1) = "みかん" strArray(2) = "バナナ" strMsg = ConfirmationTextForArray1D(strArray) MsgBox strMsg, , "配列データの表示" WScript.Quit '****************************************************************************** '処 理:1次元配列のデータをメッセージ表示用の文字列で返す ' '戻 り 値:メッセージ表示用の文字列 ' '引 数:strArray1D - 1次元配列 ' '備 考:配列の要素数が表示させる個数の上限を超えた分は残りを省略 ' Function ConfirmationTextForArray1D(ByRef strArray1D) Dim intN, strTemp Const c_intI = 10 '表示させる個数の上限 For intN = LBound(strArray1D) To UBound(strArray1D) If intN > LBound(strArray1D) Then strTemp = strTemp & vbCrLf '改行の追加 End If If c_intI >= 1 And intN >= c_intI + LBound(strArray1D) Then '上限超過時 strTemp = strTemp & "他" & UBound(strArray1D) - (c_intI - 1) Exit For Else strTemp = strTemp & "配列(" & intN & ") = " & strArray1D(intN) End If Next ConfirmationTextForArray1D = strTemp End Function
上記のコードを Windows 10 のアクセサリから開いたメモ帳へコピー&ペースト後、文字コードを「ANSI」に設定し、適当なファイル名に拡張子「.vbs」をつけてデスクトップ等に保存すると、すぐに動作確認できます。
保存した vbsファイルをダブルクリックすると、配列データの内容がメッセージで表示されます。
解説
動作内容はプロシージャの時とまったく同じです。
15行目のアスタリスクから下は24行目から始まるファンクションについての説明を記述しています。
ファンクションは24行目の「Function ~」で始まり、最終行の「End Function」で終わります。
途中で終了させるときは「Exit Function」を記述します。ファンクションが終了すると、命令はファンクションの記述の直後に移動します。
ファンクション内のコードの記述がプロシージャと違うところは、最後から3行目、変数strTemp を代入する対象が引数からファンクションに変わったところのみです。その為、ファンクションのほうは引数が一つ減っています。
このファンクションもExcel等の VBAでも動作しますが、VBAで動作させる場合、戻り値、引数、変数、定数の型を「As ~」と記載したほうが良いです。VBA は引数の型が同じでないとエラーになります。
ちなみに、24~27行をVBA仕様で記述すると
Function ConfirmationTextForArray1D(ByRef strArray1D() As String) As String Dim intN As Integer, strTemp As String Const c_intI As Integer = 10 '表示させる個数の上限
となります。
まとめ
- 命令を集約したもので戻り値を返さないのがプロシージャ
- 命令を集約したもので戻り値を返すのがファンクション(関数)
- 引数の ByRef、ByVal は記述推奨
- 引数は変数名の後ろに()をつけると、VBScript ではエラーになる
ありがとうございました。
コメント