VBAのDictionaryオブジェクトの使い方について知りたいときはないでしょうか。
けど、そんな中で悩むことは、
・ExcelでDictionaryオブジェクトを使い繰り返し処理をしたいが方法がわからない
ですよね。
今回はそんなお悩みを解決する
・ExcelでDictionaryオブジェクトを使い繰り返し処理を行う方法
についてまとめます!
もくじ
VBAのDictionaryオブジェクトとは
VBAのDictionaryオブジェクトは、キーと値のペアを保持するために使用されます。
具体的には連想配列やハッシュテーブルに構造が似ています。
Dictionaryオブジェクトの参照設定の方法
Dictionaryオブジェクトを利用するために必要な参照設定は
「Microsoft Scripting Runtime」
になりますので、こちらの参照設定を行います。
エクセルリボンメニューの「開発」タブ>「Visual Basic」をクリックし、
VBE(Visual Basic Editor)を起動したら、メニューの
「ツール」>「参照設定」>「参照設定」から
「Microsoft Scripting Runtime」にチェックを入れ「OK」ボタンをクリックしましょう。
Dictionaryオブジェクトの基本的な構文と使い方
Dictionaryオブジェクトの基本的な構文と使い方についてサンプルコードを交えて説明します。
Dictionaryの作成
新しい Dictionary オブジェクトを作成しています。
Dim で変数objDictを宣言し、CreateObjectを使ってDictionaryオブジェクトをインスタンス化しています。
Dim objDict As Object
Set dict = CreateObject("Scripting.Dictionary")
要素の追加
Addメソッドを使って Dictionaryに新しい要素を追加します。
ここで Key はユニークな識別子(文字列や数値など)で、Value はそのキーに関連付けられる値を指定します。
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
さいごに
いかがでしょうか。
今回は、
・ExcelでDictionaryオブジェクトを使い繰り返し処理を行う方法
についてまとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
コメントを残す