勤務時間と時給から日給計算するVBAをつくる

vbajikyukeisaneyecatch005

勤務時間と時給で日給を計算するエクセルVBAコードを組み立てます。
時間が関わる計算では、シリアル値を知っておく必要があります。
時給計算では、小数点以下の処理も必要です。

こんにちは、じゅんぱ店長(@junpa33)です。

今回は、勤務時間と時給から日給を計算するVBAコードの組み立て方になります。

時間x金額の計算方法は使えると何かと便利ですので、是非覚えておきましょう。

時給計算表作成の記事編成

勤務時間x時給で日給を計算する

vbajikyuhyosikyukingakup002

今回は勤務時間と時間給から日給を計算する重要なVBAコードです。

時給計算表の今回記事完了時点で出来た作成イメージはこのようになります。

計算ルール的には、勤務日時毎の実労時間マルメはできません。日給金額マルメは計算可能です。

vbajikyuhyosikyukingakup001

日給計算のVBAコード

vbajikyuhyosikyukingakup003

日給計算のVBAコードは「Module2」に記述していきます。

パブリック変数と変数設定のプロシージャーを確認

今回もモジュールで共通に使っている変数とその変数への代入設定のプロシージャーを確認しておきます。

VBA
Option Explicit

    Public EmpName As String, 年月日 As String
    Public OriBName As String
    Public TCos, TwCos, TMal, KMal
    Public SD, ED As Variant
    Public KShH As Boolean
    Dim SaName As String, SaNamea As String
VBA
Sub 設定値代入()
    Dim MB As Long
        Worksheets("初期設定項目").Select
'会計期間をセット
        Range("D5", "F5").NumberFormatLocal = "dd"
STEP0:
        If Range("D5") = "" Then
            MsgBox "会計期間が未入力です。" & vbCrLf & "入力してください。" _
                        , vbExclamation, "時給計算表作成"
STOP1:
            On Error Resume Next
            SD = Application.InputBox("開始日を入力してください。", _
                        Title:="時給計算表作成", Type:=2)
            On Error GoTo 0
            If SD = False Then
                MsgBox "日付未入力ではテンプレート作成出来ません。", _
                            vbExclamation, "時給計算表作成"
                GoTo STOP1
            ElseIf SD = "" Then
                MsgBox "日付未入力ではテンプレート作成出来ません。", _
                            vbExclamation, "時給計算表作成"
                GoTo STOP1
            ElseIf SD < 1 Or SD > 31 Then
                MsgBox "異常値ではテンプレート作成出来ません。", _
                            vbExclamation, "時給計算表作成"
                GoTo STOP1
            Else
                With Worksheets("初期設定項目")
                    .Range("D5").Value = SD
                End With
            End If
        ElseIf Range("D5") < 1 Or Range("D5") > 31 Then
            MsgBox "異常値ではテンプレート作成出来ません。", _
                        vbExclamation, "時給計算表作成"
            Range("D5") = ""
            GoTo STEP0:
        Else
            With Worksheets("初期設定項目")
                .Range("D5").Value = SD
            End With
        End If
STEP2:
        If Range("F5") = "" Then
            MsgBox "会計期間が未入力です。" & vbCrLf & "入力してください。" _
                        , vbExclamation, "時給計算表作成"
STOP3:
            On Error Resume Next
            ED = Application.InputBox("開始日を入力してください。", _
                        Title:="時給計算表作成", Type:=2)
            On Error GoTo 0
            If ED = False Then
                MsgBox "日付未入力ではテンプレート作成出来ません。", _
                            vbExclamation, "時給計算表作成"
                GoTo STOP3
            ElseIf ED = "" Then
                MsgBox "日付未入力ではテンプレート作成出来ません。", _
                            vbExclamation, "時給計算表作成"
                GoTo STOP3
            ElseIf ED < 1 Or ED > 31 Then
                MsgBox "異常値ではテンプレート作成出来ません。", _
                            vbExclamation, "時給計算表作成"
                GoTo STOP3
            Else
                With Worksheets("初期設定項目")
                    .Range("F5").Value = ED
                End With
            End If
        ElseIf Range("F5") < 1 Or Range("F5") > 31 Then
            MsgBox "異常値ではテンプレート作成出来ません。", _
                        vbExclamation, "時給計算表作成"
            Range("F5") = ""
            GoTo STEP2:
        Else
            With Worksheets("初期設定項目")
                .Range("F5").Value = ED
            End With
        End If
        With Worksheets("初期設定項目")
            SD = .Range("D5").Value
            ED = .Range("F5").Value
        End With
