【Excel VBA 再利用コード集】ネストした辞書(Dictionary in Dictionary)を作成する

ネストした辞書(Dictionary in Dictionary)を作成する VBA コードです。
代表的なユースケースとして、シフト割当表の内容を参照し、シフト名をキーとして、割り当て可能なスタッフ一覧を内側の辞書として保持します。
シート上の「○」を基準に判定を行い、条件に合致するスタッフのみを辞書に登録します。
抽出結果を辞書として保持することで、Dictionary.Exists による高速な照合が可能になります。
配列のように毎回走査する必要がなく、条件判定や候補抽出をシンプルに記述できる点が特徴です。
コピー利用や、AI による再生成・参考用途を想定しています。
ネストした辞書(Dictionary in Dictionary)を作成するコード
コード
- DebugPrintShiftWariateDic は、CreateShiftWariateDic で作成した辞書の中身を表示するためのプロシージャです。
- CreateShiftWariateDic が、ネストした辞書を作成する関数です。
Option Explicit
Public Sub DebugPrintShiftWariateDic()
' シフト→可スタッフ辞書を作成(辞書が取得できなかった場合は終了)
Dim staff_shift_kahi_dic As Scripting.Dictionary
Set staff_shift_kahi_dic = CreateShiftWariateDic()
If staff_shift_kahi_dic Is Nothing Then Exit Sub
' 辞書の中身を確認(Debug.Print)
'--------------------------------------------------------------------------
' すべてのシフト名(外側辞書のkey)を走査
Dim shift_name As Variant
For Each shift_name In staff_shift_kahi_dic.Keys
Debug.Print shift_name
' 対象シフト名の中の全スタッフ名(内側辞書のkey)を走査
Dim staff_name As Variant
For Each staff_name In staff_shift_kahi_dic(shift_name).Keys
' スタッフ名を出力
Debug.Print " "; staff_name
Next staff_name
Next shift_name
End Sub
Public Function CreateShiftWariateDic() As Scripting.Dictionary
' Description
' シフト割当表シートを参照し、シフト名→可(〇)スタッフ辞書を作成して返す。
' 外側辞書:Key=シフト名、value=内側辞書(可スタッフ辞書)
'
' Arguments
' (None)
'
' Returns
' Dictionary
' key : shift_name (String)
' value : Dictionary
' key : staff_name (String)
' value : True (Boolean)
'
' References
' Microsoft Scripting Runtime
' シートの取得
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("シフト割当表")
' シートの対象範囲を配列として取得
Dim staff_shift_kahi_tbl As Variant ' 配列
staff_shift_kahi_tbl = ws.UsedRange.Value
' 固定仕様(シフト割当表)
Const STAFF_NAME_COL As Long = 1 ' 氏名列
Const SHIFT_START_COL As Long = 2 ' シフト開始列(B列)
Const HEADER_ROW As Long = 1 ' ヘッダ行
Const DATA_START_ROW As Long = 2 ' データ開始行
' ガード(空配列)
If IsEmpty(staff_shift_kahi_tbl) Then
Set CreateShiftWariateDic = Nothing
Exit Function
End If
' 外側辞書:シフト名 → 可スタッフ辞書 の対応を保持する辞書
Dim staff_shift_kahi_dic As Scripting.Dictionary
Set staff_shift_kahi_dic = New Scripting.Dictionary
' 外側辞書に内側辞書を登録
'--------------------------------------------------------------------------
' 配列を列方向に走査
Dim shift_col As Long
For shift_col = SHIFT_START_COL To UBound(staff_shift_kahi_tbl, 2)
' シフト名を取得(空欄はスキップ)
Dim shift_name As String
shift_name = Trim$(CStr(staff_shift_kahi_tbl(HEADER_ROW, shift_col)))
If Len(shift_name) = 0 Then GoTo NextShiftCol
' 外側辞書に「シフト名」が未登録の場合
If Not staff_shift_kahi_dic.Exists(shift_name) Then
' 内側辞書(可スタッフ辞書)を新規作成
Dim assignable_staff_dic As Scripting.Dictionary
Set assignable_staff_dic = New Scripting.Dictionary
' 「シフト名」をキー、「可スタッフ辞書」をバリューとして外側辞書に登録
staff_shift_kahi_dic.Add shift_name, assignable_staff_dic
End If
' 内側辞書にスタッフを登録
'----------------------------------------------------------------------
' 配列を行方向を走査
Dim staff_row As Long
For staff_row = DATA_START_ROW To UBound(staff_shift_kahi_tbl, 1)
' スタッフ名を取得(空欄は対象外)
Dim staff_name As String
staff_name = Trim$(CStr(staff_shift_kahi_tbl(staff_row, STAFF_NAME_COL)))
If Len(staff_name) = 0 Then GoTo NextStaffRow
' クロスポイントの値を取得(○がなければ対象外)
Dim cell_val As String
cell_val = Trim$(CStr(staff_shift_kahi_tbl(staff_row, shift_col)))
If InStr(1, cell_val, "○", vbTextCompare) = 0 Then GoTo NextStaffRow
' 内側辞書に未登録の場合、スタッフ名を追加
If Not staff_shift_kahi_dic(shift_name).Exists(staff_name) Then
staff_shift_kahi_dic(shift_name).Add staff_name, True
End If
NextStaffRow:
Next staff_row
NextShiftCol:
Next shift_col
' シフト割当表辞書を返す
Set CreateShiftWariateDic = staff_shift_kahi_dic
End Function
使いかた
任意の VBA アプリケーションに組み込んで使用する想定です。
コード実行結果
以下のシートを例にとります。

