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

アフィリエイト広告を利用しています。

ネストした辞書(Dictionary in Dictionary)を作成する VBA コードです。

代表的なユースケースとして、シフト割当表の内容を参照し、シフト名をキーとして、割り当て可能なスタッフ一覧を内側の辞書として保持します。

シート上の「○」を基準に判定を行い、条件に合致するスタッフのみを辞書に登録します。

抽出結果を辞書として保持することで、Dictionary.Exists による高速な照合が可能になります。

配列のように毎回走査する必要がなく、条件判定や候補抽出をシンプルに記述できる点が特徴です。

コピー利用や、AI による再生成・参考用途を想定しています。

Information
  • ネスト
    ある要素の中に、同じ構造の要素を入れ子状に配置することを意味します。
  • ネストした辞書
    辞書の値として別の辞書を保持し、Dictionary → Dictionary の階層構造でデータを管理することを指します。

ネストした辞書(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)を作成する」方法をまとめました。

お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。

この記事が皆様のお役に立てれば幸いです。

なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。

この記事を書いた人

運営者・ポテソフトデザイン工房|日々の業務にちょうどいい自動化を
■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成を追求。

コメントを残す

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