導入:なぜVBAで「WORKDAY関数」を扱うのか?
実務において、プロジェクトの進捗管理や納期計算は避けて通れない業務です。Excelの標準機能である「WORKDAY関数」を使えば、土日や祝日を除いた営業日ベースでのスケジュール算出が可能です。しかし、手作業で数式を埋め込む場合、行数が増えるたびに数式をコピーしたり、祭日リストの参照範囲を固定(絶対参照)したりする手間が発生します。VBAでこれを制御すれば、ボタン一つでスケジュール表を再生成し、工数変更にも即座に対応できる「動的な業務ツール」へ進化させることができます。
基礎知識:WORKDAY関数の仕組み
WORKDAY関数は、指定した開始日から「指定した日数」だけ経過した後の、営業日を算出する関数です。
構文:WORKDAY(開始日, 日数, [祭日])
・開始日:起算日を指定します。
・日数:営業日数を指定します(プラスなら未来、マイナスなら過去)。
・祭日:土日以外の「休日(祝日など)」のリストを範囲指定します。
VBAから利用する場合、ワークシート関数として呼び出すことで、この強力な計算ロジックをマクロ内に組み込むことができます。
実装/解決策:VBAでWORKDAY関数を呼び出す
VBAでワークシート関数を使うには「WorksheetFunction」オブジェクトを利用します。これにより、セルに数式を入力するだけでなく、計算結果の値だけをセルに格納することも可能です。
サンプルプログラム:営業日計算マクロ
以下のコードは、指定した開始日から工数分を加算し、祝日リストを考慮して終了日を算出するサンプルです。
Sub CalculateSchedule()
Dim ws As Worksheet
Dim startDay As Date
Dim workDays As Integer
Dim holidayRange As Range
Set ws = ThisWorkbook.Sheets(“作業スケジュール”)
‘ 祝日リストの範囲(例:勤務時間シートのA13:A36)
Set holidayRange = ThisWorkbook.Sheets(“勤務時間”).Range(“A13:A36”)
‘ 例:E4セルを開始日、D4セルを工数とする
startDay = ws.Range(“E4”).Value
workDays = ws.Range(“D4”).Value
‘ WORKDAY関数をVBAから呼び出し
‘ 注意:WORKDAY関数の仕様上、開始日を含めて工数を計算する場合は「工数 – 1」とするのが実務の定石です
ws.Range(“F4”).Value = Application.WorksheetFunction.WorkDay(startDay, workDays – 1, holidayRange)
MsgBox “スケジュールを算出しました。”
End Sub
応用・注意点:現場で陥りやすいバグの回避策
1. 開始日を含むか否かの判定:
WORKDAY関数は「開始日」の翌日から計算を開始します。そのため、作業開始日そのものを日数に含めたい場合は、上記のコードのように「日数 – 1」という調整が必要です。ここを間違えると納期が1日ずれる原因になります。
2. 祝日リストの管理:
祝日リスト(祭日)が空白だったり、範囲外を参照したりするとエラーになります。特に、リスト範囲の最終行が変わるような運用がある場合は、「名前の定義」を使って範囲を可変にするか、VBA側で最終行を動的に取得する工夫をおすすめします。
3. エラーハンドリング:
万が一、祭日リストに不正な値が含まれていた場合のために、「On Error Resume Next」等で制御するか、事前にデータが日付形式であることをチェックするロジックを入れておくと、より堅牢なツールになります。
VBAを活用して計算を自動化し、ミスを減らして生産性を高めていきましょう!
