エクセルVBAで作る時給計算表の第6回目です。
今回は合計支給金額の計算方法です。日給合計とマルメ計算方法の紹介をいたします。
これで、時給計算表の計算関係のコードは完了になります。
エクセルVBAで作る時給計算表の作成の記事6回目です。
今回は、支給金額決定のための日給の合計とマルメを計算するVBAコードの組み立て方になります。
こんにちは、じゅんぱ店長(@junpa33)です。
時給計算に関連する記事の一覧
無料DL!時給計算表エクセルソフト 個人別ブックで管理出来ます。
の記事で行うことが出来ます。
コンテンツ
合計支給金額決定のための日給合計とマルメ計算
今回の紹介内容は、時給計算表の合計欄の部分とマルメ表示部分になります。
赤枠表示の部分についてです。
日給合計のVBAコードを組み立てる
はじめに、日給合計の部分のVBAコードを組み立てて行きます。
今回のエクセルVBAコードは「module2」に記述していきます。
その前にパブリック変数とその代入プロシージャーを確認
その前に、
今から組み立てるプロシージャーに対しても最初に、このVBAコードを入れておきます。
Option Explicit
Public EmpName As String, 年月日 As String
Public OriBName As String
Public TCos, TwCos, TMal, KMal
Public SD As Date, ED As Date
Dim SaName As String, SaNamea As String
Sub 設定値代入() Dim MB As Long Worksheets("初期設定項目").Select 'Format,Year,Month関数を利用します 年月日 = Format(Date, "yymmdd") '会計期間をセット SD = Worksheets("初期設定項目").Range("D5").Value ED = Worksheets("初期設定項目").Range("F5").Value '対象者名を変数に代入します EmpName = Worksheets("初期設定項目").Range("C6").Value If EmpName = "" Then EmpName = 年月日 Range("C6") = 年月日 End If '基本時給をセット TCos = Worksheets("初期設定項目").Range("C7").Value '時間外割増率をセット TwCos = Worksheets("初期設定項目").Range("F7").Value / 100 '時間マルメをセット TMal = Worksheets("初期設定項目").Range("C8").Value '金額マルメをセット KMal = Worksheets("初期設定項目").Range("C9").Value End Sub
これはすでにModule1で記述しているコードです。
今回も再度記述する必要はありません。
合計計算で作成するVBAコード
時間の合計計算をするには、ここでも「SUM関数」を利用します。
「SUM関数」についてはこちらの記事を参考にしてください。
「Callステートメント」についてはこちらの記事を参考にしてください。
「If条件文」についてはこちらの記事を参考にしてください。
「If条件文」のVBAコードの組み方。条件の絞り方を最速に理解。
「メッセージボックス」についてはこちらの記事を参考にしてください。
「RoundUp、RoundDown関数」についてはこちらの記事を参考にしてください。
RoundUpとRoundDown関数の使い方。数値の切り方に注意が必要です
コード作成のチェックポイントは
- 時間外割増と時間マルメの指定が空欄の時の処理
- 時給計算表が存在するかどうかを調べる
- 日給計算日数の表示
- 基準時間の合計時間の計算
- 休憩時間の合計時間の計算
- 実労時間の合計時間の計算
- 時間外時間の合計時間の計算
- 合計支給金額の計算
になります。
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.設定値代入 '時間外割増率が空欄の時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 "まだ何も設定されていません。" Exit Sub End If '計算日数合計を表示します 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")) '合計支給金額を計算します '--------時間外時間が発生しているかどうかで区別します If Range("H32") > 0 Then '--------基準時間合計に24と時給を乗じます Vss = Range("C32") * 24 * TCos '---------値を切り上げ(小数点を切り上げ) Vs = WorksheetFunction.RoundUp(Vss, 0) '--------基準時間合計に24と時給と割増率を乗じます Vtt = Range("H32") * 24 * TCos * TwCos '---------値を切り上げ(小数点を切り上げ) Vt = WorksheetFunction.RoundUp(Vtt, 0) Else Vss = Range("G32") * TCos '---------値を切り上げ(小数点を切り上げ) Vs = WorksheetFunction.RoundUp(Vss, 0) End If Range("I32") = Vs + Vt '参考金額を表示します Range("J32") = Vs Range("K32") = Vt End Sub
時間外割増と時間マルメの指定が空欄の時の処理
時間外割増変数「TwCos」が空欄時のエラー回避のため強制的に「割増なし」
時間マルメ変数「TMal」が空欄時のエラー回避のため強制的に「マルメなし」
に、設定します。
時給計算表が存在するかどうかを調べる
VBAコードの基本的なエラー「インデックスが有効範囲にありません」を防止するためのコードを組み込みます。
日給計算日数の表示
B列のデータ記入行数を数えます。
基準時間の合計時間の計算
「 WorksheetFunction.Sum」関数でC列のセル範囲の合計を計算します。
休憩時間の合計時間の計算
「 WorksheetFunction.Sum」関数でF列のセル範囲の合計を計算します。
実労時間の合計時間の計算
「 WorksheetFunction.Sum」関数でG列のセル範囲の合計を計算します。
時間外時間の合計時間の計算
「 WorksheetFunction.Sum」関数でH列のセル範囲の合計を計算します。
合計支給金額の計算
考え方を分かりやすくするため、時間外時間が発生しているかどうかで条件分岐を行います。
先回紹介した「シリアル値」の考え方を使って計算を行います。
勤務時間と時給金額で日給を計算するVBAコードを作成。時給の計算その5
チェック
- 変数「Vss」小数点以下を含む規定金額
- 変数「Vs」小数点以下を繰り上げた規定金額
- 変数「Vtt」小数点以下を含む時間外時間金額
- 変数「Vt」小数点以下を繰り上げた時間外時間金額
マルメ計算の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 "まだ何も設定されていません。" 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("C32") * 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
チェック
- 変数「Vxa」実労時間マルメの「分」部分
- 変数「Vza」実労時間の「分」部分とマルメの「分」部分の差分
- 変数「Vxb」時間外時間マルメの「分」部分
- 変数「Vzb」時間外時間の「分」部分とマルメの「分」部分の差分
- 変数「LVM」時間マルメ支給額
時間マルメ実労時間について
マルメ設定をしているかどうかで条件分岐をします。
マルメ設定をしていないときは、実労時間合計が実労時間マルメに、時間外時間合計が時間外時間マルメにも表示されます。
実労分マルメの「分」を計算
時間マルメとは、「時」ではなく「分」をマルメることになります。
例えば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
金額マルメで支給金額を決定
LVMを金額マルメします。
10円単位の時は、LVMを10で割って小数点を切り上げて10倍します。
100円単位の時は、LVMを100で割って小数点を切り上げて100倍します。
1000円単位の時は、LVMを1000で割って小数点を切り上げて1000倍します。
日給合計とマルメ計算方法のまとめ
先回の記事で紹介した日々の日給計算でも、金額マルメを行うコードを設定していますのでマルメ計算を行うことが出来ます。
計算テクニックとして、
会計期間中はマルメ設定をせずに給与計算を行い、
期間締め時にマルメ処理を行えば、通常計算による支給額とマルメ処理による支給額を比較することが出来ます。
ここの記事でのVBAコードの組み立ての中で、
特に時間マルメで、VBAコードをどのような形で組み立てるかがポイントになります。
マルメのVBA組み立て方法には他にもあると思いますので、ご自分バージョンを考えてみてはどうでしょうか。
次回は、月の会計期間締め後の時給計算表の保存方法についてです。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です
このサイトでよく使うVBAのコードのトピックを纏めています。
今回の記事はここまでです。 最後までご覧いただき有難うございました。









