Dictionary オブジェクト  
 
作成可能

はい

 
ライブラリ

Microsoft Scripting Runtime

 
説明

Dictionary オブジェクトは Collection オブジェクトに似ていますが、Perl 連想配列に大まかに基づいていることが異なります。Dictionary オブジェクトは、配列や Collection オブジェクトのように、データを含む項目またはメンバーと呼ばれる要素を保持します。また、オブジェクトや他の Dictionary オブジェクトなど、どのようなデータでも含むことができます。配列を処理するときのように項目の順序を使用するのではなく、データと共に格納されている固有のキー (または名前付き値) を使用して、これらの辞書項目の値にアクセスします。このため、固有の名前付き値に関連付けられているデータにアクセスする必要があるときに、Dictionary オブジェクトは最適です。

Dictionary オブジェクトに格納されている各項目にアクセスするには、For Each ...Next 構造を使用します。ただし、Dictionary オブジェクトは、その中に格納されているデータ値が含まれたバリエーションを返すのではなく、メンバーに関連付けられているキーが含まれたバリエーションを返します。次の例のように、このキーを Item メソッドに渡してメンバーを取り出します。

Dim vKey 
Dim sItem, sMsg 
Dim oDict 
    
Set oDict =  CreateObject("Scripting.Dictionary")
oDict.Add "One", "Engine"
oDict.Add "Two", "Wheel"
oDict.Add "Three", "Tire"
oDict.Add "Four", "Spanner"
        
For Each vKey In oDict
   sItem = oDict.Item(vKey)
   sMsg = sMsg & sItem & vbCrLf
Next
   
MsgBox sMsg
 
Dictionary オブジェクトのプロパティ

Dictionary オブジェクトには次の 4 つのプロパティが含まれます。

プロパティ

説明

CompareMode

Item プロパティのテキスト比較の順序を指定します。

Count

辞書内の合計項目数を示します。

Item

辞書内の特定のデータ項目を設定または取り出します。

Key

既存のキーの名前を変更します。

 
Dictionary オブジェクトのメソッド

Dictionary オブジェクトは、次の 5 つのメソッドをサポートします。

プロパティ

説明

Add

項目および関連付けられているキーを辞書に追加します。

Exists

特定のキーが辞書に存在するかどうかを調べます。

Keys

辞書のすべてのキーを返します。

Remove

辞書から項目を削除します。

Remove All

辞書からすべてのデータを削除します。

Dictionary.Add メソッド  
 
 
構文
dictionaryobject.Add key, item
dictionaryobject

使用 :必須

データタイプ :Dictionary オブジェクト

Dictionary オブジェクトへの参照。

key

使用 :必須

データタイプ :任意

Dictionary オブジェクト固有のキー値。

item

使用 :必須

データタイプ :任意

辞書に追加する項目。

 
説明

キーおよび関連付けられている項目を、指定された Dictionary オブジェクトに追加します。

 
一目でわかる規則
  • このキーが固有でない場合、ランタイムエラー 457 "This key is already associated with an element of this collection" が生成されます。

  • item は、オブジェクトと他の Dictionary オブジェクトを含めて、任意のデータタイプとすることができます。

 

例では、Dictionary オブジェクトを使用して、状態の略語と対応する状態名を保存します。

Dim StateCode, StateName
Dim StateDict
Dim Key

Set StateDict = CreateObject("Scripting.Dictionary")

StateCode = "CA"
StateName = "California"
StateDict.Add StateCode, StateName

StateCode = "NY"
StateName = "New York"
StateDict.Add StateCode, StateName

StateCode = "MI"
StateName = "Michigan"
StateDict.Add StateCode, StateName

Key = "NY"
MsgBox StateDict.Item(Key)
 
プログラミングのヒント
  • Dictionary オブジェクト内のメンバーの順序は正式には定義されていません。つまり、個別のメンバーの位置を制御したり、Dictionary オブジェクト内の位置に基づいて個別のメンバーを取り出すことはできません。簡単に説明すると、記述するコードでは、Dictionary オブジェクト内の個別の要素の位置に関する前提を使用することはできません。

  • いったんキーと関連付けられたデータ項目を追加すると、書き込み専用の Key プロパティを使用してキーを変更できます。

  • データテーブルを保存するには Dictionary オブジェクトを使用します。特に、キー値によって意味のある形でアクセスできる単一のデータ項目を保存するときは、このオブジェクトを使用します。

  • Dictionary オブジェクトを使用して複数フィールドのデータレコードを保存することはお勧めしません。その代わりにクラスを使用すると、より良いプログラミングとなります。通常、レコードのフィールド値を表す配列を辞書に追加してレコードを保存します。しかし、Dictionary オブジェクトの項目に配列を割り当てるのは、優れたプログラミング手法ではありません。いったん辞書に割り当てると、配列の個別の要素は直接変更できなくなるためです。

 
