時給計算表で支給金額合計の計算方法です。日給合計とマルメ計算方法の紹介をいたします。時間マルメの方法は要チェックです。
これで、時給計算表の計算関係のコードは完了になります。
こんにちは、じゅんぱ店長(@junpa33)です。
今回は、支給金額決定のための日給の合計とマルメを計算するVBAコードの組み立て方になります。
時給計算表作成の記事編成
- 時給計算表作成エクセルソフトの使い方とダウンロード
コンテンツ
支給金額合計と時間・金額マルメ計算の表示例
今回の紹介内容は、時給計算表の合計欄の部分とマルメ表示部分になります。
赤枠表示の部分についてです。
日給金額を合計するVBAコード
はじめに、日給金額を合計するVBAコードを組み立てて行きます。
今回のエクセル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
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全コード
Sub 合計計算()
Dim Sh As Worksheet
Dim res As Boolean
Dim Vs As Long, Vss As Long
Dim Vt As Long, Vtt As Long
Call Module1.設定値代入
'計算するシートが存在するかを調べます
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
With ThisWorkbook.Worksheets(EmpName & "時給計算表")
'計算日数合計を表示します
.Range("B32") = "日数合計 " & BRow - 2 & "日"
'基準時間の合計時間を計算します
.Range("C32") = WorksheetFunction.Sum(Range("C3:C31"))
'休憩時間の合計時間を計算します
.Range("F32") = WorksheetFunction.Sum(Range("F3:F31"))
'実労時間の合計時間を計算します
.Range("G32") = WorksheetFunction.Sum(Range("G3:G31"))
'時間外時間の合計時間を計算します
.Range("H32") = WorksheetFunction.Sum(Range("H3:H31"))
'合計支給金額を計算します
.Range("I32") = WorksheetFunction.Sum(.Range("I3:I31"))
.Range("J32") = WorksheetFunction.Sum(.Range("J3:J31"))
.Range("K32") = WorksheetFunction.Sum(.Range("K3:K31"))
End With
End Sub
合計計算のVBA ポイント説明
部品化プロシージャーでCallステートメントは必須
先に説明したプロシージャーを呼び出し変数への代入値を取得します。
シートの存在を確認する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
「対象者時給計算表テンプレートシート」が存在しない場合はプロシージャーを終了します。
時間の合計計算をするには、ここでも「SUM関数」を利用します。
「SUM関数」についてはこちらの記事を参考にしてください。
SUM関数で合計計算!実務で使えるVBAコード作成マルメ計算のVBAコード
マルメ計算のコードを組み立てて行きます。
パブリック変数と代入プロシージャーの確認
先ほどと同様にこのコードを設置しておきます。
宣言セクションと設定値代入コードで、確認してください。
マルメ計算で作成するVBA全コード
Sub マルメ計算()
Dim Sh As Worksheet
Dim res As Boolean
Dim Vxa As Long, Vza As Long
Dim Vxb As Long, Vzb As Long
Dim LVM As Long
Call Module1.設定値代入
'時間外割増率が空欄の時100%とします
If TwCos = "" Then TwCos = 100
'時間マルメが空欄の時は0とします
If TMal = "" Then TMal = 0
'計算するシートが存在するかを調べます
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
'時間マルメ実労時間について
'--マルメを設定しているとき
If TMal <> 0 Then
'--マルメの「分」を計算
Vxa = WorksheetFunction.RoundUp(Minute(Range("G32")) _
/ TMal, 0) * TMal
'--実労分からの差分を計算
Vza = Vxa - Minute(Range("G32"))
'--マルメ時間を表示する
Range("G34") = DateAdd("n", Vza, Range("G32"))
'時間マルメ時間外時間について
'--マルメの「分」を計算
Vxb = WorksheetFunction.RoundUp(Minute(Range("H32")) _
/ TMal, 0) * TMal
'--時間外分からの差分を計算
Vzb = Vxb - Minute(Range("H32"))
'--マルメ時間を表示する
Range("H34") = DateAdd("n", Vzb, Range("H32"))
'--マルメを設定しないとき
Else
Range("G34") = Range("G32")
Range("H34") = Range("H32")
End If
'時間マルメまでの支給額合計を計算
LVM = Range("G34") * 24 * TCos + Range("H34") * 24 * _
TCos * TwCos
'金額マルメで支給金額を決定
'--切り上げしない
If KMal = 0 Or KMal = "" Then
Range("F34") = "マルメなし"
Range("I34") = LVM
'--1円以下を切り上げ
ElseIf KMal = 1 Then
Range("F34") = "10円単位"
'--1桁を小数点以下にする
Range("I34") = WorksheetFunction.RoundUp(LVM _
/ 10, 0) * 10
'--10円以下を切り上げ
ElseIf KMal = 2 Then
Range("F34") = "100円単位"
'--2桁を小数点以下にする
Range("I34") = WorksheetFunction.RoundUp(LVM _
/ 100, 0) * 100
'--100円以下を切り上げ
ElseIf KMal = 3 Then
Range("F34") = "1000円単位"
'--3桁を小数点以下にする
Range("I34") = WorksheetFunction.RoundUp(LVM _
/ 1000, 0) * 1000
Else
Range("F34") = "マルメなし"
Range("I34") = LVM
End If
End Sub
マルメ計算のVBA ポイント説明
時間マルメを行うにはちょっと工夫が必要になります。
始めに時間マルメで金額を出して、次に金額のマルメで最終支給価格を決定します。
- 変数「Vxa」実労時間マルメの「分」部分
- 変数「Vza」実労時間の「分」部分とマルメの「分」部分の差分
- 変数「Vxb」時間外時間マルメの「分」部分
- 変数「Vzb」時間外時間の「分」部分とマルメの「分」部分の差分
- 変数「LVM」時間マルメ支給額
マルメ設定をしているかどうかで条件分岐をします。
マルメ設定をしていないときは、実労時間合計が実労時間マルメに、時間外時間合計が時間外時間マルメにも表示されます。
金額マルメとは違って、時間マルメはRound関数だけでは行うことは出来ません。
例えば、30分マルメの場合、Round関数だけでは
23分であれば切り上げで30分のマルメになるが、16分でもマルメて30分にならないといけない。
時間マルメとは、「時」ではなく「分」をマルメることになります。
例えば15分マルメ設定で、20分であった場合お分かりのように30分で計算することになります。
これをどういう風にコードで表すかというと、
「20分を15分で割り余り分を切り上げる」するとこの場合整数値2となるのでマルメ設定の15分を掛けて30分と計算します。
Minute関数で「分」を取り出し、マルメ設定「分」で割り算し余りをRoundUp関数で切り上げた値を、マルメ設定「分」で掛け算します。
Vxa = WorksheetFunction.RoundUp(Minute(Range(“G32”)) / TMal, 0) * TMal
何分間、マルメ計算で増えたかを計算します。
Vza = Vxa – Minute(Range(“G32”))
実労時間にマルメ計算で増えた差分を加えます。
DateAdd関数で増加分を加えます。
Range(“G34”) = DateAdd(“n”, Vza, Range(“G32”))
同様に計算を行います。
Vxb = WorksheetFunction.RoundUp(Minute(Range(“H32”)) / TMal, 0) * TMal
同様に計算を行います。
Vzb = Vxb – Minute(Range(“H32”))
同様に計算を行います。
Range(“H34”) = DateAdd(“n”, Vzb, Range(“H32”))
LVM = Range(“C32”) * 24 * TCos + Range(“H34”) * 24 * TCos * TwCos
RoundUpとRoundDown関数の使い方。数値の切り方に注意
LVMを金額マルメします。
10円単位の時は、LVMを10で割って小数点を切り上げて10倍します。
100円単位の時は、LVMを100で割って小数点を切り上げて100倍します。
1000円単位の時は、LVMを1000で割って小数点を切り上げて1000倍します。
日給合計とマルメ計算方法のまとめ
先回の記事で紹介した日々の日給計算でも、金額マルメを行うコードを設定していますのでマルメ計算を行うことが出来ます。
計算テクニックとして、
会計期間中はマルメ設定をせずに給与計算を行い、
期間締め時にマルメ処理を行えば、通常計算による支給額とマルメ処理による支給額を比較することが出来ます。
ここの記事でのVBAコードの組み立ての中で、
特に時間マルメで、VBAコードをどのような形で組み立てるかがポイントになります。
マルメのVBA組み立て方法には他にもあると思いますので、ご自分バージョンを考えてみてはどうでしょうか。
次回は、月の会計期間締め後の時給計算表の保存方法についてです。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。