※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

VBA|Removeメソッド(Dictionaryオブジェクト)

Dictionaryオブジェクトは、連想配列や辞書とよばれるオブジェクトのひとつでキー(Key)とアイテム(Item)とよばれる値をセットにして追加(登録)することができることが大きな特徴です。またDictionaryオブジェクトは、複数の便利なメソッドとプロパティをもっています。

こちらの記事では、連想配列(Dictionaryオブジェクト)のメソッドやプロパティの使いかたを紹介しています。

PR

スクール選びにお悩みですか?

動画編集、ロボット、AIとテクノロジーの進化が目まぐるしい時代だからこそ身につけるなら即戦力のスキル。

豊富なコースが選べて、独自開発されたカリキュラムの採用で業界有数の学習継続率!

さらにスキル習得だけじゃない。卒業後の転職や副業まで激アツなサポートが無料!!

Removeメソッドは連想配列(Dictionaryオブジェクト)の要素を削除する

Removeメソッドは、連想配列(Dictionaryオブジェクト)の要素を削除します。
すべての要素を削除する「RemoveAllメソッド」との違いは、要素を個別で削除する点になります。

Removeメソッドでは、削除したい要素のキー(Key)を指定することでそのキー(Key)を持つ要素が削除されます。また、くり返し文や条件判定などと組み合わせることで、複数の要素の削除や指定条件に一致するものを削除したい場合にも有効に使えるメソッドです。

※連想配列(Dictionaryオブジェクト)についてはこちら

Removeメソッド構文

連想配列(Dictionaryオブジェクト).Remove(Key)

引数には、指定したDictionaryオブジェクトに登録されているキー(Key)を指定します。指定されたキー(Key)がDictionaryオブジェクトに登録されていない場合はエラーが発生します。

Removeメソッドの構成要素と引数

要素/引数 必須/任意 説明
オブジェクト
(object)
必須 Dictionaryオブジェクトの名前を指定します。
キー
(Key)
必須 Dictionaryオブジェクトに登録されているキー(Key)を指定します。

引数に指定されたDictionaryオブジェクトに登録されている要素(キー(Key)とアイテム(Item))を削除します。

Dictionaryオブジェクトに登録されている要素を個別に削除するメソッドだね。

Removeメソッドつかったサンプルマクロ

連想配列(Dictionaryオブジェクト)のRemoveメソッドをつかったサンプルマクロを紹介します。
Removeメソッドの基本的な使用例とエラーを回避を加えたもの、さらに条件に一致したものをまとめて削除するマクロについても紹介していきます。

RemoveメソッドでDictionaryオブジェクトの要素を削除する

以下のマクロは、Removeメソッドを利用して連想配列(Dictionaryオブジェクト)である「MyDic」に登録されているキー(Key)を指定して、要素の削除を実行しています。

Option Explicit

Sub Dic_study1() 'Removeメソッドで指定項目を削除する

'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic As Dictionary
Set MyDic = New Dictionary

'Addメソッドで要素を追加する(要素は左からキー、アイテムの順番で指定する)
MyDic.Add "クワッス", "あお" '「クワッス」がキー、「あお」がアイテムになる
MyDic.Add "ホゲータ", "あか"
MyDic.Add "ニャオハ", "みどり"

'Removeメソッドの引数にキー(Key)を指定することで項目を削除する
MyDic.Remove "ホゲータ"

'キーを指定することでアイテムを取り出すことができる
Debug.Print MyDic("クワッス") '実行結果>>>あお
Debug.Print MyDic("ホゲータ") ''実行結果>>>空欄
Debug.Print MyDic("ニャオハ") '実行結果>>>緑

End Sub

Removeメソッドを使用する最もシンプルなマクロです。Addメソッドで登録したキー(Key)とアイテム(Item)のうち、“ホゲータ”のキーをもつ要素を削除しています。

サンプルでは「ホゲータ:あか」の要素を削除してみるよ。

イミディエイトウィンドウの実行結果から、キー(Key)に”ホゲータ”をもつ要素は何も返されなくなりました。Removeメソッドによって要素が削除されていることがわかります。

RemoveメソッドでDictionaryオブジェクトの要素を削除する(エラー回避)

Removeメソッド構文でもお知らせしましたが、Removeメソッドは未登録のキーを指定した場合エラーが発生します。こちらのマクロでは、未登録のキーを指定された場合のエラーを想定して、Removeメソッドを実行する前に指定されたキー(Key)が登録されているかの判定を行います。