関連項目

Dictionary.Key プロパティ

 
Dictionary.CompareMode プロパティ  
 
 
データタイプ

Long

 
説明

Dictionary オブジェクトのキーを比較するために使用するモードを設定または返します。

 
一目でわかる規則
  • CompareMode は、データが含まれていない辞書のみに設定できます。

  • CompareMode プロパティには、次の 2 つのいずれかの値を指定できます。

    0、バイナリ値

    これが初期設定値です。バイトごとにキーと文字列を比較して、一致するものが存在するかどうかを調べます。

    1、テキスト

    キーと文字列の一致で、大文字と小文字を区別しない比較を使用します。

  • さらに、CompareMode の値は 2 より大きくすることができます。この場合、比較で使用するロケール識別子 (LCID) が定義されます。
 
プログラミングのヒント
  • CompareMode プロパティを明示的に設定する必要があるのは、デフォルトのバイナリ比較モードを使用しない場合のみです。

  • Scripting Runtime タイプライブラリは、相当する数値の代わりに使用できる定数 (BinaryCompare および TextCompare) を定義します。これは、3 つの方法のいずれかで行うことができます。次のコードをスクリプトに追加して、定数を定義できます。

    Const BinaryCompare = 0
    Const TextCompare = 1

    また、VBScript ライブラリに定義されている同等の vbBinaryComparevbTextCompare 定数を使用することもできます。

    最後に、ASP プログラマーは、METADATA ディレクティブを使用して Scripting Runtime タイプライブラリにアクセスできます。Windows Script Host スクリプトを作成する場合は、Windows Script Host (.wsf ) ファイルに次の行を含めて、Scripting Runtime タイプライブラリの定数にアクセスできます。

    <reference GUID="{420B2830-E718-11CF-893D-00A0C9054228}" />
  • CompareMode プロパティは、実質的に既存のキー名と、Dictionary オブジェクトの Add メソッド、Exists メソッド、Item プロパティ、または Key プロパティの key パラメータの比較で大文字と小文字が区別されるか (BinaryCompare) または区別されないか (TextCompare) を示します。デフォルトでは、大文字と小文字が区別されます。

 
Dictionary.Count プロパティ  
 
 
データタイプ

Long

 
説明

Dictionary オブジェクトの「キー/項目」ペアの数を返す、読み取り専用プロパティ。

 
一目でわかる規則

このプロパティは、辞書の実際の項目数を返します。そのため、Count プロパティを使用して辞書の項目を繰り返す場合は、次のようなコードを使用します。

Dim ctr
For ctr = 0 to dictionary.Count - 1
   ' do something
Next
 
Dictionary.Exists メソッド  
 
 
構文
dictionaryobject.Exists(key) 
dictionaryobject

使用 :必須

データタイプ :Dictionary オブジェクト

Dictionary オブジェクトへの参照。

key

使用 :必須

データタイプ :文字列

検索対象のキー値。

 
戻り値

Boolean

 
説明

指定されたキーが Dictionary オブジェクトにあるかどうかを調べます。

 
一目でわかる規則

指定されたキーが Dictionary オブジェクトに存在する場合は True を返し、存在しない場合は False を返します。

 
プログラミングのヒント
  • Item プロパティを使用して存在しないキーの項目を返そうとするか、存在しないキーに新しいキーを割り当てようとする場合、存在しないキーは、空白の項目と共に辞書に追加されます。これを防ぐには、Exists プロパティを使用して、辞書にキーが存在することを確認してから処理を継続します。

  • key を既存のキー値と比較する方法は、Dictionary オブジェクトの CompareMode プロパティの設定によって指定されます。

 
If oDict.Exists(strOldKey) Then
    oDict.Key(strOldKey) = strNewKey
End If   
 
Dictionary.Item プロパティ  
 
 
構文

項目を設定する構文は次のとおりです。

dictionaryobject.Item(key) = item

項目を返す構文は次のとおりです。

value = dictionaryobject.Item(key)
dictionaryobject

使用 :必須

データタイプ :Dictionary オブジェクト

Dictionary オブジェクトへの参照。

key

使用 :必須

データタイプ :文字列

この Dictionary オブジェクト固有の文字列キー。

item

使用 :省略可能

データタイプ :任意

key に関連付けられているデータ。

 
データタイプ

任意

 
説明

