こんにちは、ふみです。みなさんは VBScript で配列の次元数を取得しようと思ったことはありますか?
例えば二次元配列を引数にするファンクション(関数)を利用する場合、引数が二次元配列になっていないと動作中にエラーが発生することがあります。
この場合、あらかじめ配列の次元数が分かれば、条件分岐と組み合わせることでエラーの発生を未然に防ぐことができます。
今回は VBScript で配列の次元数を取得する方法について紹介します。
UBound関数を使って配列の次元数を取得する
配列の添字の最大値を取得するUBound関数は、配列に存在しない次元の番号を指定するとエラーが発生します。したがって、この仕組みを利用すれば配列が指定の次元数になっているかを確認することができます。
配列の次元数を取得するプログラムは次のとおりです。
サンプルコード
Option Explicit Dim intN, lngTemp, varArray3D() ReDim varArray3D(1, 1, 1) On Error Resume Next Do intN = intN + 1 lngTemp = UBound(varArray3D, intN) Loop Until Err.Number <> 0 intN = intN - 1 On Error GoTo 0 MsgBox "配列の次元数は " & intN & " です"
上記のコードを Windows 10 のアクセサリから開いたメモ帳へコピー&ペースト後、文字コードを「ANSI」に設定し、適当なファイル名に拡張子「.vbs」をつけてデスクトップ等に保存すると、すぐに動作確認できます。
保存した vbsファイルをダブルクリックすると、配列varArray3D の次元数「3」がメッセージで表示されます。
解説
3行目は変数varArray3D を3次元配列の要素数に設定しています。
5行目の On Error Resume Next はエラーが発生してもプログラムが停止しないようにしています。
8行目の UBound関数は配列の次元数を超えた次元の番号を指定するとエラーが発生します。
9行目はループ処理が終了する条件をエラーが発生したときに設定しています。
10行目は UBound関数でエラーが発生しなかった最後の次元の番号(=配列の次元数)に戻しています。
11行目の On Error GoTo 0 はエラーを消去し、エラー発生時のプログラム停止を解除しています。
このサンプルコードは Excel等のVBAでも動作します。
配列の次元数を取得するファンクション(関数)
配列の次元数を取得するプログラムは毎回手入力するのは面倒なので、ファンクションにまとめてコピー&ペーストですぐ使えるようにしておくと便利です。
配列の次元数を取得する命令をファンクションにまとめたプログラムは次のとおりです。
サンプルコード
Option Explicit Dim varArray3D(), intDim ReDim varArray3D(1, 1, 1) intDim = GetDimensions(varArray3D) MsgBox "配列の次元数は " & intDim & " です" WScript.Quit '***************************************************************************** Function GetDimensions(ByRef varArray) '戻り値は配列の次元数 Dim intN, lngTemp On Error Resume Next Do intN = intN + 1 lngTemp = UBound(varArray, intN) Loop Until Err.Number <> 0 intN = intN - 1 On Error GoTo 0 GetDimensions = intN End Function
上記のコードを Windows 10 のアクセサリから開いたメモ帳へコピー&ペースト後、文字コードを「ANSI」に設定し、適当なファイル名に拡張子「.vbs」をつけてデスクトップ等に保存すると、すぐに動作確認できます。
保存した vbsファイルをダブルクリックすると、配列varArray3D の次元数「3」がメッセージで表示されます。
解説
5行目は11行目のアスタリスク(*)以下に記載しているファンクションを使って配列varArray3D の次元数を取得し、変数intDim に代入しています。
動作内容は「UBound関数を使って配列の次元数を取得する」で紹介したサンプルコードのプログラムとまったく同じです。
このファンクションはExcel等の VBAでも動作します。VBScript のコードを VBAで転用する場合、戻り値、引数、変数の型を「As ~」と記載したほうが良いのですが、引数varArray() の変数の型を指定すると変数の型が合わないときにエラーが発生します。
VBAでどんな変数の型の配列でも動作するファンクションとして利用するには、引数varArray() の変数の型を指定しないようにすると良いです。
ちなみに、12~13行目をVBA仕様で記述すると
Function GetDimensions(ByRef varArray()) As Integer '戻り値は配列の次元数 Dim intN As Integer, lngTemp As Long
となります。
まとめ
- UBound関数は、配列に存在しない次元の番号を指定するとエラーが発生する
- 次元の取得はファンクションにまとめて、コピー&ペーストで使えるようにしておくと便利
- 次元数を取得するファンクションをVBAで利用するときは、引数の配列の変数の型を指定しないようにすると、どんな変数の型の配列でも動作するようになる
ありがとうございました。
コメント