【VBScript】1次元配列を使うときの VBA との違い

Windows PC

こんにちは、ふみです。みなさんは VBScript で配列を使うことがありますか?

VBScript を使っている方は VBA も使える人が多いと思いますが、VBA と同じ感覚で配列を使うと VBScript ではエラーになってしまうことがあると思います。

今回は VBScript の1次元配列のつくり方と VBA との記述のしかたの違いについて紹介します。

簡単な配列をつくる

まずは良く使われる配列のつくり方を紹介します。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関数)の括弧内の変数名の後ろに()をつけるとエラーが発生する

ありがとうございました。

コメント

タイトルとURLをコピーしました