'対象者名を変数に代入します
        EmpName = Worksheets("初期設定項目").Range("C6").Value
'基本時給をセット
        TCos = Worksheets("初期設定項目").Range("C7").Value
'時間外割増率をセット
        TwCos = Worksheets("初期設定項目").Range("F7").Value / 100
'時間マルメをセット
        TMal = Worksheets("初期設定項目").Range("C8").Value
'金額マルメをセット
        KMal = Worksheets("初期設定項目").Range("C9").Value
'計算シートの保存法を取得
        KShH = Worksheets("初期設定項目").Range("E10").Value
End Sub

これはすでにModule1で記述しているコードです。

今回も再度記述する必要はありません。

日給を計算するVBA全コード

日給を計算するVBAコード全体は次のようになります。

VBA
Sub 金額計算()
    Dim Sh As Worksheet
    Dim res As Boolean
    Dim i As Long
    Dim Va As Long, Vb As Long
    Dim Vaa As Long, Vbb As Long
    Dim B32V As String
        Call Module1.設定値代入
'時間外割増率が空欄の時100%とします
        If TwCos = "" Then TwCos = 100
'計算するシートが存在するかを調べる
        res = False
        For Each Sh In Worksheets
            If Sh.Name = EmpName & "時給計算表" Then
                res = True
                Worksheets(EmpName & "時給計算表").Select
                Exit For
            End If
        Next
'ない場合はプロシージャーを終了する
        If res = False Then
            MsgBox "まだ何も設定されていません。", _
                vbExclamation, "時給計算表作成"
            Exit Sub
        End If
        ThisWorkbook.Worksheets(EmpName & "時給計算表").Select
'記入データ行数を調べます
        B32V = Range("B32")
        Range("B32") = ""
        BRow = Cells(Rows.Count, 2).End(xlUp).Row
        Range("B32") = B32V
        For i = 3 To BRow
'初期値にリセットします
            Vaa = 0
            Vbb = 0
            Va = 0
            Vb = 0
'時間外時間が発生しているかどうかで区別します
            If Cells(i, 8) > 0 Then
                Vaa = Cells(i, 3) * 24 * TCos
'値を切り上げ(小数点を切り上げ)
                Va = WorksheetFunction.RoundUp(Vaa, 0)
                Vbb = Cells(i, 8) * 24 * TCos * TwCos
'値を切り上げ(小数点を切り上げ)
                Vb = WorksheetFunction.RoundUp(Vbb, 0)
            Else
                Vaa = Cells(i, 7) * 24 * TCos
'値を切り上げ(小数点を切り上げ)
                Va = WorksheetFunction.RoundUp(Vaa, 0)
            End If
'支給金額の表示します
            Cells(i, 9) = Va + Vb
'参考金額を表示します
            Cells(i, 10) = Va
            Cells(i, 11) = Vb
'金額マルメ計算
            If KMal = 1 Then
'1円以下を切り上げ
                Cells(i, 9) = WorksheetFunction.RoundUp(Cells(i, 9) _
                    / 10, 0) * 10
            ElseIf KMal = 2 Then
'10円以下を切り上げ
                Cells(i, 9) = WorksheetFunction.RoundUp(Cells(i, 9) _
                    / 100, 0) * 100
            ElseIf KMal = 3 Then
'100円以下を切り上げ
                Cells(i, 9) = WorksheetFunction.RoundUp(Cells(i, 9) _
                    / 1000, 0) * 1000
            Else
'切り上げしない
                Cells(i, 9) = Va + Vb
            End If
        Next i
End Sub

VBAコードのポイント説明

対象者時給計算表テンプレートシートの存在確認

sheetexistanceeyecatch シートの存在を確認する2種類のコードと実務での例題
'計算するシートが存在するかを調べる
        res = False
        For Each Sh In Worksheets
            If Sh.Name = EmpName & "時給計算表" Then
                res = True
                Worksheets(EmpName & "時給計算表").Select
                Exit For
            End If
        Next
'ない場合はプロシージャーを終了する
        If res = False Then
            MsgBox "まだ何も設定されていません。", _
                vbExclamation, "時給計算表作成"
            Exit Sub
        End If

「対象者時給計算表テンプレートシート」が存在しない場合はプロシージャーを終了します。

記入データ行数を調べます

vbaendpropertyeyecatch Endプロパティで上下左右の最終セルを取得
'記入データ行数を調べます
        B32V = Range("B32")
        Range("B32") = ""
        BRow = Cells(Rows.Count, 2).End(xlUp).Row
        Range("B32") = B32V