登録されていないキーだとエラーになるから、先に判定してしまえばいいね。

Option Explicit

Sub Dic_study2() 'Removeメソッドで未登録のキーを指定した場合のエラーを回避する

'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim Mydic2 As Dictionary
Set Mydic2 = New Dictionary

'Addメソッドで要素を追加する(要素は左からキー、アイテムの順番で指定する)
Mydic2.Add "クワッス", "あお" '「クワッス」がキー、「あお」がアイテムになる
Mydic2.Add "ホゲータ", "あか"
Mydic2.Add "ニャオハ", "みどり"

'Removeメソッドの引数にキー(Key)を指定することで項目を削除する(エラーが発生する)
'Mydic2.Remove "ウェルカモ"

'削除したいキーを代入する変数の宣言
Dim Target As String

'Removeメソッドで削除したいキーを変数に代入する
Target = Application.InputBox("削除するキーを指定してください。", "キー(Key)を入力", Type:=2)

If Mydic2.Exists(Target) Then 'すでに登録されているキー(Key)であるかをExistsメソッドで判定
Mydic2.Remove (Target) 'Removeメソッドによる要素の削除
'結果の出力
Debug.Print Join(Mydic2.Keys, ",") & vbCrLf & Join(Mydic2.Items, ",")

Else
'未登録のキー指定時のエラー回避
Debug.Print "指定されたキー(Key)は未登録のもの、または何も入力されていません。"

End If

End Sub

Mydic2.Remove “ウェルカモ”の行のコメントアウトを解除すると以下のようなエラーが発生します。

Removeメソッドで未登録のキー(Key)を指定したときのエラー

削除したいキー(Key)をインプットボックスで入力できるようにし、入力された文字列がDictionaryオブジェクトに登録されているかの判定をしています。登録されているかの判定には、同じDictionaryオブジェクトのメソッドである「Existsメソッド」を利用しています。

Existsは指定したキーが存在するかを判定できるメソッドだったね。

インプットボックスによるキー(Key)の入力画面

サンプルでは、削除するキー(Key)をユーザーから指定できるようにしています。
このサンプルでは、Applicationオブジェクトのインプットボックスメソッドを利用しています。
インプットボックスの詳しい説明については以下の記事をご覧ください。

登録されている3つの要素のうち、”ホゲータ”のキーを持つ要素が削除されています。

未登録のキーを選択した場合のエラーを回避できたね。

Removeメソッドで条件に一致した文字列を含む要素を削除する

こちらのマクロは、特定の文字列を含む要素を削除するマクロになります。RemoveメソッドはDictionaryオブジェクトの要素を個別に削除するものですが、くり返しと条件判定と組み合わせて条件に一致した要素をまとめて削除する処理を実行します。

Option Explicit

Sub Dic_study3() 'Removeメソッドで条件に一致した文字列を含む要素を削除する

'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim Mydic3 As Dictionary
Set Mydic3 = New Dictionary

'Addメソッドで「Mydic3」にデータを追加する
Mydic3.Add "クワッス", "あお"
Mydic3.Add "ホゲータ", "あか"
Mydic3.Add "ニャオハ", "みどり"
Mydic3.Add "ウェルカモ", "あお"
Mydic3.Add "アチゲータ", "あか"
Mydic3.Add "ニャローテ", "みどり"
Mydic3.Add "ウェーニバル", "あお"
Mydic3.Add "ラウドボーン", "あか"
Mydic3.Add "マスカーニャ", "みどり"

'[Dictionaryオブジェクトの項目の取り出す(Removeメソッド前)]
Debug.Print "<Removeメソッド前>"
'Keysメソッドで全てのキー(Key)を取り出す。
Debug.Print "キー(Key)の一覧: " & Join(Mydic3.Keys, ",")
'Itemsメソッドで全てのアイテム(Item)を取り出す。
Debug.Print "アイテム(Item)の一覧: " & Join(Mydic3.Items, ",")

'[条件に一致したキー(Key)の項目を削除する処理(Removeメソッドによる項目の削除)]
Dim j As Integer: j = UBound(Mydic3.Keys) 'j=8になる
For j = j To 0 Step -1 'Dictionaryオブジェクトのインデックスの逆順(8→7→6…)でくり返す
If Mydic3.Keys(j) Like "*ニャ*" Then 'キー(Key)に"ニャ"が含まれるもの
Mydic3.Remove (Mydic3.Keys(j)) 'Removeメソッドで条件に一致した項目を削除する
End If
Next j

