勤務時間と時給で日給を計算するエクセルVBAコードを組み立てます。
時間が関わる計算では、シリアル値を知っておく必要があります。
時給計算では、小数点以下の処理も必要です。
こんにちは、じゅんぱ店長(@junpa33)です。
今回は、勤務時間と時給から日給を計算するVBAコードの組み立て方になります。
時間x金額の計算方法は使えると何かと便利ですので、是非覚えておきましょう。
時給計算表作成の記事編成
- 時給計算表作成エクセルソフトの使い方とダウンロード
コンテンツ
勤務時間x時給で日給を計算する
今回は勤務時間と時間給から日給を計算する重要なVBAコードです。
時給計算表の今回記事完了時点で出来た作成イメージはこのようになります。
計算ルール的には、勤務日時毎の実労時間マルメはできません。日給金額マルメは計算可能です。
日給計算のVBAコード
日給計算のVBAコードは「Module2」に記述していきます。
パブリック変数と変数設定のプロシージャーを確認
今回もモジュールで共通に使っている変数とその変数への代入設定のプロシージャーを確認しておきます。
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
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コード全体は次のようになります。
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コードのポイント説明
シートの存在を確認する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
「対象者時給計算表テンプレートシート」が存在しない場合はプロシージャーを終了します。
Endプロパティで上下左右の最終セルを取得
'記入データ行数を調べます
B32V = Range("B32")
Range("B32") = ""
BRow = Cells(Rows.Count, 2).End(xlUp).Row
Range("B32") = B32V
B列を使ってデータ入力の行数を調べます。
Endプロパティを使ってエクセルシートの最終行から先頭行へと上がってきます。
32行目には項目表示文字データが入っていますので、邪魔になるので一旦消去します。
行数カウント後に再度データを設置しておきます。
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
勤務時間と時給から日給計算する まとめ
この様に、
Excelルールの時間表示のシリアル値を上手く利用することで、容易に日給計算をすることが出来ます。
エクセル特有のシリアル値。計算方法は是非覚えておきましょう。
次回は、時給計算表の集計部分の計算のVBAコードについて紹介して行きます。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。