このシートに対してコードを実行すると、以下のような結果が返ります。


以上で解説は終わりです。
VBAスキルアップの参考情報
近年は、ChatGPTをはじめとするAIの登場によって、学習のスタイルが大きく変わりました。
分からないことがあれば、AIに尋ねれば答えがすぐに見つかる時代です。
とはいえ、AIを使いこなすには、自分自身の基本的な知識や理解力が欠かせません。
全体像をつかむためには、やはり書籍などで体系的に学んでおくことが今でも有効です。
そのうえでAIを活用すれば、自分の理解度に合わせた的確な解説や、応用のヒントを得ることができます。
「学んで基礎を築く → AIで補い発展させる」──このサイクルを重ねることで、VBAスキルは着実に高まっていくでしょう。
VBAのスキルアップ
VBAを学び始めるなら
入門書は、どれを選んでも大きな差はないように感じます。
どれを選ぶかに悩むことに時間をかけるよりも、まずは手頃な一冊を手に取って進めてみるのがおすすめです。
もし迷ったときには、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
基礎を超えて力をつけたいなら
私は上級者を目指していましたので、入門書にとどまらず、このような内容の濃い一冊を選んで学んでいました。
今は誰でもAIを活用できる時代になりましたが、上級者を目指す方にとっては、AIをより上手に活用するという意味でも、こうした本は今なお価値があります。
このレベルの本を一冊持っておくことに、損はないでしょう。
資格で能力を証明したいなら
VBAのプログラミング能力を客観的に示したい場合には「VBAエキスパート試験」があります。
特に「スタンダード」の方は上級者向けです。
あなたが社内業務の改善を行う立場であっても、VBAで作成したシステムをお客様に納める立場であっても、この資格は信頼や安心につながるでしょう。
以下の公式テキストが販売されています。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。
これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
今はAIにコードを尋ねれば、答えが返ってくる時代です。
しかし、この本からは「コード」以上に、プログラミングに向き合う姿勢や考え方を学ぶことができるでしょう。
こちらの記事でも紹介しています。もしよろしければご覧ください。
【初心者歓迎】無料相談受付中

いつもありがとうございます!
限られた時間をより良く使い、日本の生産性を高めたい──
みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。
お気軽にご相談ください。
こちらの記事でも紹介しております。
おわりに


ご覧いただきありがとうございました!
この記事では、「ネストした辞書(Dictionary in Dictionary)を作成する」方法をまとめました。
お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。
この記事が皆様のお役に立てれば幸いです。
なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。
この記事を書いた人
- ソフトデザイン工房|日々の業務にちょうどいい自動化を
- ■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成を追求。
最新の投稿
01|Excel VBA マクロ2026年2月8日【Excel VBA 再利用コード集】ネストした辞書(Dictionary in Dictionary)を作成する
01|Excel VBA マクロ2026年2月7日【Excel VBA 開発用コード集】Excelにオリジナルのリボンを追加する方法
01|Excel VBA マクロ2026年2月6日【Excel VBA 再利用コード集】シートのデータを配列に格納する&取得した配列のサイズを確認(Debug.Print)する
01|Excel VBA マクロ2026年1月13日【Excel VBA 開発用コード集】VBAモジュールをテキスト形式で出力する

