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
アカウントを作成 して、もっと沢山の記事を読みませんか?
この記事にコメントをしてみませんか?