【入門編】【高度な日付演算】DateAdd / DateDiff / DatePart 関数を駆使した営業日計算と月末最終日の動的算出 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握する:営業日計算と月末算出の「極意」

こんにちは。システム自動化の最前線で、数多のレガシーコードと対峙してきたアーキテクトです。

VBScriptは、今や「古い言語」と揶揄されることもあります。しかし、Windows環境において、余計なランタイムを一切必要とせず、メモ帳一つでOSの深淵を叩けるこの言語は、業務自動化の現場において最強の武器であり続けています。

今日は、多くのエンジニアが躓く「日付演算」という壁を突破し、バッチ処理の精度を劇的に向上させるための知見を授けましょう。

1. なぜ「日付演算」が鬼門なのか?

VBScriptが扱う日付型(Date型)は、内部的には「倍精度浮動小数点数」です。整数部が経過日数、小数部が時刻を表しています。この性質を理解せずに `+1` とか `+7` といった単純加算だけでロジックを組むと、必ずどこかでバグを生みます。

特に「営業日計算」は、単なる数値処理ではなく、ビジネスロジックの根幹です。ここを掌握できれば、あなたの作るバッチは「動く」から「信頼できる」へ進化します。

2. 月末最終日を「動的」に導き出す魔法

「来月の1日を求めて、そこから1日引く」。これが、月末日を算出する際の黄金律です。`DateSerial` 関数の挙動を知れば、複雑なロジックは不要になります。

‘ 指定した年月の末日を取得する関数
Function GetLastDay(y, m)
‘ DateSerial(年, 月, 日) は、日が範囲外でも自動補正される
‘ 例えば翌月の0日を指定すると、当月の末日が返る
GetLastDay = DateSerial(y, m + 1, 0)
End Function

WScript.Echo “今月末日: ” & GetLastDay(Year(Date), Month(Date))

ここが重要: `DateSerial` は引数に「0」を渡すと、前月の末日を返すという仕様があります。この「言語仕様の隙間」を突くのが、アーキテクトの作法です。

3. 営業日判定:土日を排除するロジック

`Weekday` 関数を使い、曜日を数値で判定します。ここで避けるべきは、「if文のネスト」です。ロジックは極力フラットに保つのが、保守性を高める秘訣です。

‘ 日付が営業日(土日以外)か判定する関数
Function IsBusinessDay(d)
Dim w
w = Weekday(d)
‘ 日曜日(1) と 土曜日(7) を除外
If w = 1 Or w = 7 Then
IsBusinessDay = False
Else
IsBusinessDay = True
End If
End Function

4. 実戦投入:指定月内の「最終営業日」を特定する

これらを組み合わせると、月次バッチの要となる「締め処理日」の算出が可能になります。

‘ 指定年月の最終営業日を算出する
Function GetLastBusinessDay(y, m)
Dim d
d = GetLastDay(y, m)

‘ 土日なら1日ずつ遡る
Do While IsBusinessDay(d) = False
d = DateAdd(“d”, -1, d)
Loop

GetLastBusinessDay = d
End Function

WScript.Echo “今月の最終営業日: ” & GetLastBusinessDay(Year(Date), Month(Date))

5. 現場で陥りやすいエラーと対策

初心者がやりがちなミスを先回りして教えます。

  • 型変換の罠: `DateAdd` で計算した結果は必ず Date 型になりますが、ログ出力時に `&` で文字列連結する際は、`CStr()` や `FormatDateTime()` を明示的に使う癖をつけましょう。暗黙の型変換を信じてはいけません。
  • 祝日という「魔物」: 上記コードは土日のみの判定です。日本の祝日は毎年変動するため、祝日リストをテキストファイルやDBに持ち、`InStr` や辞書オブジェクト(`Scripting.Dictionary`)で照合するのがプロの流儀です。

まとめ:自動化の先にあるもの

日付計算を制することは、時間の流れをコードの中に閉じ込めることです。

今回紹介した `DateAdd`、`DateDiff`、`DatePart` は、単なる関数ではありません。これらは業務の「カレンダー」をプログラムに教え込むためのツールです。

まずはこのコードをコピーし、ご自身の環境で動かしてみてください。そして、土日だけでなく「祝日対応」を組み込むという次のステップへ進んでください。そうすれば、あなたはもう「マクロの記録」からは卒業し、真の自動化エンジニアへの道を歩み始めているはずです。

何か詰まったら、いつでも聞いてください。コードは裏切りませんよ。

タイトルとURLをコピーしました