Removeメソッド(Dictionary)

Dictionaryオブジェクトのリストから指定の項目を削除するメソッドです

'指定keyデータを削除
zz辞書.Remove (2)

Dictionaryオブジェクトに作成したリストデータから特定keyのデータを削除するには「Remove」メソッドを使用します

引数に指定したkeyが存在しない場合は実行時エラーが発生します

メソッドの書式

引数(太字は必須引数)
Remove (key)

「key」は、必須引数で削除を行うkeyを指定します
また、itemを指定しての削除は行えません

実際の使用例

Dictionaryオブジェクトから項目を削除する動き
メソッドの動き

Dictionaryオブジェクトに3つの項目を作成してから、メソッドを実行して削除を行っています

削除にはkeyを指定するのでここでは「2」を指定して、そのkeyのデータをitemと一緒に削除します

コード実行後に値列の「2」が無くなっていることで削除の確認が出来ます

メソッドでは指定したkeyが見つからない場合は、実行時エラーが発生することは解説しましたが、このDictionaryオブジェクト全般の注意点として、値と文字列が別のデータとして認識される点には注意が必要です

この画像の例では、「2」はInteger型なので値として取得されています
ここで文字列の「2」を指定するとkeyが見つからずにエラーが発生しますのでkeyを指定する場合は文字列なのか値なのかは処理上、理解した上で運用するようにしてください

Itemプロパティ(Dictionary)

Dictionaryオブジェクトに作成したデータからitemを取得するプロパティです

’itemを取得する
zz辞書(1)

Dictionaryオブジェクトから取得したデータを取得するには、「Item」プロパティを使用して取得します
このプロパティは省略することが多いです

zz辞書.Item(1)

省略しない場合はこのような書き方をします、省略することが多いので書いても可読性は上がらないかもしれません

コードの様に、Dictionaryオブジェクトから直接「()」で指定することで取得できます
引数にはkeyを指定します

実際の使用例

zz辞書.Add 1, "あ"
zz辞書.Add 2, Range("A1:A3")
zz辞書.Add 3, Array("あ", "い")

このコードを使用して、Dictionaryオブジェクトにリストを作成している状態で解説を行います

zz辞書(1)
→→→ 

Dictionaryオブジェクトに直接「()」を結合して、その中にkeyを指定することでそのkeyにペアリングされたitemのデータが返されます

上記のコードで作成されたリストを確認してください
「あ」が返されることが分かるはずです

こうして、Dictionaryオブジェクトで作成したデータから取得を行います

プロパティ使用時の注意点

zz辞書(4)
→→→ 

このプロパティで取得する際の重要な注意点です
このコードを実行するとエラーは発生せず空白が返されます

本来このプロパティで指定しているkeyは存在しません
keyは上記で作成した物を利用しているので、「1,2,3」の3つだけです

存在しないkeyを指定しているので、本来はエラーが発生しても良いはずです
ですが、このプロパティはエラーを発生させません

別の記事で解説していますが、このプロパティは読み取りだけでなく書き込みも可能なプロパティであるため、存在しないkeyであっても書き込み処理は可能なためエラーが発生しません

と、いうわけでこのDictionaryオブジェクトではkeyの存在確認が非常に重要です
そこをしないと指定のkeyがあるかないか分からないという、すこし手間のかかるオブジェクトです

ですが、そここそがこのオブジェクトの利点でもあるので、このオブジェクトを利用する価値があるのです

Dictionaryオブジェクトからitemデータを取得する場合は、Existsメソッドを使用してkeyの存在確認を必ず行うようにしましょう

Existsメソッド(Dictionary)

Dictionaryオブジェクトから特定のkeyの存在確認をするメソッドです

'Keyの存在確認
Debug.Print zz辞書.Exists(1)

Dictionaryオブジェクトに作成したリストの中から、特定のものがあるかを調べるには「Exists」メソッドを使用します

このメソッドは、keyでの判定を行います
itemでの判定は行えません、itemは重複が可能なためです

このメソッドこそ、このDictionaryオブジェクトの真骨頂といっても過言では無いメソッドです
このメソッドの為に、このオブジェクトを使用する目的になるほどです

メソッドの書式

引数(太字は必須引数)
Exists (key)

「key」はDictionaryオブジェクトに登録したリストデータのkeyを指定します
引数はこれだけで、必須項目です
この引数に指定した内容と一致するデータが存在すれば「True」、存在しなければ「False」が返されます
存在に関わらず、itemが返されることはありませんので注意してください

実際の使用例

zz辞書.Add 1, "あ"
zz辞書.Add 2, Range("A1:A3")
zz辞書.Add 3, Array("あ", "い")

