EXCELで日数計算

はじめに
EXCEL関数で稼働日数を計算するものが有りますが、シート1枚でパッと見れたら良いよなぁと思いまして作ってみました。
ダウンロード
利用したいだけの方は、こちらからダウンロードしてご利用ください。
※ZIP圧縮されておりますので、適当なフォルダに解凍してください。
ちょこっと解説
祝日については、設定シートからダウンロードできるようになっております。
説明については、CSVファイルをダウンロードしてシートにセットするを参照ください。
Sheet1

A1セルに年を入力するとカレンダーが更新されます。土日祝日は条件付き書式で色づけされるようにしております。
「祝日セット」ボタンを押すと祝日と休日がセットされます。
右側に曜日別の集計など表示されます。
一番右側の平日と休日セルは、土日祝日が休日とした場合の日数になります。
VBA
Option Explicit
''' 祝日セット
Private Sub cmdSetHoliday_Click()
Dim nen As Integer
Dim tuki As Integer
Dim holiday() As String
Dim userHoliday() As String
Dim i As Integer
Dim d As Integer
Application.ScreenUpdating = False
nen = Me.Range("A1").Value
For tuki = 1 To 12
' 祝日取得
holiday = GetHoliday(nen, tuki)
' 休日取得
userHoliday = GetUserHoliday(tuki)
For i = 3 To 33
d = Me.Cells(2, i)
Me.Cells(tuki * 2 + 2, i).Value = ""
If holiday(d) <> "" Then
Me.Cells(tuki * 2 + 2, i).Value = "祝"
End If
If userHoliday(d) <> "" Then
Me.Cells(tuki * 2 + 2, i).Value = "祝"
End If
Next
Next tuki
Application.ScreenUpdating = True
MsgBox "祝日セット完了しました。", vbInformation
End Sub
''' 祝日取得
Private Function GetHoliday(y As Integer, m As Integer)
On Error GoTo Err_Handler
Dim i As Integer
Dim d(31) As String
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim xl_file As String
Dim sql As String
Dim curRow As Integer
Dim sYMD As Date
Dim eYMD As Date
'ツールメニューの参照設定'
' Microsoft ActiveX Data Objects 2.8 Library'
'チェック'
xl_file = ThisWorkbook.FullName '他のブックを指定しても良い'
Set cn = New ADODB.Connection
cn.Provider = "MSDASQL"
#If Win64 Then
' 64bit
cn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & "DBQ=" & xl_file & "; ReadOnly=False;"
#Else
' 32bit
cn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & "DBQ=" & xl_file & "; ReadOnly=False;"
#End If
cn.Open
Set rs = New ADODB.Recordset
sYMD = CDate(y & "/" & m & "/1")
eYMD = DateAdd("d", -1, DateAdd("m", 1, sYMD))
sql = "SELECT 国民の祝日・休日月日, 国民の祝日・休日名称 FROM [祝日$]" _
& " WHERE" _
& " 国民の祝日・休日月日 >= #" & sYMD & "# AND 国民の祝日・休日月日 <= #" & eYMD & "#"
rs.Open sql, cn, adOpenStatic
' 祝日配列初期化
For i = 1 To 31
d(i) = ""
Next i
Do While Not rs.EOF
d(Format(rs.Fields("国民の祝日・休日月日"), "d")) = rs.Fields("国民の祝日・休日名称")
rs.MoveNext
Loop
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
GetHoliday = d
Exit Function
Err_Handler:
MsgBox "祝日取得 : " & Err.Description, vbExclamation
On Error Resume Next
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Function
''' ユーザ休日取得
Private Function GetUserHoliday(m As Integer)
On Error GoTo Err_Handler
Dim i As Integer
Dim d(31) As String
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim xl_file As String
Dim sql As String
Dim curRow As Integer
Dim sYMD As Date
Dim eYMD As Date
'ツールメニューの参照設定'
' Microsoft ActiveX Data Objects 2.8 Library'
'チェック'
xl_file = ThisWorkbook.FullName '他のブックを指定しても良い'
Set cn = New ADODB.Connection
cn.Provider = "MSDASQL"
#If Win64 Then
' 64bit
cn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & "DBQ=" & xl_file & "; ReadOnly=False;"
#Else
' 32bit
cn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & "DBQ=" & xl_file & "; ReadOnly=False;"
#End If
cn.Open
Set rs = New ADODB.Recordset
sql = "SELECT 日, 休日名 FROM [休日$]" _
& " WHERE" _
& " 月 = " & m
rs.Open sql, cn, adOpenStatic
' 祝日配列初期化
For i = 1 To 31
d(i) = ""
Next i
Do While Not rs.EOF
d(rs!日) = rs!休日名
rs.MoveNext
Loop
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
GetUserHoliday = d
Exit Function
Err_Handler:
MsgBox "休日取得 : " & Err.Description, vbExclamation
On Error Resume Next
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Function
「祝日セット」ボタンを押すと、cmdSetHoliday_Click 部分が実行されます。
A1セルの年を取得して月の繰り返し(12回)で月を取得し日の繰り返し(31回)で”祝”文字を曜日の下に表示するようにします。
祝日、休日の取得は、SQLを利用しております。
詳しくは、EXCEL VBAでSQL文を使って集計するも参考にしてください。
祝日の取得は、該当する月の1日から末日までの範囲取得するSELECT文となっております。
休日の取得は、該当する月のデータを取得するSELECT文となっております。
最後に
特別難しいことをしておりませんが、いろいろなことを組み合わせておりますので参考にしていただけたら良いかと思います。
- EXCELでSQL
- 条件付き書式で曜日に色設定
- COUNTIFで曜日カウント
- 祝日をダウンロードしてシートにセットなど
