こんにちは、ふみです。みなさんは VBScript で配列を使うことがありますか?
VBScript を使っている方は VBA も使える人が多いと思いますが、VBA と同じ感覚で配列を使うと VBScript ではエラーになってしまうことがあると思います。
今回は VBScript の1次元配列のつくり方と VBA との記述のしかたの違いについて紹介します。
CONTENTS
簡単な配列をつくる
まずは良く使われる配列のつくり方を紹介します。VBScript のプログラムは次のとおりです。
サンプルコード
Option Explicit Dim strArray Redim strArray(2) strArray(0) = "りんご" strArray(1) = "みかん" strArray(2) = "バナナ" MsgBox "strArray(0) = " & strArray(0) & vbCrLf _ & "strArray(1) = " & strArray(1) & vbCrLf _ & "strArray(2) = " & strArray(2), , "配列データの表示"
上記のコードを Windows 10 のアクセサリから開いたメモ帳へコピー&ペースト後、文字コードを「ANSI」に設定し、適当なファイル名に拡張子「.vbs」をつけてデスクトップ等に保存すると、すぐに動作確認できます。
保存した vbsファイルをダブルクリックすると、配列データの内容がメッセージで表示されます。
解説
2行目は配列で使う変数を宣言しています。VBAで配列の変数を宣言するときは「strArray()」のように変数名の後ろに()をつけますが、VBScript では後ろに()をつけて配列として宣言した変数を使うとエラーになる関数が多いので注意しましょう。このサンプルコードでは変数名の後ろに()をつけても動作します。
4行目は ReDim で配列のサイズを設定しています。VBScript の配列は添字(インデックス)が0から始まるので、ReDim の値を2に設定すると配列に入るデータの数は0~2の3つになります。
VBAでは「Redim strArray(1 To 3)」のように記述して配列の添字を1から始めるようにすることができますが、VBScript ではできません。
5~7行目は配列の要素毎に文字データを代入しています。
9行目以降は配列のデータを0から2まで順番に取り出してメッセージを表示します。
Array関数で配列をつくる
Array関数を使った配列のつくり方を紹介します。VBScript のプログラムは次のとおりです。
サンプルコード
Option Explicit Dim strArray, intN, strText strArray = Array("みかん", "りんご", "バナナ") For intN = 0 to Ubound(strArray) strText = strText & "strArray(" & intN & ") = " & strArray(intN) If intN < Ubound(strArray) Then strText = strText & vbCrLf Next MsgBox strText, , "配列データの表示"
上記のコードを Windows 10 のアクセサリから開いたメモ帳へコピー&ペースト後、文字コードを「ANSI」に設定し、適当なファイル名に拡張子「.vbs」をつけてデスクトップ等に保存すると、すぐに動作確認できます。
保存した vbsファイルをダブルクリックすると、配列データの内容がメッセージで表示されます。
解説
このサンプルコードは「簡単な配列を作る」と同じメッセージをしますが、メッセージの作成にループ処理を使っています。
4行目は Array関数の括弧内の引数が「,(カンマ)」毎に0から始まる配列データとして代入されます。
VBScript は配列として宣言された変数にArray関数の戻り値(配列を含む Variant)を代入することができないので、2行目の変数名の後ろに()をつけるとエラーが発生します。
VBA は配列として宣言された変数にArray関数の戻り値を代入することができるので、変数名の後ろに()をつけてもエラーが発生しません。
6~9行目はループ処理で配列データからメッセージ用の変数に配列データを転記しています。これにより、4行目の配列に新たなデータを追加してもループの回数が配列の添字の最大値を返すUBound関数によって調整される為、追加分がメッセージに反映されるようになっています。
VBScript は UBound関数の括弧内の変数名の後ろに()がついているとエラーが発生します。VBScript で UBound関数を使う時は配列として宣言された変数でも後ろの()を外しましょう。添字の最小値を返す LBound関数も同様です。
VBA は UBound関数(LBound関数)の括弧内の変数名の後ろに()をつけてもエラーが発生しません。
カンマで区切ったテキストから配列をつくる
カンマで区切ったテキストから配列をつくるには Split関数を使います。VBScript のプログラムは次のとおりです。
サンプルコード
Option Explicit Dim strArray, intN, strText strArray = Split("りんご,みかん,バナナ", ",") For intN = 0 to Ubound(strArray) strText = strText & "strArray(" & intN & ") = " & strArray(intN) If intN < Ubound(strArray) Then strText = strText & vbCrLf Next MsgBox strText, , "配列データの表示"
上記のコードを Windows 10 のアクセサリから開いたメモ帳へコピー&ペースト後、文字コードを「ANSI」に設定し、適当なファイル名に拡張子「.vbs」をつけてデスクトップ等に保存すると、すぐに動作確認できます。
保存した vbsファイルをダブルクリックすると、配列データの内容がメッセージで表示されます。
解説
このサンプルコードは「Array関数で配列をつくる」と同じ動作をします。
4行目は Split関数で、括弧内の最初の引数の文字列が2番目の引数「,(カンマ)」の文字毎に区切られて0から始まる配列データとして代入されます。
VBScript は 配列として宣言された変数に Split関数のデータを代入することができないので、2行目の変数名の後ろに()をつけるとエラーが発生します。
VBA は配列として宣言された変数に Split関数のデータを代入することができるので、変数名の後ろに()をつけてもエラーが発生しません。
まとめ
- VBScript は「Redim 変数名(1 To 3)」のように配列の添字の最小値を指定することができない
- VBScript は名前の後ろに()をつけて宣言された変数に Array関数の戻り値を代入することができない
- VBScript は名前の後ろに()をつけて宣言された変数に Split関数の戻り値を代入することができない
- VBScript は UBound関数(LBound関数)の括弧内の変数名の後ろに()をつけるとエラーが発生する
ありがとうございました。
コメント