合計支給金額決定のための日給合計とマルメ計算のVBAコード。時給の計算その6

vbajikyukeisaneyecatch006

エクセルVBAで作る時給計算表の第6回目です。

今回は合計支給金額の計算方法です。日給合計とマルメ計算方法の紹介をいたします。

これで、時給計算表の計算関係のコードは完了になります。

エクセルVBAで作る時給計算表の作成の記事6回目です。

今回は、支給金額決定のための日給の合計とマルメを計算するVBAコードの組み立て方になります。

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

 

時給計算に関連する記事の一覧

「時給計算表作成」の記事一覧を開く

 

無料ソフトダウンロード
この時給計算表エクセルソフトの無料のダウンロードは、

vbajikyukeisaneyecatch010無料DL!時給計算表エクセルソフト 個人別ブックで管理出来ます。

の記事で行うことが出来ます。

 

合計支給金額決定のための日給合計とマルメ計算

 

今回の紹介内容は、時給計算表の合計欄の部分とマルメ表示部分になります。

赤枠表示の部分についてです。

vbajikyuhyoupho039
vbajikyuhyoupho040

 

 

日給合計の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関数」についてはこちらの記事を参考にしてください。

vbasumeyecatchSUM関数で合計計算!実務で使えるVBAコード作成

「Callステートメント」についてはこちらの記事を参考にしてください。

vbacalleyecatchエクセルVBA基礎知識 部品化プロシージャーでCallステートメントは必須

 

合計計算の全VBAコード

コード作成のチェックポイントは

  1. 時間外割増と時間マルメの指定が空欄の時の処理
  2. 時給計算表が存在するかどうかを調べる
  3. 日給計算日数の表示
  4. 基準時間の合計時間の計算
  5. 休憩時間の合計時間の計算
  6. 実労時間の合計時間の計算
  7. 時間外時間の合計時間の計算
  8. 合計支給金額の計算

になります。

合計計算のコード
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コードの基本的なエラー「インデックスが有効範囲にありません」を防止するためのコードを組み込みます。

 

MEMO

「For Each~Next」の使い方についてはこちらの記事を参考にしてください。

vbadoloopeyecatchVBA 回数不定のループ処理はDo LoopとFor Each

 

日給計算日数の表示

B列のデータ記入行数を数えます。

基準時間の合計時間の計算

「 WorksheetFunction.Sum」関数でC列のセル範囲の合計を計算します。

休憩時間の合計時間の計算

「 WorksheetFunction.Sum」関数でF列のセル範囲の合計を計算します。

実労時間の合計時間の計算

「 WorksheetFunction.Sum」関数でG列のセル範囲の合計を計算します。

時間外時間の合計時間の計算

「 WorksheetFunction.Sum」関数でH列のセル範囲の合計を計算します。

合計支給金額の計算

考え方を分かりやすくするため、時間外時間が発生しているかどうかで条件分岐を行います。

先回紹介した「シリアル値」の考え方を使って計算を行います。

vbajikyukeisaneyecatch005勤務時間と時給金額で日給を計算するVBAコードを作成。時給の計算その5

 

チェック

  • 変数「Vss」小数点以下を含む規定金額
  • 変数「Vs」小数点以下を繰り上げた規定金額
  • 変数「Vtt」小数点以下を含む時間外時間金額
  • 変数「Vt」小数点以下を繰り上げた時間外時間金額

 

 

マルメ計算のVBAコードを組み立てる

 

マルメ計算のコードを組み立てて行きます。

 

パブリック変数と代入プロシージャーの確認

 

先ほどと同様にこのコードを設置しておきます。

宣言セクションと設定値代入コードで、確認してください。

 

マルメ計算で作成するVBAコード

 

時間マルメを行うにはちょっと工夫が必要になります。

始めに時間マルメで金額を出して、次に金額のマルメで最終支給価格を決定します。

マルメ計算の全VBAコード

ここでのチェックポイントです

  1. 時間マルメ実労時間について
  2. 実労分マルメの「分」を計算
  3. 実労分からの差分を計算
  4. 実労分マルメ時間を表示する
  5. 時間外分マルメの「分」を計算
  6. 時間外分からの差分を計算
  7. 時間外分マルメ時間を表示する
  8. 時間マルメまでの支給額合計を計算
  9. 金額マルメで支給金額を決定

 

マルメ計算のコード

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組み立て方法には他にもあると思いますので、ご自分バージョンを考えてみてはどうでしょうか。

 

次回は、月の会計期間締め後の時給計算表の保存方法についてです。

 

vbastudyeyecatch002 エクセルVBAを独学で習得する!ために大切な7つのポイントを解説します

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

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

 

このサイトでよく使うVBAのコードのトピックを纏めています。

「エクセルVBA最速理解」の記事一覧を開く

 

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

 

 

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