Dictionary オブジェクトの指定されたキーにリンクするデータ項目を設定または返します。

 
一目でわかる規則
  • Item プロパティは、Dictionary オブジェクトのデフォルトメンバーです。

  • データタイプは、返される項目のデータタイプです。

  • ほとんどのオブジェクトの Item プロパティとは異なり、Dictionary オブジェクトの Item プロパティは読み書き可能です。存在しないキーに item を設定しようとすると、辞書にキーが追加され、項目は "暗黙的な追加" のように辞書にリンクされます。

 
プログラミングのヒント
  • Dictionary オブジェクトを使用しても、順序別に項目を取り出すことはできません。

  • 項目を取り出そうとするときに存在しないキーを指定すると、辞書は正常に動作しなくなります。key と共に空白の項目が Dictionary オブジェクトに追加されます。そのため、次の例のように、項目を設定または返す前に、Exists メソッドを使用する必要があります。

  • Dictionary オブジェクトに割り当てる項目または取り出す項目そのものがオブジェクトである場合は、変数または Dictionary オブジェクトに割り当てるときに、必ず Set キーワードを使用します。

  • key とメンバーキーの比較は、Dictionary オブジェクトの CompareMode プロパティの値によって定義されます。

  • Dictionary オブジェクトの Item プロパティの読み書き可能文字には欠点がありますが、利点もあります。具体的には、この Item プロパティは読み書き可能であるために、既存のデータ項目を上書きまたは置き換えるのは簡単になります。他のプロパティと同じように、新しい値を割り当てるだけです。

  • HTML フォームを保存または ASP アプリケーションの Session スコープでデータをクエリーするために、Dictionary オブジェクトは決して使用しないでください。Dictionary オブジェクトはアパートメントスレッド COM オブジェクトであるため、アプリケーションを単一の実行スレッドにロックダウンしてしまいます。

 

次の例では、ユーザーが入力した状態コードに対応する状態名を取り出すための参照テーブルとして Dictionary オブジェクトを使用します。サーバーにユーザー情報を送信する HTML ページは次のとおりです。

<HTML>
<HEAD><TITLE>Dictionary Object Example</TITLE></HEAD>
<BODY>
Enter your name and location: <P>
<FORM METHOD=POST ACTION=dictobj.asp>
Your name:
<INPUT TYPE="Text" NAME="VisitorName" /><P>
Your location:
<INPUT TYPE="Text" NAME="City" />,
<INPUT TYPE="Text" NAME="State" SIZE=2 /> <P>
<INPUT TYPE="Submit" VALUE="Submit" />
</FORM>
<BODY>
</HTML>

ユーザーによって送信された情報を取り出し、エンコードし、Dictionary オブジェクトを使用して完全な状態名を取り出す ASP ページを次に示します。

<HTML>
<HEAD>
<TITLE>ASP Page for the Dictionary Object Example</TITLE>
</HEAD>
<BODY>

            <% Show Greeting %>

<SCRIPT LANGUAGE="VBScript" RUNAT="Server">

Sub ShowGreeting(  )
   Dim StateDict
   Dim ClientName, ClientState

   ' Initialize dictionary
Set StateDict = Server.CreateObject("Scripting.Dictionary")
StateDict.Add "NY", "New York"
StateDict.Add "CA", "California"
StateDict.Add "FL", "Florida"
StateDict.Add "WA", "Washington"
StateDict.Add "MI", "Michigan"
StateDict.Add "MA", "Massachusetts"
StateDict.Add "MN", "Minnesota"
' add other states

ClientName = Server.HTMLEncode(Request.Form("VisitorName"))
ClientState = Server.HTMLEncode(Request.Form("State"))

Response.Write("Hello, " & ClientName & ". <P>")
Response.Write("We are pleased to have a visitor from ")
   Response.Write(StateDict.Item(ClientState) & "!")
End Sub
</SCRIPT>
</BODY>
</HTML>
 
Dictionary.Items メソッド  
 
 
構文
dictionaryobject.Items
dictionaryobject

使用 :必須

データタイプ :Dictionary オブジェクト

Dictionary オブジェクトへの参照。

 
戻り値

バリアント配列。

 
説明

指定された Dictionary オブジェクトのすべての項目が含まれた配列を返します。

 
一目でわかる規則

返される配列は常にゼロベースのバリアント配列となり、そのデータタイプは Dictionary オブジェクトの項目に一致します。

 
プログラミングのヒント
  • Dictionary のメンバーに直接アクセスするには、キー値を使用するのが唯一の方法です。しかし、Items メソッドを使用して、Dictionary からゼロベースのバリアント配列にデータをダンプできます。これで、次のコードに示すように、データ項目は通常の方法で配列のようにアクセスできるようになります。

    Dim vArray
    vArray = DictObj.Items
    For i = 0 to DictObj.Count -1
        Response.Write vArray(i) & "<P>"
    Next I
  • Items メソッドは Dictionary オブジェクトに格納されている項目のみを取り出します。すべての Dictionary オブジェクトのキーは、その Keys メソッドを呼び出して取り出すことができます。

 
