みなさん、こんにちは!
今回からExcelマクロで勤怠集計ツールを作成する際に使える
- ディクショナリ
- クラスモジュール
上記について解説します。
VBAのコードを書いていると、こんな悩みにぶつかることはありませんか?
「社員が増えるたびにコードを書き直している…」
「社員ごとに休憩時間や勤務パターンが違うのに、うまく管理できない…」
この記事では、実際に私が作った勤怠集計ツールを例にしながら、「なぜこの2つを組み合わせると便利なのか」を初学者の方にもわかるように解説します!
全体構造
先に全体図を示します。
全体構造はいたってシンプルです。
- マクロツール(ブック)に、「従業員一覧」シートを準備しておく
- 一覧に休憩時間や繰り上げルールなど必要な情報を記載しておく
- 従業員番号をディクショナリのキーにして、アイテムにクラスのプロパティやメソッドとして労働条件を格納する
- 結果、従業員番号キーに複数の労働条件を持たせることができる

'クラス名: Key従業員番号 = CLng(WS設定.Cells(R, "A").Value)というクラスモジュールを生成
Dicマスタ.Add Key従業員番号, New Classマスタ
Dicマスタ(Key従業員番号).cls休憩時間 = WS設定.Cells(R, CNo設定マスタ.休憩).Value
Dicマスタ(Key従業員番号).cls深夜休憩開始 = WS設定.Cells(R, CNo設定マスタ.深夜休憩_開始).Value ' 深夜休憩開始(新規追加)
Dicマスタ(Key従業員番号).cls深夜休憩終了 = WS設定.Cells(R, CNo設定マスタ.深夜休憩_終了).Value ' 深夜休憩終了(新規追加)
Dicマスタ(Key従業員番号).cls繰上 = Hour(WS設定.Cells(R, CNo設定マスタ.繰り上げルール).Value) * 60 + _
Minute(WS設定.Cells(R, CNo設定マスタ.繰り上げルール).Value)
そもそもディクショナリとは?
ディクショナリは「名前付きの引き出し」と考えてください。
普通の配列は番号(0, 1, 2…)で管理しますが、ディクショナリは好きな名前(キー)で管理できます。
Dim Dic As New Dictionary
Dic.Add "田中", 30 ' 「田中」というキーに 30 を格納
Dic.Add "鈴木", 45 ' 「鈴木」というキーに 45 を格納
MsgBox Dic("田中") ' → 30 と表示される
勤怠ツールでは社員番号をキーにしています。
Dic.Add 1001, ??? ' 社員番号1001番の情報を格納したい
ここで問題が出てきます。社員1人に対して、格納したいデータが1つではないのです。
1人の社員に管理したいデータが複数ある
例えば勤怠集計では、社員ごとに以下の情報が必要です。
| 項目 | 内容 |
|---|---|
| 休憩時間 | 固定休憩が1時間の人、45分の人など |
| 繰り上げルール | 出勤時刻を何分単位で繰り上げるか |
| 深夜休憩(開始) | 深夜帯に取る休憩の開始時刻 |
| 深夜休憩(終了) | 深夜帯に取る休憩の終了時刻 |
これらをバラバラの変数や配列で管理しようとすると、コードがすぐに複雑になってしまいます。
クラスモジュール
そこでクラスモジュールの出番です。
上記の記事にあるように、クラスモジュールは自作のオブジェクトです。
クラスモジュールを使うと、社員1人分のデータをひとまとめにした「社員カード」を作れます。
社員カード(Classマスタ)
├── 休憩時間
├── 繰上ルール
├── 深夜休憩(開始)
└── 深夜休憩(終了)
この「社員カード」をディクショナリのアイテムとして格納すれば、各社員番号に複数の情報を持たせることができます。
' 社員番号1001番の休憩時間を取得
Dicマスタ(1001).cls休憩時間
' 社員番号1001番の繰上ルールを取得
Dicマスタ(1001).cls繰上
とてもスッキリしましたよね。
勤怠ツールでの実際の流れ
改めて、今回の勤怠集計ツールでは、マクロ実行時に以下の流れでデータが処理されます。
①設定シートを読み込む※設定シート:社員情報が一覧化されたシート
↓
②社員番号をキーに「社員カード(Classマスタ)」を作成
↓
③ディクショナリに格納
↓
④勤怠計算時に社員番号で呼び出して使う
コードの核心部分はこちらです(後の記事で詳しく解説します)。
Dicマスタ.Add Key従業員番号, New Classマスタ
たったこの1行で、社員番号に紐づいた「空の社員カード」が作られます。
因みに上記の書き方はあまり見慣れないと思います。
上記の書き方はディクショナリのキーをそのままクラスオブジェクト変数として利用しています。
別の書き方をすると以下のようになります。
Dim Obj As Classマスタ
Set Obj = New Classマスタ
Dicマスタ.Add "1001", Obj
まとめ
| ディクショナリ単体 | ディクショナリ+クラス | |
|---|---|---|
| 1つのキーに格納できるデータ | 1種類のみ | 複数まとめて管理できる |
| 社員が増えたとき | コードの修正が必要になりがち | 設定シートに追加するだけ |
| 可読性 | △ | ○ |
次の記事では、実際にクラスモジュールの作り方を解説します。お楽しみに!





コメント