この記事では、ExcelVBAを利用して「指定した年月の月間勤務表」をボタン1つ押すだけで作成する方法について説明しています。
日毎の開始時刻、終了時刻、休憩時間を入力すると、日毎の勤務時間が計算されます。
日々の勤務表を入力することにより、勤務日数や勤務時間合計が計算されます。
毎月手作業で作成した勤務表を年月を指定するだけで、一瞬で作成できるようになります。
それでは、指定した年月の月間勤務表を作成する機能を作っていきましょう。
困っている女性
困っている女性
解決する男性
解決する男性
困っている女性
もくじ
指定した年月の月間勤務表を作成する機能の概要図
以下は、指定した年月の月間勤務表を作成する機能の概要図です。
年と月を指定すると、指定された年月の月間勤務表が作成されます。
機能的にはシンプルですが、手作業で作成するとなると、少し面倒くさい作業となります。
それを、VBAを利用することにより、ボタン1つだけで作成することができるようになります。
◆似たような機能については、以下の記事を参照してください。
【EXCEL:VBA】指定した年月の予定表を作成したい【EXCEL:VBA】何日後・何日前の日付を求めたい
指定した年月の月間勤務表を作成する機能を、1つ1つ順番に説明していきます。
VBAで月間勤務表を作成する機能を作成する
今回は、メインシートすら必要ありません。
VBAプログラムを入力するだけで、必要な機能を作成できます。
開発タブの「Visual Basic」をクリックして、「Microsoft Visual Basic for Applications」を起動します。
「Microsoft Visual Basic for Applications」にVBAプログラムを入力します。
標準モジュールを追加して、以下のソースを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
Public Sub Main_Proc() Dim sht As Worksheet Dim nen As Integer Dim tuki As Integer Dim startday As Date Dim endday As Date Dim countday As Integer Dim i As Integer '1.年の指定ダイアログを表示する nen = InputBox("年を指定してください。", "年指定", year(Now)) '2.月の指定ダイアログを表示する tuki = InputBox("月を指定してください。", "月指定", month(Now)) '3.新しいシートを追加する ThisWorkbook.Sheets.Add After:=Sheets(ThisWorkbook.Sheets.Count) '4.対象シートを変数に格納する Set sht = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) '5.対象シートの名前を指定された年月に変更する sht.Name = nen & Format(tuki, "00") '6.シート全体を上下中央揃えにする sht.Cells.VerticalAlignment = xlCenter '7.シート全体を左右中央揃えにする sht.Cells.HorizontalAlignment = xlCenter '8.太字を設定する sht.Range("A1:F1").Font.Bold = True sht.Range("A3:F3").Font.Bold = True '9.各ラベルを設定する sht.Range("A1") = "勤務表" sht.Range("B1") = "年" sht.Range("C1") = "月" sht.Range("D1") = "勤務日数" sht.Range("E1") = "勤務時間計" sht.Range("F1") = "氏名" sht.Range("B3") = "開始時刻" sht.Range("C3") = "終了時刻" sht.Range("D3") = "休憩時間" sht.Range("E3") = "勤務時間" sht.Range("F3") = "備考" '10.セルを結合する sht.Range("A1:A3").Merge '11.年と月を設定する sht.Range("B2") = nen sht.Range("C2") = tuki '12.月末日を取得する startday = DateSerial(nen, tuki, 1) endday = DateAdd("d", -1, DateAdd("m", 1, startday)) '13.日数を計算する countday = DateDiff("d", startday, endday) For i = 0 To countday '14.1日から月末日を設定する sht.Cells(4 + i, 1) = DateAdd("d", i, startday) '15.日にちの表示形式を設定する sht.Cells(4 + i, 1).NumberFormatLocal = "d""日""(aaa)" Next '16.時刻の表示形式を設定する sht.Cells(2, 5).NumberFormat = "[h]:mm" sht.Range(sht.Cells(4, 2), sht.Cells(4 + countday, 5)).NumberFormat = "hh:mm" '17.勤務日数の計算式を設定する sht.Range("D2") = "=COUNTA(C4:C" & 4 + countday & ")" '18.勤務時間計の計算式を設定する sht.Range("E2") = "=SUM(E4:E" & 4 + countday & ")" '19.勤務時間の計算式を設定する For i = 0 To countday sht.Cells(4 + i, 5) = "=C" & 4 + i & "-B" & 4 + i & "-D" & 4 + i Next '20.罫線を設定する With sht.Range(sht.Cells(1, 1), sht.Cells(4 + countday, 6)) .Borders.LineStyle = True .Borders.Color = -1003520 End With '21.塗りつぶしの色を設定する sht.Range("A1:C1").Interior.Color = 16772300 sht.Range("A3:D3").Interior.Color = 16772300 sht.Range("D1:F1").Interior.Color = 13434828 sht.Range("E3:F3").Interior.Color = 13434828 sht.Range("D2:E2").Interior.Color = 13434879 sht.Range(sht.Cells(4, 5), sht.Cells(4 + countday, 5)).Interior.Color = 13434879 '22.列幅を設定する sht.Columns("A:E").ColumnWidth = 11 sht.Columns("F:F").ColumnWidth = 25 sht.Range("B4").Select MsgBox "完了" End Sub |
次に、EXCELを「◯◯◯.xlsm」というような感じでマクロ有効ブック形式で保存します。
年月を指定して月間勤務表を作成する機能の使い方
それでは、作成したい年月の月間勤務表を作成する方法を説明します。
「開発」タブの「マクロ」をクリックします。
先程作成したVBAプログラム「Main_Proc」が一覧に表示されていますので、選択します。
次に、「実行」ボタンをクリックします。
次に、年を指定するダイアログが表示されます。
デフォルトで現在の年が表示されますので、変更したい場合は好きな月を入力します。
そして、OKボタンをクリックします。
次に、月を指定するダイアログが表示されます。
デフォルトで現在の月が表示されますので、変更したい場合は好きな月を入力します。
そして、OKボタンをクリックします。
しばらく待つと、指定年月のシートが追加され、月間勤務表が作成されます。
今回は、2021年2月を指定しています。
月間勤務表には、2021年2月の1日から月末日の28日までが縦に並び、各日にちの曜日も表示されます。
あとは毎日、開始時刻と終了時刻、休憩時間を入力していくだけです。
なにかメモして置きたいことは、備考欄に入力しておきます。
指定した年月の月間勤務表を作成するVBAプログラム(Main_Proc)の説明
それでは、指定した年月の月間勤務表を作成するVBAプログラム(Main_Proc)を説明します。
1.年の指定ダイアログを表示する
1 2 |
'1.年の指定ダイアログを表示する nen = InputBox("年を指定してください。", "年指定", year(Now)) |
ダイアログにはデフォルトで、現在の年を表示させています。
入力された年を変数「nen」に格納するようにしています。
2.月の指定ダイアログを表示する
1 2 |
'2.月の指定ダイアログを表示する tuki = InputBox("月を指定してください。", "月指定", month(Now)) |
ダイアログにはデフォルトで、現在の月を表示されています。
入力された月を変数「tuki」に格納するようにしています。
3.新しいシートを追加する
1 2 |
'3.新しいシートを追加する ThisWorkbook.Sheets.Add After:=Sheets(ThisWorkbook.Sheets.Count) |
例えば、シートが3つ存在している場合、左から3つ目のシートの右に新しいシートを追加します。
4.対象シートを変数に格納する
1 2 |
'4.対象シートを変数に格納する Set sht = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) |
この後の処理で何度もこのシートを利用するので、変数に格納しています。
5.対象シートの名前を指定された年月に変更する
1 2 |
'5.対象シートの名前を指定された年月に変更する sht.Name = nen & Format(tuki, "00") |
変更するシート名は、ダイアログで指定された年月を設定します。
月が1月~9月の場合、1桁になるのでFormat関数を利用して2桁表示に加工しています。
例えば、1月の”01”に加工されます。
6.シート全体を上下中央揃えにする
1 2 |
'6.シート全体を上下中央揃えにする sht.Cells.VerticalAlignment = xlCenter |
7.シート全体を左右中央揃えにする
1 2 |
'7.シート全体を左右中央揃えにする sht.Cells.HorizontalAlignment = xlCenter |
8.太字を設定する
1 2 3 |
'8.太字を設定する sht.Range("A1:F1").Font.Bold = True sht.Range("A3:F3").Font.Bold = True |
この後の処理で表示するラベルの文字を設定します。
ラベルは例えば、勤務表や年、月などです。
9.各ラベルを設定する
1 2 3 4 5 6 7 8 9 10 11 12 13 |
'9.各ラベルを設定する sht.Range("A1") = "勤務表" sht.Range("B1") = "年" sht.Range("C1") = "月" sht.Range("D1") = "勤務日数" sht.Range("E1") = "勤務時間計" sht.Range("F1") = "氏名" sht.Range("B3") = "開始時刻" sht.Range("C3") = "終了時刻" sht.Range("D3") = "休憩時間" sht.Range("E3") = "勤務時間" sht.Range("F3") = "備考" |
例えば、A1セルには”勤務表”、B3セルには”開始時刻”を設定します。
10.セルを結合する
1 2 |
'10.セルを結合する sht.Range("A1:A3").Merge |
11.年と月を設定する
1 2 3 |
'11.年と月を設定する sht.Range("B2") = nen sht.Range("C2") = tuki |
12.月末日を取得する
1 2 3 |
'12.月末日を取得する startday = DateSerial(nen, tuki, 1) endday = DateAdd("d", -1, DateAdd("m", 1, startday)) |
具体的には、指定された年月の1日の1ヶ月後の1日前を算出することにより、指定年月の月末日を算出します。
例えば、2021年2月を指定した場合、2021年2月1日の1ヶ月後にあたる2021年3月1日を算出します。
次に、2021年3月1日の1日前にあたる2021年2月28日を算出します。
13.日数を計算する
1 2 |
'13.日数を計算する countday = DateDiff("d", startday, endday) |
正確に言うと、指定年月の1日から月末日までの日数差を計算しています。
例えば、2021年2月なら、2月1日から2月28日の日数差27を算出しています。
2月1日を0行目とした時に、2月28日は何行下になるかを知りたいからです。
14.1日から月末日を設定する
1 2 |
'14.1日から月末日を設定する sht.Cells(4 + i, 1) = DateAdd("d", i, startday) |
15.日にちの表示形式を設定する
1 2 |
'15.日にちの表示形式を設定する sht.Cells(4 + i, 1).NumberFormatLocal = "d""日""(aaa)" |
例えば、2021年2月1日なら、”1日(月)”のように日にちと曜日が表示されるようにしています。
16.時刻の表示形式を設定する
1 2 3 |
'16.時刻の表示形式を設定する sht.Cells(2, 5).NumberFormat = "[h]:mm" sht.Range(sht.Cells(4, 2), sht.Cells(4 + countday, 5)).NumberFormat = "hh:mm" |
2行5列目にあたる「勤務時間計」には、24時間を超えて表示させたいので、”[h]:mm”を設定しています。
次に、1日から月末日の勤務時間を表示させる5列目には、”hh:mm”を設定しています。
17.勤務日数の計算式を設定する
1 2 |
'17.勤務日数の計算式を設定する sht.Range("D2") = "=COUNTA(C4:C" & 4 + countday & ")" |
1日から月末日までの各行のC列(終了時刻)が入力されているセル数を計算しています。
終了時刻が未入力の日は、出勤していない日としています。
18.勤務時間計の計算式を設定する
1 2 |
'18.勤務時間計の計算式を設定する sht.Range("E2") = "=SUM(E4:E" & 4 + countday & ")" |
1日から月末日までの各行のE列(勤務時間)を合計しています。
19.勤務時間の計算式を設定する
1 2 3 4 |
'19.勤務時間の計算式を設定する For i = 0 To countday sht.Cells(4 + i, 5) = "=C" & 4 + i & "-B" & 4 + i & "-D" & 4 + i Next |
具体的には、終了時刻から開始時刻および休憩時間をマイナスしています。
20.罫線を設定する
1 2 3 4 5 |
'20.罫線を設定する With sht.Range(sht.Cells(1, 1), sht.Cells(4 + countday, 6)) .Borders.LineStyle = True .Borders.Color = -1003520 End With |
A1セルからF列の最終行までを対象に罫線を設定します。
21.塗りつぶしの色を設定する
1 2 3 4 5 6 7 8 9 |
'21.塗りつぶしの色を設定する sht.Range("A1:C1").Interior.Color = 16772300 sht.Range("A3:D3").Interior.Color = 16772300 sht.Range("D1:F1").Interior.Color = 13434828 sht.Range("E3:F3").Interior.Color = 13434828 sht.Range("D2:E2").Interior.Color = 13434879 sht.Range(sht.Cells(4, 5), sht.Cells(4 + countday, 5)).Interior.Color = 13434879 |
1行目から3行目およびE列に対して、塗りつぶしの色を設定します。
22.列幅を設定する
1 2 3 |
'22.列幅を設定する sht.Columns("A:E").ColumnWidth = 11 sht.Columns("F:F").ColumnWidth = 25 |
A列からF列に対して、列幅を設定します。
ということで、指定した年月の月間勤務表を作成する機能を利用できるようになりました。
それでは、毎月作成する必要がある勤務表をサクッと作成して、自分の勤務状況を記録していきましょう。
もっと重要な作業に集中して、こういった定型的な作業は、VBAを利用して効率化していきましょう。
以上です。
最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。