【Excel VBA】Dictionaryの使い方!参照設定から繰り返し処理まで説明!

【Excel VBA】Dictionaryの使い方!参照設定から繰り返し処理まで説明!

VBAのDictionaryオブジェクトの使い方について知りたいときはないでしょうか。

けど、そんな中で悩むことは、

・VBAのDictionaryオブジェクトの使い方がわからない
・ExcelでDictionaryオブジェクトを使い繰り返し処理をしたいが方法がわからない

ですよね。

今回はそんなお悩みを解決する

・VBAのDictionaryオブジェクトの使い方
・ExcelでDictionaryオブジェクトを使い繰り返し処理を行う方法

についてまとめます!

VBAのDictionaryオブジェクトとは

VBAのDictionaryオブジェクトは、キーと値のペアを保持するために使用されます。
具体的には連想配列やハッシュテーブルに構造が似ています。

Dictionaryオブジェクトの参照設定の方法

Dictionaryオブジェクトを利用するために必要な参照設定は

「Microsoft Scripting Runtime」

になりますので、こちらの参照設定を行います。

エクセルリボンメニューの「開発」タブ>「Visual Basic」をクリックし、
VBE(Visual Basic Editor)を起動したら、メニューの
「ツール」>「参照設定」>「参照設定」から
「Microsoft Scripting Runtime」にチェックを入れ「OK」ボタンをクリックしましょう。

タカヒロ
タカヒロ
CreateObject(“Scripting.Dictionary”)の指定方法の場合は「Microsoft Scripting Runtime」にチェックを入れなくても実行が可能です。

Dictionaryオブジェクトの基本的な構文と使い方

Dictionaryオブジェクトの基本的な構文と使い方についてサンプルコードを交えて説明します。

Dictionaryの作成

新しい Dictionary オブジェクトを作成しています。
Dim で変数objDictを宣言し、CreateObjectを使ってDictionaryオブジェクトをインスタンス化しています。

Dim objDict As Object
Set dict = CreateObject("Scripting.Dictionary")

要素の追加

Addメソッドを使って Dictionaryに新しい要素を追加します。
ここで Key はユニークな識別子(文字列や数値など)で、Value はそのキーに関連付けられる値を指定します。

タカヒロ
タカヒロ
キーは Dictionary 内で一意でなければなりません。

objDict.Add Key, Value

サンプル
Dictionary にキーと値のペアを追加します。

objDict.Add "apple", "りんご"
objDict.Add "orange", "オレンジ"

要素の取得

Dictionaryから特定のキーに関連付けられた値を取得します。
キーを指定してobjDict(Key) と記述することで、そのキーに対応する値を取得できます。

Dim value As Variant
value = objDict(Key)

サンプル
特定のキーに関連付けられた値を取得します。

Dim fruit As Variant
fruit = objDict("apple")  ' "りんご" を返す

要素の存在チェック

Existsメソッドを使って、指定したキーが Dictionary 内に存在するかどうかをチェックします。
キーが存在する場合はTrueを返し、存在しない場合はFalseを返します。

If objDict.Exists(Key) Then
    ' キーが存在する場合の処理
End If

サンプル
特定のキーが存在するかチェックします。

If objDict.Exists("banana") Then
    MsgBox "キー 'banana' が存在します。"
Else
    MsgBox "キー 'banana' は存在しません。"
End If

要素の削除

特定のキーに関連付けられた要素をDictionaryから削除します。
Remove メソッドに削除したいキーを指定します。

objDict.Remove(Key)

サンプル
特定のキーを持つ要素を削除します。

objDict.Remove("orange")

すべての要素の削除

RemoveAllメソッドを使用すると、Dictionary 内のすべての要素を削除できます。

objDict.RemoveAll()

要素数の取得

Countプロパティを使って、Dictionary内の要素数を取得します。

Dim count As Integer
count = objDict.Count

サンプル
Dictionary の要素数を取得します。

Dim numberOfItems As Integer
numberOfItems = objDict.Count
MsgBox "要素数: " & numberOfItems

キーと値をループで処理

Dictionaryのすべてのキーに対してループ処理を行います。
For Each ループを使ってobjDict.Keysコレクション内の各キーに対する処理を実行します。
対応する値は objDict(key) を使用して取得できます。

Dim key As Variant
For Each key In objDict.Keys
    ' keyを使った処理
    ' 対応する値は objDict(key) で取得できる
