メイン画像

VBScript - Dictionary(連想配列)を使う

VBScript - Dictionary(連想配列)を使う


キーとアイテムをペアで管理する配列を連想配列と言う。

ところが連想配列は VBScript の標準機能には含まれていない。

VBScript で連想配列を使うには Dictionary オブジェクトを使う。

Dictionary オブジェクトの使い方

Dictionary オブジェクトのインスタンスを生成する

CreateObject 関数を使って Dictionary オブジェクトのインスタンスを生成する。

Dim dict
Set dict = CreateObject("Scripting.Dictionary")

指定したキーが存在するか確かめる

Dictionary オブジェクトに指定したキーが存在するか確かめるには、Exists メソッドを使う。

存在すれば True を、存在しなければ False を返す。

If dict.Exists("VB") Then
  MsgBox "キー ""VB"" はすでに存在します。"
End If

キーとアイテムを追加する

キーとアイテムを追加するには Add メソッドを使う。

dict.Add "VBS", "VBScript"

すでに存在するキーを指定すると実行時エラーが起きる。
「エラー番号 457 : このキーは既にコレクション内の要素に関連付けられています。」

 

Item プロパティを使ってもよい。

Add メソッドと異なり、こちらはすでに存在するキーを指定してもエラーにならない。

この場合、キーに該当するアイテムの書き換えとなる。

dict.Item("VBS") = "VBScript"
dict.Item("VBS") = "Visual Basic Scripting Edition"
' → キー "VBS" のアイテムは "Visual Basic Scripting Edition" となる

指定したキーに該当する、キーとアイテムのペアを削除する

特定のキーで、キーとアイテムのペアを削除するには Remove メソッドを使う。

dict.Remove "VBS"

指定したキーが存在しない場合は、実行時エラー「番号 32811: 要素が見つかりません。」が発生する。

すべてのキーとアイテムのペアを削除する

すべてのキーとアイテムのペアを削除するには RemoveAll メソッドを使う。

dict.RemoveAll

すべてのキーの配列を取得する

すべてのキーの配列を取得するには Keys メソッドを使う。

Dim keys
keys = dict.Keys

Dim i
For i = LBound(keys) To UBound(keys)
  WScript.Echo keys(i)
Next

すべてのアイテムの配列を取得する

すべてのアイテムの配列を取得するには Items メソッドを使う。

Dim items
items = dict.Items

Dim i
For i = LBound(items) To UBound(items)
  WScript.Echo items(i)
Next

Dictionary オブジェクト内のキーとアイテムのペアの数を取得する

Dictionary オブジェクト内のキーとアイテムのペアの数を取得するには Count プロパティを使う。

MsgBox dict.Count

キーを変更する

キーを変更するには Key プロパティを使う。

dict.Key("VBS") = "VBSCRIPT"

サンプルスクリプト

Option Explicit

'Dictionaryオブジェクトを生成
Dim dict
Set dict = CreateObject("Scripting.Dictionary")

'キー/アイテムのペアを追加
dict.Add "VB", "Visual Basic"
dict.Add "VBA", "Visual Basic for Applications"
dict.Add "VBS", "VBScript"

'Dictionaryオブジェクト内に存在するキー/アイテムのペアの数を表示
MsgBox "ペアの数: " & dict.Count

'指定したキーがDictionaryオブジェクト内に存在するかどうか
If dict.Exists("VB") Then
  MsgBox "キー ""VB"" はすでに存在します。"
End If

'すべてのアイテムの配列を取得
Dim items
items = dict.Items

Dim i
For i = LBound(items) To UBound(items)
  MsgBox "Item(" & i & "): " & items(i)
Next

'すべてのキーの配列を取得
Dim keys
keys = dict.Keys

Dim k
For k = LBound(keys) To UBound(keys)
  MsgBox "Key(" & k & "): " & keys(k)
Next

'指定したキーとアイテムのペアを消す
dict.Remove "VBA"

'存在しないキーを指定した場合は実行時エラーが起きる
'  →エラー番号 32811: 要素が見つかりません。
On Error Resume Next
dict.Remove "VBA"
If Err.Number <> 0 Then
  MsgBox Err.Number & ": " & Err.Description
End If
On Error GoTo 0

'すべてのキーとアイテムのペアを消す
dict.RemoveAll

'アイテムを設定
dict.Item("QB") = "QuickBASIC"
MsgBox dict.Item("QB")

'キーを変更
dict.Key("QB") = "BASIC"

If Not dict.Exists("QB") And dict.Exists("BASIC") Then
  MsgBox "キーを書き換え ""QB"" → ""BASIC"""
End If

'アイテムを変更
dict.Item("BASIC") = "N88-BASIC"
MsgBox dict.Item("BASIC")

配列の代わりにもなる

VBScript の配列は使いにくいので Dictionary オブジェクトを配列のように使っても良い。

キーを Dictionary オブジェクトの Count プロパティにして、アイテムには任意のデータを指定する。
それだけで OK 。

動的配列のように、いちいち ReDim Preserve で拡張する手間がない分、こちらの方が楽。

'キー/アイテムのペアを追加
dict.Add dict.Count, "Visual Basic"
dict.Add dict.Count, "Visual Basic for Applications"
dict.Add dict.Count, "VBScript"

'アイテムを表示
Dim i
For i = 0 To dict.Count - 1
  WScript.Echo dict(i)
Next

アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


酒とアクアリウムが最近の楽しみ。

おすすめの記事