'要素を削除するとインデックスの最大値が変化するため、逆順での処理にするところがポイント!

'[Dictionaryオブジェクトの項目の取り出す(Removeメソッド後)]
Debug.Print "<Removeメソッド後>"
'Keysメソッドで全てのキー(Key)を取り出す。
Debug.Print "キー(Key)の一覧: " & Join(Mydic3.Keys, ",")
'Itemsメソッドで全てのアイテム(Item)を取り出す。
Debug.Print "アイテム(Item)の一覧: " & Join(Mydic3.Items, ",")

End Sub

連想配列(Dictionaryオブジェクト)の「MyDic3」にAddメソッドで9つの要素が追加されています。

続いてRemoveメソッドを使って条件に一致する項目の削除する処理についてですが、まずはくり返す回数を指定するために変数[ j ]に、Ubound関数をつかって配列データの上限インデックスである8が代入されます。

そして、削除する条件の判定では、Like演算子をつかってキー(Key)に”ニャ“が含まれているものを指定しています。

Tips

なぜくり返しのステップを逆順にしているのか?

Removeメソッドの処理はじめる前のDictionaryオブジェクト「Mydic3」の要素数は9つであることから、変数[ ]は8が代入されています。もし正順であると、処理をくり返すなかでカウントは加算されていく一方、条件に一致する項目が見つかる度にその要素が削除されインデックスの数は減少していき、くり返す回数よりも最大インデックスが小さくなってしまい「インデックスが有効範囲にありません。」のエラーが発生してしまうためです。

くり返しのカウントを8→7→6…と逆順にしているところもポイントだね。

「MyDic3」のキー(Key)に”ニャ”の文字列が含まれている「ニャオハ」、「ニャローテ」、「マスカーニャ」が条件に一致するため、Removeメソッドで削除されました。

Removeメソッドで条件の文字列を含む要素をまとめて削除できたね。

Removeメソッドで特定の数値以下の項目を削除する

今度は、連想配列(Dictionaryオブジェクト)のアイテム(Item)が数値であった場合に、特定の数値以下であるものを削除してみたいと思います。実務的に流用できる場面はイメージしやすいと思いますので、使い方の参考にしてください。

Option Explicit

Sub Dic_study4() 'Removeメソッドで特定の数値以下の項目を削除する

'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim Mydic4 As Dictionary
Set Mydic4 = New Dictionary

'Addメソッドでキーとアイテムを要素として追加する(Itemは重さ)
Mydic4.Add "クワッス", 6.1
Mydic4.Add "ホゲータ", 9.8
Mydic4.Add "ニャオハ", 4.1
Mydic4.Add "メッソン", 4
Mydic4.Add "ヒバニー", 4.5
Mydic4.Add "サルノリ", 5
Mydic4.Add "アシマリ", 7.5
Mydic4.Add "ニャビー", 4.3

'[条件に一致する項目の削除(Removeメソッド)]
Dim Key As Variant 'くり返し用変数の宣言
For Each Key In Mydic4.Keys 'Dictionaryオブジェクトのキー(Key)のすべてを対象にくり返す
If Mydic4(Key) <= 4.5 Then 'アイテム(Item)の数値が4.5以下の場合
Mydic4.Remove (Key) '項目を削除する(※Removeの引数はKeyで指定する)
End If
Next Key

'[結果の出力]
For Each Key In Mydic4.Keys
Debug.Print Key & " : " & Mydic4(Key)
Next Key

End Sub

こちらのサンプルでも、くり返しと条件分岐の組み合わせをもちいて条件に一致する要素の削除をしています。直前のサンプルとの大きな違いとして、Dictionaryオブジェクトのキー(Key)に特定の文字列を含むものではなく、アイテム(Item)が特定の数値以下であったときにRemoveメソッドの処理を実行します。

具体的には、連想配列(Dictionaryオブジェクト)である「Mydic4」には登録されている8つの要素(キーとアイテムのペア)があり、キー(Key)は名前でアイテム(Item)は重さです。このうち、アイテム(Item)が4.5以下のものを削除する処理となります。

実行結果を見てみましょう。

アイテム(Item)として登録されている重さが4.5以下の「ニャオハ」、「メッソン」、「ヒバニー」、「ニャビー」が条件に一致することから、これら4つの要素がRemoveメソッドによって削除されており、残った要素が出力されました。

Removeメソッドで数値の条件に一致する要素をまとめて削除することができたね。

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

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