【VBA備忘録】給料日が土日祝のとき前日を取得する(会社カレンダー)

2024年10月10日

給料日って土日祝日のとき前倒される会社がほとんどだと思います。(私が在籍する会社は後ろ倒しですが笑)
でもそうすると経理の方は会社カレンダーに入力したりしないといけなかったりして毎年面倒ですよね~
面倒なことはVBAで解決するとみんなハッピー、今回はダウンロードするだけで使える給料日カレンダーのエクセルデータもついてます。

データダウンロード

ここからダウンロードして、データの内容を見ながら下記を読んでいただけるとわかりやすいと思われます!

給料日を指定して一覧を作る

A1セルに対象年を入力、B3セルに給料日を入力し毎月の給料日を算出し、カレンダーに反映できるブックを作成します。
カレンダーは会社用に使える様、土曜出勤日などにも対応できるようになっています。

下準備①:祝日を指定する

祝日シートを作成し、祝日を入力しておきます。
こちらは銀行が休みの平日を探るために入力します。
給料日が土日及びこのシートにのっている日だった場合前日になるように設定されています。
祝日ネットさんからコピーしてくるとらくちんです。

下準備②:土日で出勤する日を入力

カレンダーの土日は条件付き書式で色がつくようになっていますが、土日に出勤日があれば色がつかないよう設定できます。

取得ボタンを押し給料日を取得するとカレンダーに反映する

給料日取得シートのボタンを押すと給料日が算出され、カレンダーに反映されます。
条件付き書式によって土日祝日は水色、給料日は黄色がつきます。

VBAの内容

取得ボタンにはVBAで作った給料日が取得できるプログラムをが登録されています。
B6~B16のセルには

=DATE($A$1,ROW(A1),$B$3)
A1セル(対象年)年 〇月(行数月) B3セル(給料日)

という1年分の給料日を返すように関数が入っています。
例えばA1が2024年/10日が給料日なら2024年1月10日、2024年2月10日…と入っています。
※給料日が最終日の場合もあるため実際には最終日だったらというIF文も追加してあります。
VBAではB5~B16セルに入っている日にちが土日祝かどうか判断し、
平日であればその日を、土日祝なら前日を入力するというプログラムを作成しました。

'配列の添え字の最小値を1に指定
Option Base 1

Sub 給料日はいつかいな()

'===============================================
'ワークシート
Dim this As Worksheet, syukuzitu As Worksheet
Set this = ActiveSheet
Set syukuzitu = Worksheets("祝日")

'祝日リスト
Dim list As Range
Set list = syukuzitu.ListObjects(1).ListColumns(1).DataBodyRange


'出力用配列
Dim box(12, 1)
'===============================================

'B5~B16までループ
For i = 1 To 12

'給料日
dt = this.Cells(4 + i, 2)

'曜日確認(日曜)
If Weekday(dt) = 1 Then
    dt = dt - 2
'曜日確認(土曜)
ElseIf Weekday(dt) = 7 Then
    dt = dt - 1
End If

'祝日かどうか調べる
    For j = 1 To 5
  '祝日シートにdtはあるか
    If WorksheetFunction.CountIf(list, dt) <> 0 Then
  'ある場合
        If Weekday(dt) = 2 Then
            dt = dt - 3
        Else
            dt = dt - 1
        End If
    End If
    Next j

box(i, 1) = dt
Next i


this.Range("C5:C16") = box
End Sub

↑のプログラムを取得ボタンに登録し、実行するとC5~C16にそれぞれの月の給料日が入力されます。
カレンダーシートを見るとC5~C16に入力された日付に黄色がついているはずです。