Dictionary
Dictionaryの要素をシートに出力する方法を解説します。For Each文で1要素ずつセルへ出力していく方法と、要素を配列を介して一括でセル範囲に出力する方法の2つがあります。状況に応じて使い分けてください。
DictionaryのKeys/Itemsメソッドは全key/itemを1次元配列にして返すメソッドです。つまりKeys(i)はKeysの「引数i」ではなく、Keysが返す配列の「添字i」ということです。Keys(i)を使用したコードは都度配列を生成するため非常に遅くなります。
Dictionaryオブジェクトを使って、要素ごとのデータ数をカウントする方法を解説します。Excel上では、要素ごとのCOUNTIFや、ピボットテーブルで行う処理ですが、VBAの内部で行う場合は Dictionaryを使うと、簡単に書けて処理速度も高速です。
CollectionとDictionaryの違いについて解説します。どちらも「複数のデータをまとめて持つ仕組み」で、KeyとItemをペアで格納することができますが、Dictionaryが完全上位互換と言ってよい性能を持っています。
Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、「VBA100本ノック」に対する私の回答と解説のページです。
セルの検索を行う手段は様々で、Range.Find、WorksheetFunction.Match、セル範囲.Formula = "=MATCH"、Dictionary(連想配列)オブジェクトなどが挙げられます。これらの速度やコーディングコストを検証してみます。
DictionaryはKeyとItemをセットで持っておく仕組みですが、Itemを無視してKeyだけを一次元配列として使用する方法があります。このKeyのみDictionaryはCollectionの上位互換なので積極的に活用しましょう。
配列の中に配列が入っている、いわゆるジャグ配列を、ただの二次元配列に変換するコードを紹介します。DictionaryのItemに配列を入れた際、Itemsで生成されるジャグ配列をセルに一括出力するなどに活用できます。
列番号を管理する方法として、列挙型変数Enumを用いる他に、Dictionaryを用いる方法もあります。特に「同じコードをレイアウトの異なるシートに対して実行できる」のが強みですので一度使ってみてください。
Dictionaryは中身の確認が難しい欠点があります。ローカルウィンドウでKeyは見れますがItemは見ることができません。この対策として「Dictionaryを新規シートに出力する」マクロを用意するのがおすすめです。
処理が超速なことで知られるDictionaryですが、実はデータ件数が増えすぎると急に遅くなるという欠点もあります。件数の二乗に比例して処理が遅くなる傾向があるため、Dictionaryを分割するなどで対応します。
Dictionaryの中身を配列に変換する場合、Key/Itemをそれぞれ一次元配列にするだけなら、Keys/Itemsメソッドを使用するだけでOKですが、二次元配列にしたい場合などはひとつずつ代入していく必要があります。
Dictionaryの活用例として、データ集計マクロを作成してみます。Itemに値を保管する手段としてDictionary/配列/クラスなどがありますが、本ページでは「Itemに一次元配列を格納」パターンを紹介します。
Dictionaryの活用例として、データ集計マクロを作成してみます。Itemに値を保管する手段としてDictionary/配列/クラスなどがありますが、本ページでは「Itemに自作クラスを格納」パターンを紹介します。
Dictionaryの活用例として、データ集計マクロを作成してみます。Itemに値を保管する手段としてDictionary/配列/クラスなどがありますが、本ページでは「列ごとにDictionaryを作成する」パターンを紹介します。
一次元配列から重複を削除する方法を解説します。Excel365、Excel2021以降のバージョンであれば、 WorksheetFunction.Uniqueを使用するのが簡単です。 旧バージョンとの互換性やその他カスタマイズを行いたい場合は、 Dictionaryオブジェクトを使用して重複…
シート内のすべての数式と、その式が入力された範囲を取得するコードを紹介します。Key:数式、Item:セル範囲のDictionaryとして取得します。FormulaR1C1を利用することで相対参照式を同一として判定できます。
Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、「VBA100本ノック」に対する私の回答と解説のページです。
セル範囲をDictionaryに格納する方法を解説します。一括で入力する方法はないため、ループ文を使って愚直に代入していきます。テーブル形式の場合はDictionaryを列分用意するか、Itemを配列にして対応します。
Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、「VBA100本ノック」に対する私の回答と解説のページです。
同じ図形が同じ場所に大量に溜まったファイルを整理する際に、最前面の図形以外を削除するコードを紹介します。タイプや位置などの複数要素の一致判定にはDictionaryを使用するのが便利です。
DictionaryやFSOを使用する際As FileSystemObject/Dictionaryとデータ型を明示するにはScripting Runtimeの設定が必要です。設定すれば選択肢入力が活用できるため、自分でコードを書く場合は必ず設定を行いましょう。
Scripting Runtimeの設定をVBAから行う場合はVBProject.References.AddFromGuidメソッドを利用します。Scripting Runtime以外のライブラリもIDを調べれば自動化できますので流用してみてください。
第5回 和風スパゲティ勉強会「Collection&Dictionary」の配布資料と配信アーカイブを共有します。前回の配列(Array)に続いてExcelVBA配列トリオを一挙に解説しました。復習にお役立てください。
和風スパゲティ勉強会 第5回のテーマは「Collction&Dictionary」ということで、使いこなせば強力な武器になるこの2つの機能を徹底解説します!同時開催の配列入門もご視聴いただき、3つ一気にマスターしましょう。
Dictionary内の配列は要素の書き換えが出来ません。Dictionary内の配列に代入した値が反映されない、Dictionary×配列によるクロス集計の結果が0になってしまうなどにお悩みの方はこの罠を疑ってください。
今日はFor Eachステートメントで遊んでみようと思います。For Eachステートメントの変数を途中で変更したり、対象のCollectionを追加・削除して、それがForEachのループに影響するか試してみます。
コミュニティ「Excel-Fun.xls*」にて毎月出題される、VBAの問題に対する私の回答ソースコードを掲載いたします。今回掲載するコードは第6回課題共有会の課題でもあった「人事データからクロス表を作成」のマクロ2です。
DictionaryはKeyからItemを取得するオブジェクトですが、逆にItemからKeyを取得する方法を解説します。といってもそんなプロパティはありませんので、自作関数を作ってゴリ押しするよりほかありません。
DictionaryのItemプロパティ、Keysメソッド、Addメソッドにはそれぞれ省略記法が存在します。各省略記法のメリット・使い方と、省略した場合に発生する可能性のあるエラーなど注意点について解説します。