B列を使ってデータ入力の行数を調べます。

Endプロパティを使ってエクセルシートの最終行から先頭行へと上がってきます。

32行目には項目表示文字データが入っていますので、邪魔になるので一旦消去します。

行数カウント後に再度データを設置しておきます。

勤務時間から給与を計算する

vbaroundupdowneyecatch RoundUpとRoundDown関数の使い方。数値の切り方に注意

勤務データがある行数分で、実労時間と時給で日給を計算していきます。

実労時間には基準の勤務時間と時間外時間が含まれていますので、分けて計算することになります。

時間に金額を掛け算して日給を計算しますが、人力計算なら、例えば勤務時間7時間30分であれば、

7時間×830円+30分÷60分×830円で6,225円 と計算すると思います。

ところがExcelではそのようには計算しません。

時間計算のポイント

時給計算表で勤務時間「7:30」と表示されているのはExcel利用者が見て解るように表示しているだけです。(表示形式)

勤務時間「7:30」の本当のデータは勤務時間「0.3125」となっています。

これは、1日24時間を数値「1」として「24:00」中の「7:30」は数値「0.3125」であるという意味です。

これをシリアル値と言います。

そして逆にシリアル値に24を掛け算すれば、

「7:30」→「0.3125」(×24)→「7.5」時間となり、時給計算をするには非常に都合のいい数値になるのです。

つまり、「時間表示×24」は知っていると非常にトクになる計算です。

金額計算についての変数として、「Vaa」「Vbb」「Va」「Vb」を設定しています。

「Vaa」は基準時間に対して基本時給を掛け算して算出した金額です。このままでは、小数点以下のある金額となっています。

「Va」は小数点以下の部分を切り上げて金額(整数値)に直した金額になっています。

「Vbb」は「Vaa」同様ですが、時間外の割増率が加味されています。

「Vb」は「Vb」同様ですが、時間外の割増率が加味されています。

金額マルメの計算方法としては、

1円以下を切り上げの場合は「支給金額」を10で割って小数点を切り上げた後、その金額を10倍しています。

10円以下を切り上げの場合は「支給金額」を100で割って小数点を切り上げた後、その金額を100倍しています。

100円以下を切り上げの場合は「支給金額」を1000で割って小数点を切り上げた後、その金額を1000倍しています。

Round関数の引数で桁数を設定すれば、割ったり掛けたりする必要は無いのですが、”どういうマルメ”を行ったのかイメージし辛いので敢えてこのようにしています。(結果だけならどっちでもいいです。)

        For i = 3 To BRow
'初期値にリセットします
            Vaa = 0
            Vbb = 0
            Va = 0
            Vb = 0
'時間外時間が発生しているかどうかで区別します
            If Cells(i, 8) > 0 Then
                Vaa = Cells(i, 3) * 24 * TCos
'値を切り上げ(小数点を切り上げ)
                Va = WorksheetFunction.RoundUp(Vaa, 0)
                Vbb = Cells(i, 8) * 24 * TCos * TwCos
'値を切り上げ(小数点を切り上げ)
                Vb = WorksheetFunction.RoundUp(Vbb, 0)
            Else
                Vaa = Cells(i, 7) * 24 * TCos
'値を切り上げ(小数点を切り上げ)
                Va = WorksheetFunction.RoundUp(Vaa, 0)
            End If
'支給金額の表示します
            Cells(i, 9) = Va + Vb
'参考金額を表示します
            Cells(i, 10) = Va
            Cells(i, 11) = Vb
'金額マルメ計算
            If KMal = 1 Then
'1円以下を切り上げ
                Cells(i, 9) = WorksheetFunction.RoundUp(Cells(i, 9) _
                    / 10, 0) * 10
            ElseIf KMal = 2 Then
'10円以下を切り上げ
                Cells(i, 9) = WorksheetFunction.RoundUp(Cells(i, 9) _
                    / 100, 0) * 100
            ElseIf KMal = 3 Then
'100円以下を切り上げ
                Cells(i, 9) = WorksheetFunction.RoundUp(Cells(i, 9) _
                    / 1000, 0) * 1000
            Else
'切り上げしない
                Cells(i, 9) = Va + Vb
            End If
        Next i

勤務時間と時給から日給計算する まとめ

vbajikyuhyosikyukingakup004

この様に、

Excelルールの時間表示のシリアル値を上手く利用することで、容易に日給計算をすることが出来ます。

エクセル特有のシリアル値。計算方法は是非覚えておきましょう。

次回は、時給計算表の集計部分の計算のVBAコードについて紹介して行きます。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min