VBScript(WSH)で外部Functionを呼出して戻り値を受ける方法と注意点

VBScript(WSH)で外部Functionを呼出して戻り値を受ける方法と注意点

VBScript(WSH)で外部Functionを呼出して戻り値を受ける方法と注意点

以前に記事『 VBScriptのsubとFunctionの動作の違い 』で記載した通りVBScriptではFunctionを使う事で戻り値を受ける関数を外に出すことができます。

で、いくつもの場所で利用する『共通関数』が出来たら【外部Function】にして色んなファイルから呼び出したいと思います。
その方がメンテナンス性は向上するしますし、流用できるものも含めて1ファイルごとに記載するなんて面倒は嫌なものです。

外部Function呼出しの実験

フォルダ構成

よくありそうな下のフォルダ構成で実験します。

VBScript
├── 実行ファイル.vbs
├── 共通Function.vbs ※1
├── 楽天市場/
│          ├── 楽天処理1.vbs
│          ├── 楽天処理2.vbs
│          ├── 楽天処理3.vbs
│          └── 楽天共通Function.vbs ※2
├── Amazon/
│          ├── Amazon1.vbs
│          ├── Amazon.vbs
│          ├── Amazon3.vbs
│          └── Amazon共通Function.vbs ※2

※1 モールをまたいで共有できる関数の置き場所※2 モール内だけで通用する関数の置き場所

実行ファイル.vbsの中身

処理をモールフォルダの処理Scriptに丸投げしています。

処理Script(楽天処理1.vbs)の中身

こちらも実際の処理を Function oldDateCalc に丸投げしてます。そしてこの Function oldDateCalc は外部の 共通処理.vbs に存在するという構成です。

共通Function.vbsの中身

3か月前のデータが取れる場合、それを指示する事で3か月前の日付を返すというScriptが入っています。

楽天処理1.vbsを単体で実行すると動くが実行ファイル.vbsから呼び出すとエラーになる

楽天処理1.vbsにはそこから見た共通Function.vbsの位置をIncludeで指示しています。
で、実行ファイル.vbsから楽天処理1.vbsを呼び出してもこの構図は変わらないだろうと思っていたのですが「ファイルが見つかりません」と怒られてしまいます。

ちなみに、楽天処理1.vbsを単体で実行すると動きます。
そして、実行ファイル.vbsから動かすときには実行ファイルから見た共通Function.vbsの位置を楽天処理1.vbsに記載すると動きます。
つまりこんな感じ

なるほど。

それなら、親ファイル(実行ファイル.vbs)に全部書いたら動くんじゃね?

これ、残念ながら動きません。楽天処理1.vbsで「oldDateCalc が未設定」と怒られます。

親のinclude情報を引き継ぐわけではないようです。

まとめ

共通Functionの配置場所指示にはどこから読み込まれたものかを考えて記載する必要があります。

フォルダを分けないで1つのフォルダ内で分割した方が無難かな?

でもねぇ、所在が分かりやすいのはメンテしやすさにつながるからなぁ…。