VBAで定時/残業の給与計算を自動化する【Excel関数みたいに使えて便利】

VBAのクラスモジュールを使って、定時/残業の給与計算を自動化するコードを紹介していきます。Excel関数みたいに使えるので、長いコードを書くのが嫌なあなたに。

・このコードが使えるようになると...

  • Excel関数みたいに使えて簡単
  • クラスモジュールを覚えられる
  • 社内で一目置かれる

Excelファイルのひな形ダウンロード

【Excelファイルのひな形をGitHubからダウンロード
そしたら、まずExcelのひな形をダウンロードしてこよう。

Excelファイルをダウンロード

【コピペOK】Excelにクラスモジュールを設定

そしたら、クラスモジュールを設定しようか。
クラスモジュールを追加することで、Excel関数みたいに使えるから必須の作業。

クラスモジュールの作りかたは【基礎】VBAで初めてのクラスモジュールを作ってみようで設定しよう。

設定したら、下記のコードをコピペすればOK。

Option Explicit

Const MAX_REGULAR_TIME As Date = "8:00"


Public Sub timeCalc(work_start_time As Date, work_end_time As Date, _
work_break_time As Date, writing_start_cells As Range)

    Dim time_calc As Date
    time_calc = work_end_time - work_break_time - work_start_time
    writing_start_cells = time_calc

End Sub


Public Sub regularWorkTime(total_work_time As Date, writing_start_cells As Range)
    
    Dim regular_work_time As Date
    
    If total_work_time < MAX_REGULAR_TIME Then
        regular_work_time = total_work_time
    Else
        regular_work_time = MAX_REGULAR_TIME
    End If
    
    writing_start_cells = regular_work_time

End Sub


Public Sub overtimeWork(total_work_time As Date, writing_start_cells As Range)
    
    Dim overtime As Date
    
    If total_work_time > MAX_REGULAR_TIME Then
        overtime = total_work_time - MAX_REGULAR_TIME
    Else
        overtime = 0
    End If
    
    writing_start_cells = overtime
    
End Sub


Public Sub salaryMoneyCalc(writing_start_cells As Range, regular_work_time As Date, _
regular_money_hour As Integer, over_work_time As Date, over_time_ratio As Double)

    Dim regular_money_calc As Long
    Dim over_time_money_calc As Long
    Dim total_money As Long
    Dim time_ajustment As Long
    time_ajustment = 24
    
    regular_money_calc = regular_work_time * time_ajustment * regular_money_hour
    over_time_money_calc = regular_money_hour * time_ajustment * over_time_ratio * over_work_time
    total_money = regular_money_calc + over_time_money_calc
    
    writing_start_cells = total_money
    
End Sub

ちなみにデータ型が時間だと給与計算ってちゃんとできないんだよね。

そこで『Public Sub salaryMoneyCalc』を使って給与計算がちゃんとできるように時間から数値に直してる。

時間→数値にするときは...

  • 『24』をかけてあげればOK
  • 1日は24時間だから
  • ためしに『8:00』に24をかけてみよう
  • 8になったら成功だよ

標準モジュール内のコードは10行でOK

標準モジュール内に書くコードは、実質10行でOK。
クラスモジュールを使うときはDimで宣言するときAsのあとに『New』がつくから注意ね。

重要なのは、10行目~13行目。
ここで、Excel関数みたいにパラメータを設定できるよ。

そしたら、このあとどうクラスモジュールを使うのか話していこうか。

Option Explicit


Public Sub SalaryCalc()

    Dim salary As New SalaryClass
    Dim i As Integer
    
    For i = 5 To 34
        salary.timeCalc Cells(i, 3), Cells(i, 4), Cells(2, 4), Cells(i, 5)
        salary.regularWorkTime Cells(i, 5), Cells(i, 6)
        salary.overtimeWork Cells(i, 5), Cells(i, 7)
        salary.salaryMoneyCalc Cells(i, 8), Cells(i, 6), Cells(2, 3), Cells(i, 7), 1.25
    Next i
    
End Sub

クラスモジュール【4つの使いかた】

ここから、クラスモジュールの使いかたを見ていこうか。
使いかたを覚えることで、どんなExcelファイルにも使えるようになるよ。

まずは、4つの使い道は下記。
このあとは4つの各パラメータについて話していこうか。

名前使うところ
timeCalcトータル勤務時間を計算
regularWorkTime定時時間を計算(デフォルトは MAX"8:00")
overtimeWork残業時間を計算
salaryMoneyCalc勤務時間から給与を計算

How to use #1-- timeCalc

timeCalc(work_start_time, work_end_time, work_break_time, writing_start_cells)

書きかた例)

timeCalc "8:00", "17:00", "0:45", Cells(2, 1)
timeCalc "8:00", "20:00", "1:00", Range("B1")
名前内容データ型
work_start_time勤務開始時間Date
work_end_time勤務終了時間Date
work_break_time休憩時間の合計Date
writing_start_cells表示したいセルRange

How to use #2-- regularWorkTime

regularWorkTime(total_work_time, writing_start_cells)

書きかた例)

regularWorkTime "8:00", Range("B1")
regularWorkTime "10:00", Cells(3, 2)
名前内容データ型
total_work_time勤務時間の合計Date
writing_start_cells表示したいセルRange

How to use #3-- overtimeWork

overtimeWork(total_work_time, writing_start_cells)

書きかた例)

overtimeWork "10:00", Range("C1")
overtimeWork "9:00", Cells(2, 3)
名前内容データ型
total_work_time勤務時間の合計Date
writing_start_cells表示したいセルRange

How to use #4-- salaryMoneyCalc

salaryMoneyCalc(writing_start_cells, regular_work_time, regular_money_hour, over_work_time, over_time_ratio)

書きかた例)

salaryMoneyCalc Cells(2, 2), "8:00", 1200, "2:00", 1.25
salaryMoneyCalc Range("C1"), "8:00", 2500, "3:00", 1.25
名前内容データ型
writing_start_cells表示したいセルRange
regular_work_time定時時間Date
regular_money_hour時給Integer
over_work_time残業時間Date
over_time_ratio残業の時給比率(デフォルトは "1.25")Double

クラスモジュールで定時・残業を簡単に自動化しよう

  • timeCalc・・・勤務時間の合計
  • regularWorkTime・・・定時時間の計算
  • overtimeWork・・・残業時間の計算
  • salaryMoneyCalc・・・給与計算

4つの使いかたを覚えて定時・残業の給与計算は簡単にできるようになろう。
クラスモジュールをコピペすれば、他のファイルでも使えるからぜひ使ってみて。

・もっとVBA学びたい人向け記事↓

あなた向け今まさに「きれいなコードを書かなくちゃ...」と考えているあなたへ。