Dictionary
同じ図形が同じ場所に大量に溜まったファイルを整理する際に、最前面の図形以外を削除するコードを紹介します。タイプや位置などの複数要素の一致判定にはDictionaryを使用するのが便利です。
DictionaryはKeyとItemをセットで持っておく仕組みですが、Itemを無視してKeyだけを一次元配列として使用する方法があります。このKeyのみDictionaryはCollectionの上位互換なので積極的に活用しましょう。
処理が超速なことで知られるDictionaryですが、実はデータ件数が増えすぎると急に遅くなるという欠点もあります。件数の二乗に比例して処理が遅くなる傾向があるため、Dictionaryを分割するなどで対応します。
DictionaryやFSOを使用する際As FileSystemObject/Dictionaryとデータ型を明示するにはScripting Runtimeの設定が必要です。設定すれば選択肢入力が活用できるため、自分でコードを書く場合は必ず設定を行いましょう。
Scripting Runtimeの設定をVBAから行う場合はVBProject.References.AddFromGuidメソッドを利用します。Scripting Runtime以外のライブラリもIDを調べれば自動化できますので流用してみてください。
CollectionとDictionaryの違いについて解説します。どちらも「複数のデータをまとめて持つ仕組み」で、KeyとItemをペアで格納することができますが、Dictionaryが完全上位互換と言ってよい性能を持っています。
第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は中身の確認が難しい欠点があります。ローカルウィンドウでKeyは見れますがItemは見ることができません。この対策として「Dictionaryを新規シートに出力する」マクロを用意するのがおすすめです。
Dictionaryの要素をシートに出力する方法を解説します。For Each文で1要素ずつセルへ出力していく方法と、要素を配列を介して一括でセル範囲に出力する方法の2つがあります。状況に応じて使い分けてください。
DictionaryのItemプロパティ、Keysメソッド、Addメソッドにはそれぞれ省略記法が存在します。各省略記法のメリット・使い方と、省略した場合に発生する可能性のあるエラーなど注意点について解説します。
コミュニティ「Excel-Fun.xls*」にて毎月出題される、VBAの問題に対する私の回答ソースコードを掲載いたします。今回掲載するコードは第4回課題共有会の課題でもあった「プラモの部品構成表を作成する」問題です。
Dictionaryの活用例として、データ集計マクロを作成してみます。Itemに値を保管する手段としてDictionary/配列/クラスなどがありますが、本ページでは「ItemにもDictionaryを格納」パターンを紹介します。
Dictionaryの活用例として、データ集計マクロを作成してみます。Itemに値を保管する手段としてDictionary/配列/クラスなどがありますが、本ページでは「Itemに自作クラスを格納」パターンを紹介します。
Dictionaryの活用例として、データ集計マクロを作成してみます。Itemに値を保管する手段としてDictionary/配列/クラスなどがありますが、本ページでは「Itemに一次元配列を格納」パターンを紹介します。
配列の中に配列が入っている、いわゆるジャグ配列を、ただの二次元配列に変換するコードを紹介します。DictionaryのItemに配列を入れた際、Itemsで生成されるジャグ配列をセルに一括出力するなどに活用できます。
Dictionaryの活用例として、データ集計マクロを作成してみます。Itemに値を保管する手段としてDictionary/配列/クラスなどがありますが、本ページでは「列ごとにDictionaryを作成する」パターンを紹介します。
Dicitonaryのkey/ItemはVariant型のため、値でもオブジェクトでも入れることができます。このためセル⇒セル.Valueの自動読替はできませんので、値をkeyにするには.Valueを明示する必要があります。
列番号を管理する方法として、列挙型変数Enumを用いる他に、Dictionaryを用いる方法もあります。特に「同じコードをレイアウトの異なるシートに対して実行できる」のが強みですので一度使ってみてください。
3/18(土)20:00~ Zoom勉強会に登壇します。「配列入門!Array&Collection&Dictionary欲張りセット」と題し、まだ配列を使ったことがない方、CollectionやDictionaryに触れてみたい方、3つの特長と使い分けポイントを整理したい方に向けた講座を行います。
Collection/Dictionary/FileSystemObject/自作クラスを使用するとき、Dim x As X、Set x = New Xと2行で宣言する方法と、Dim x As New X と1行で宣言する方法があります。この違いはNothing時の動きと、Initializeの実行タイミングに現れます。
DictionaryのKeys/Itemsメソッドは全key/itemを1次元配列にして返すメソッドです。つまりKeys(i)はKeysの「引数i」ではなく、Keysが返す配列の「添字i」ということです。Keys(i)を使用したコードは都度配列を生成するため非常に遅くなります。
Dictionaryオブジェクトを使って、要素ごとのデータ数をカウントする方法を解説します。Excel上では、要素ごとのCOUNTIFや、ピボットテーブルで行う処理ですが、VBAの内部で行う場合は Dictionaryを使うと、簡単に書けて処理速度も高速です。
Dictionaryオブジェクトを使って、重複のないリストを作成する方法を解説します。リストを処理するコードは、Dictionaryを使うと簡潔で処理速度も高速になります。Dictionaryの入り口としてもいい題材なので、ぜひ覚えていってください。