このコードによりリストが作成されます
3行のリストデータを作成しています、ここから特定のデータの存在確認を行ってみます

zz辞書.Exists(1)
→→→ True

ここでのkeyの検索は「1」を指定しています
上記のリスト作成でkeyには「1,2,3」の3つの整数値が作成されているため、ここでは指定したデータが見つかるため、「True」が返されます

zz辞書.Exists(4)
→→→ False

このコードを実行すると「False」が返されます
これは「4」という整数値がkeyに存在しないためです

こうして、指定したデータが存在するかどうかを判定することで参照したいデータがリストに登録されたデータであるかを調べることが出来ます
また、重複しないリストを作成する際に取得したいデータがリストにあるかどうかを、いちいち全ての要素を検証せずに判定が出来ます

ちなみに、このメソッドには型も重要になります

zz辞書.Exists(CStr(1))
→→→ False

このコードを実行すると、今度は「False」が返されます
指定の引数の数字は同じ「1」が指定されています

ですが、今回はCStr関数により整数値から文字列に変換されています
こうして、型に相違があると別の値と認識するため、存在しないと判断します

基本的にこのメソッドを使用する際に、こうした変換を行うことが無ければ問題はありません

しかし、Addメソッドによりリスト作成する際に注意する必要があります
それは、セルの値を取得する際などです
セルには数値や日付を文字列として入力することが可能です
逆に文字列と思っていたら、表示形式で実際は数値だったりもします

このセルを取得すると、数値ではなく文字列の数字を取得するので整数値をメソッドの引数に指定した場合、永遠にFalseのままです
見た目は全く同じ「1」であっても、存在しないことにしてしまいます

この型のズレを調整しておかないとリストに取得したはずで、見た目も全く同じデータなのになぜかExistsメソッドでFalseしか返ってこない、という現象に遭遇します

特にまだ変数に慣れきっていないような方は、型の理解が難しいかもしれません

ですが、このメソッドの利用価値が非常に高いため、この点はしっかり理解しておいてください
そうすることでより便利にこのExistsメソッドを利用できるようになります

Addメソッド(Dictionary)

Dictionaryオブジェクトにデータを新規追加するメソッドです

'データを新規追加する
zz辞書.Add 1, "い"

Dictionaryオブジェクトのリストにデータを追加するには、Addメソッドを使用します
このメソッドは追加になるので、指定のインデックス番号の箇所に挿入するような動作は出来ません

メソッドの書式

引数(太字は必須引数)
Add key, item

引数は2つで、どちらも必須項目になります
また、この2つがペアとしてオブジェクトにデータが登録されます

「key」は、データを検索や取得を行う際に目印となるデータです
ここのデータは重複したデータは登録できませんので、重複する場合は実行時エラーが発生します
また配列以外のデータで指定する必要があります、連番であったり管理コードなどでも構いませんが1つのデータにする必要がある訳です

「item」は、Keyにペアリングされるデータになります
ここは配列データやオブジェクトも代入させることができますので、比較的自由に指定できます
基本的に、このデータを取得することになります

実際の使用例

zz辞書.Add 1, "あ"

基本的なデータの追加方法です
keyとして「1」を、itemとして「”あ”」を追加します

これで、keyの「1」を指定した場合「”あ”」が取得されるデータが作成されます

1つ目のデータの取得と出力
データを追加した状態

画像はコードによりデータを追加作成した後の状態です
まず、右側のローカルウィンドウの辞書にitemが追加されて値が「1」になっていることが確認できます
なお、ローカルウィンドウではitemを確認することができませんのでkeyのみが表示された状態です

次に左下のイミディエイトを確認してください
追加したデータを出力しています、itemに登録した「あ」が出力されています

zz辞書.Add 2, Range("A1:A3")

2つ目はitemにオブジェクトを取得させてみます
Rangeオブジェクトを指定することで、そのセル範囲をkeyから取得することが出来ます

itemにRangeオブジェクトを代入させたとき
Rangeオブジェクトを操作した状態

イミディエイトを確認してください
2行出力されています

まず1行目は、取得させたRangeオブジェクトのAddressプロパティを出力しています
取得がA1~A3なので、そのセルアドレスが出力されています
このことからもitemにしっかりセル範囲が取得できていることが分かります

そのセルに値を代入してみます、その代入した値を再度イミディエイトに出力しています
「zz辞書(2)(2) = 100」の部分が、セルへの値入力の箇所になります
このうちzz辞書(2)はRange(“A1:A3”)と同義になるので、「Range(“A1:A3”)(2) = 100」と書き換えることが出来ます
このセル範囲の2番目のセルなので、A2が指定されることになります