Next key

サンプル
Dictionary のすべてのキーと値をループで処理します。

Dim k As Variant
For Each k In myDictionary.Keys
    MsgBox "キー: " & k & ", 値: " & myDictionary(k)
Next k

Dictionaryオブジェクトを使い繰り返し処理で文字の置換を行う方法

Dictionaryオブジェクトを使い、複数の文字列の置換を繰り返し行う方法ついて説明をします。

サンプルデータを用意

まずはエクセルにシート「Sheet1」を追加し、以下のデータをランダムに配置していきましょう。

旧文字列1
旧文字列2
旧文字列3

今回はこのランダムに配置した文字列を「新文字列*」に連続置換する処理を行いたいと思います。

サンプルコード

「新文字列*」に連続置換する処理をDictionaryオブジェクトを使って実現するサンプルコードとなります。

Sub シートの文字列を置換()
    Dim objDict As Object
    Dim ws As Worksheet
    Dim cell As Range
    Dim key As Variant
    
    Set objDict = CreateObject("Scripting.Dictionary")

    ' 置換ルールの設定します。 (キー: 置換前の文字列, 値: 置換後の文字列)
    objDict.Add "旧文字列1", "新文字列1"
    objDict.Add "旧文字列2", "新文字列2"
    objDict.Add "旧文字列3", "新文字列3"
    ' 以下、必要に応じて追加

    ' 置換対象のシート名を設定します。
    Set ws = ThisWorkbook.Sheets("Sheet1")

    For Each cell In ws.UsedRange
    
        ' 数式が含まれていないセルのみ対象にします。
        If Not cell.HasFormula Then
            For Each key In objDict.Keys
                If InStr(cell.Value, key) > 0 Then
                    cell.Value = Replace(cell.Value, key, objDict(key))
                End If
            Next key
        End If
    Next cell
End Sub

以下のスクリプトは、特定のシート(例として “Sheet1″)内のすべてのセルを対象に、Dictionary に定義された各キー(置換前の文字列)を対応する値(置換後の文字列)で置換します。

置換ルールの追加

置換したい文字列があれbら置換ルールを追加、または変更します。

objDict.Add "旧文字列1", "新文字列1"
objDict.Add "旧文字列2", "新文字列2"
objDict.Add "旧文字列3", "新文字列3"

置換対象のシートの設定

このコードは、操作を行う Excelシート”Sheet1″を指定しています。
必要に応じて別のシート名に変更できます。

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")

VBAを実行する

VBAを実行し、文字列「新文字列*」に連続置換されるか確認をしましょう。

はい、「新文字列*」に連続置換されましたね!
Dictionaryオブジェクトの繰り返し処理がされたことが確認できました!

VBAの説明

このVBAは 指定されたシート内のテキストを効率的に置換することができます。
また、置換ルールを追加・変更することで、さまざまな置換ニーズに対応可能です。

新しい Dictionary オブジェクトを作成し、objDict に割り当てています。

Set objDict = CreateObject("Scripting.Dictionary")

ここでは、Dictionary に置換ルールを追加しています。各ルールはキーと値のペアで、キー(旧文字列)が見つかった場合、それを値(新文字列)に置換します。

objDict.Add "旧文字列1", "新文字列1"
objDict.Add "旧文字列2", "新文字列2"
objDict.Add "旧文字列3", "新文字列3"

このスクリプトで操作するシートを指定しています。ここでは “Sheet1” という名前のシートを対象にしています。

Set ws = ThisWorkbook.Sheets("Sheet1")

シートの使用済み範囲 (UsedRange) 内の各セルに対してループを行い、置換処理をおこなっています。
数式を含むセルは置換の対象外とし、テキストのみを含むセルを対象にし、
InStr 関数を使ってセルの値にキー(置換前の文字列)が含まれているかをチェックした上、
Replace 関数で実際の置換を行います。

For Each cell In ws.UsedRange
If Not cell.HasFormula Then
For Each key In objDict.Keys
If InStr(cell.Value, key) > 0 Then
cell.Value = Replace(cell.Value, key, objDict(key))
End If
Next key
End If
Next cell

さいごに

いかがでしょうか。

今回は、

・VBAのDictionaryオブジェクトの使い方
・ExcelでDictionaryオブジェクトを使い繰り返し処理を行う方法

についてまとめました。

また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。








コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です