関連項目

Dictionary.Keys メソッド

 
Dictionary.Key プロパティ  
 
 
構文
dictionaryobject.Key(key) = newkey
dictionaryobject

使用 :必須

データタイプ :Dictionary オブジェクト

Dictionary オブジェクトへの参照。

key

使用 :必須

データタイプ :文字列

既存の辞書項目のキー。

newkey

使用 :必須

データタイプ :文字列

この辞書項目の新しい固有のキー。

 
データタイプ

文字列。

 
説明

既存のキーを新しいキーで置き換えます。

 
一目でわかる規則
  • Key プロパティは書き込み専用です。

  • 既存のキー値 key が辞書に存在している必要があります。そうでない場合はエラーが発生します。

  • newkey は固有で、辞書に既に存在していない必要があります。そうでない場合はエラーが発生します。

  • key および newkey と既存のキー値との比較は、Dictionary オブジェクトの CompareMode プロパティによって定義されます。

 
Private Function ChangeKeyValue(sOldKey, sNewKey)
'Assumes oDictionary is a public object
    If oDictionary.Exists(sOldKey) Then
        oDictionary.Key(sOldKey) = sNewKey
        ChangeKeyValue = True
    Else
        ChangeKeyValue = False
    End If
End Function
 
プログラミングのヒント
  • 既存のキーの名前を変更するには、Key プロパティを使用します。新しいキーを追加し、関連付けられている値を Dictionary オブジェクトに追加するには、Add メソッドを使用します。すべてのキーの名前を取り出すには、Keys メソッドを使用します。これは、名前または辞書のコンテンツが事前に分からない場合に特に役立ちます。

  • キー名を取り出そうとするとエラーが発生します。同じように、既に辞書に追加されていないキー名を変更しようとするとエラーが発生します。キー名を取り出そうとすることは、キー名を取り出すためにキー名を指定することになり、意味のない操作です。

  • For Each...Next ループを使用して Dictionary オブジェクトのメンバーを繰り返すと、Key プロパティが暗黙的に呼び出されます。つまり、ループを繰り返すたびに、データ項目ではなくキーが返ります。メンバーのデータを取り出すには、次にそのキー値を使用して、Item プロパティを通じてデータにアクセスする必要があります。これについては、Dictionary.Item プロパティの例で示します。

 
Dictionary.Keys メソッド  
 
 
構文
dictionaryobject.Keys
dictionaryobject

使用 :必須

データタイプ :Dictionary オブジェクト

Dictionary オブジェクトへの参照。

 
戻り値

文字列の配列

 
説明

指定された Dictionary オブジェクトのすべての Key 値が含まれた配列を返します。

 
一目でわかる規則

返される配列は、常に 0 ベースのバリアント配列となり、そのデータタイプは String です。

 
プログラミングのヒント

Keys メソッドは、Dictionary オブジェクトに保存されているキーのみを取り出します。Dictionary オブジェクトのすべての項目は、その Items メソッドを呼び出して取り出すことができます。Dictionary オブジェクトの Item プロパティを使用すると、個別のデータ項目を取り消すことができます。

 
Dim vArray
vArray = DictObj.Keys
For i = 0 to DictObj.Count -1
    Response.Write vArray(i) & "<BR>"
Next
 
Dictionary.Remove メソッド  
 
 
構文
dictionaryobject.Remove key
dictionaryobject

使用 :必須

データタイプ :Dictionary オブジェクト

Dictionary オブジェクトへの参照。

key

使用 :必須

データタイプ :文字列

削除する項目に関連付けられているキー。

 
説明

指定されたキーと関連付けられているデータ (項目) を辞書から削除します。

 
一目でわかる規則

key が存在しない場合、ランタイムエラー 32811 "Element not found" が発生します。

 
Dictionary.RemoveAll メソッド  
 
 
構文
dictionaryobject.RemoveAll
dictionaryobject

使用 :必須

データタイプ :Dictionary オブジェクト

Dictionary オブジェクトへの参照。

 
説明

辞書をクリアします。つまり、すべてのキーと関連付けられているデータを辞書から削除します。

 
プログラミングのヒント

辞書のコンテンツ全体ではなく、選択された数のメンバーを削除する場合は、Remove メソッドを使用します。