なので、イミディエイト2行目の100はA2セルの入力値であることが分かります

インテリセンスも使用できず、分かりにくいことこの上ないので、あまりこういった使い方はしないかもしれませんが、オブジェクトも可能ということです
ユーザーフォームなどオブジェクトの多い時には役に立つかもしれませんね

zz辞書.Add 3, Array("あ", "い")

ここでは配列データをitemに取得させています
2次元配列の2次元目を追加しているようなイメージになりますね

itemに配列を代入した時
配列データを取得させる

1次元の配列データを取得させています
「”あ”,”い”」の2つの要素を含む配列データになります

その配列から特定のデータを取得するには、要素数のインデックス番号で指定することで可能です
配列のインデックス番号は0から始まりますので、「zz辞書(3)(1)」は2番目の要素を指定することになります

イミディエイトには2番目の要素である「い」が出力されています

こちらもオブジェクト同様、イメージしづらく
なによりローカルで確認できないので、処理作成はやりづらいです

要は、itemには数値や文字列だけでなく配列もオブジェクトも代入させることが出来るという点に理解を持っておいてもらえれば何かの役に立つときが来ます

zz辞書.Add Array("あ", "い"), 4

これはエラーになるコードです
keyに
配列データを指定しているためです

keyに配列を指定した場合のエラーメッセージ
実行時エラーのメッセージ

画像の様に実行時エラーが発生します
keyには配列データを指定することは出来ません

これをしたいなら、keyを「あ」と「い」の2つを登録して、itemは同じ値を取得させるようにします

なお、オブジェクトの取得は可能ですが、使う事は無いでしょう

必要なデータを分かり易くリスト化して扱うのが、このDictionaryオブジェクトです
処理速度も速いのでサクサク登録していきましょう

Dictionaryオブジェクト

Dictionaryオブジェクトの解説と記事一覧

'実行時バインディング
Dim zz辞書 As Object
Set zz辞書 = CreateObject("Scripting.Dictionary")
'事前バインディング
Dim zz辞書 As New Scripting.Dictionary

「Dictionary」オブジェクトは、リスト化されたデータを扱う際に便利なオブジェクトです
このオブジェクトは、使用時にはインスタンスの作成を行う必要があります
インスタンスの作成には、2通りの方法があります
それが記事コードの2つになります

基本的には1つ目の実行時バインディングを行ってください

2つ目は事前に設定する必要があるため、自分の環境下以外で使用する可能性がある場合はエラーが発生します

なお、この事前バインディングはFileSystemObjectと同じものを参照設定すると有効になります
以下の記事で設定方法を画像付きで解説しています

使用の流れ

Dictionaryオブジェクトは、インスタンスを作成した段階ではなんのデータも入っていない状態です
まずは、データを登録していく作業が必要になります

データの登録にはAddメソッドを使用します
Dictionaryオブジェクトは、keyとitemの2つがペアとなってリストとなります

必要なデータを登録して、リストが完成したらそのリストのデータから条件に一致するデータがあるかを検索します
検索にはExistsメソッドを使用します
これはkeyを検索するメソッドになり、itemを検索するメソッドはありません
なぜなら、keyは一意で重複不可のデータであるためです

検索して見つかったら、そのデータに対応するデータを取得します
データを取得するkeyを指定することで、ペアのitemのデータを取得することが出来ます

Set zz辞書 = Nothing

使用が終わったら、上記のコードで変数の解放を行います

また、同じような役割でVBA標準のCollectionオブジェクトがありますが
こちらは検索が行えないなど使い勝手が少し微妙なのでこちらのDictionaryオブジェクトの利用に慣れていたほうが良いと思います

セル範囲を指定することでDictionaryオブジェクトを作成する関数を作成しました
以下の記事で紹介しています

Dictionaryオブジェクトのメンバー

  • Addメソッド
    オブジェクトにデータの新規追加を行います
  • Existsメソッド
    オブジェクト内のkeyの内から指定データの有無の判定を行います
  • Itemプロパティ
    オブジェクト内の指定keyのItemデータを取得します
  • Removeメソッド
    オブジェクト内の指定keyとペアitemを削除します
  • RemoveAllメソッド
    オブジェクト内のkeyとitemの全てを一括削除します
  • Countプロパティ
    オブジェクト内のデータの個数を取得できます
  • Keys・Itemsメソッド
    それぞれの全てのデータを配列として返されます
  • Key・Itemプロパティ
    登録済みのデータをオブジェクト上で変更します