エクセルマクロ・VBA達人養成塾 小川です。
受講生村瀬正昭さんからいただいた添削依頼の内容を、ブログ上で添削しています。
テーマは、就業時間内、時間外、深夜割増での賃金を計算するマクロです。
この記事は、以下のシリーズの第6回です。
第1回: 給与計算ソフトは結構市販されていますが、融通が利かない場合も – Excelマクロ・VBA
第2回: 添削事例 – 給与計算をするマクロ(その2) – Excelマクロ・VBA
第3回: 範囲を指定してデータを一括クリアする – 給与計算をするマクロ(その3) – Excelマクロ・VBA
第4回: 就業時間内、時間外、深夜割増での賃金を計算する(その4) – Excelマクロ・VBA
第5回: 就業時間内、時間外、深夜割増での合計労働時間を一発で計算する(その5) – Excelマクロ・VBA
今日は、いただいたマクロの、以下の部分を添削。
Monthly_Totaltm
Dim d1 As Long
Dim h1 As Long
Dim m1 As Long
Dim d2 As Long
Dim h2 As Long
Dim m2 As Long
Dim d3 As Long
Dim h3 As Long
Dim m3 As Long
Dim Tt As Double
Dim Tt2 As Double
Dim Tt3 As Double
Tt = Range(“E35”).Value
Tt2 = Range(“F35”).Value
Tt3 = Range(“G35”).Value
d1 = Int(Tt) ‘就業時間合計が24時間超になるごとに1が加算される。
h1 = Hour(Tt) ‘就業時間合計を24で割った余りを示す。
m1 = Minute(Tt) ‘就業時間合計のうち、分単位のものを示す。
d2 = Int(Tt2) ‘就業時間合計が24時間超になるごとに1が加算される。
h2 = Hour(Tt2) ‘就業時間合計を24で割った余りを示す。
m2 = Minute(Tt2) ‘就業時間合計のうち、分単位のものを示す。
d3 = Int(Tt3) ‘就業時間合計が24時間超になるごとに1が加算される。
h3 = Hour(Tt3) ‘就業時間合計を24で割った余りを示す。
m3 = Minute(Tt3) ‘就業時間合計のうち、分単位のものを示す。
Range(“E36”).Value = Range(“E3”).Value * d1 * 24 + Range(“E3”).Value * h1 + Range(“E3”).Value * m1 / 60
Range(“F36”).Value = Range(“F3”).Value * d2 * 24 + Range(“F3”).Value * h2 + Range(“F3”).Value * m2 / 60
Range(“G36”).Value = Range(“G3”).Value * d3 * 24 + Range(“G3”).Value * h3 + Range(“G3”).Value * m3 / 60
With Range(“E37”)
.Value = Range(“E35”).Value + Range(“F35”).Value
.NumberFormatLocal = “[h]:mm”
End With
With Range(“E38”)
.Value = Range(“E36”).Value + Range(“F36”).Value + Range(“G36”).Value
.NumberFormatLocal = “#,##0_);[赤](#,##0)”
End With
End Sub
Monthly_Totaltm は呼び出されているマクロ。前回のブログで解説しました。
..ということで。
h1, m1, h2, m2, h3, m3 に値を入れるところを修正。
Monthly_Totaltm
Dim d1 As Long ‘[*1]
Dim h1 As Long
Dim m1 As Long
Dim d2 As Long
Dim h2 As Long
Dim m2 As Long
Dim d3 As Long
Dim h3 As Long
Dim m3 As Long
Dim Tt As Double
Dim Tt2 As Double
Dim Tt3 As Double
Tt = Range(“E35”).Value
Tt2 = Range(“F35”).Value
Tt3 = Range(“G35”).Value
d1 = Int(Tt) ‘就業時間合計が24時間超になるごとに1が加算される。
h1 = Hour(Tt) ‘就業時間合計を24で割った余りを示す。
m1 = Minute(Tt) ‘就業時間合計のうち、分単位のものを示す。
d2 = Int(Tt2) ‘就業時間合計が24時間超になるごとに1が加算される。
h2 = Hour(Tt2) ‘就業時間合計を24で割った余りを示す。
m2 = Minute(Tt2) ‘就業時間合計のうち、分単位のものを示す。
d3 = Int(Tt3) ‘就業時間合計が24時間超になるごとに1が加算される。
h3 = Hour(Tt3) ‘就業時間合計を24で割った余りを示す。
m3 = Minute(Tt3) ‘就業時間合計のうち、分単位のものを示す。
Range(“E36”).Value = Range(“E3”).Value * d1 * 24 + Range(“E3”).Value * h1 + Range(“E3”).Value * m1 / 60
Range(“F36”).Value = Range(“F3”).Value * d2 * 24 + Range(“F3”).Value * h2 + Range(“F3”).Value * m2 / 60
Range(“G36”).Value = Range(“G3”).Value * d3 * 24 + Range(“G3”).Value * h3 + Range(“G3”).Value * m3 / 60 ‘[*2]
With Range(“E37”)
.Value = Range(“E35”).Value + Range(“F35”).Value
.NumberFormatLocal = “[h]:mm”
End With
With Range(“E38”)
.Value = Range(“E36”).Value + Range(“F36”).Value + Range(“G36”).Value
.NumberFormatLocal = “#,##0_);[赤](#,##0)”
End With
End Sub
で、[*1] ~ [*2] では、結局のところ、
○セルE35に入った時間を元にしてセルE36に金額を入れる
○セルF35に入った時間を元にしてセルF36に金額を入れる
○セルG35に入った時間を元にしてセルG36に金額を入れる
という単純作業しかしていないので。
僕なら、ここは、こう書き換える。
27行かけていたところが、3行で済んだ ヾ(´ー`)ノ
解説すると…。
まず、前提として知っておいて欲しいことは、VBAでは、小数点つきの数値で日付を管理している、ということ。
以下、深いことをちゃんと書こうと思うと大変なので、ざっくりとした説明。
以下のお話は、何を言っているのか、なんとなく分かればよいです。
例えば、以下のマクロを実行してみる。
イミディエイトウィンドウには、以下のように出力される。
12:00:00
0.5
つまり、同じ 0.5 という値を投入しようとしても、
入れる相手の変数が日付型だと、入るのは、「12:00:00」という値。
次に、以下を実行してみる。
CDate関数は、任意の値を日付型のデータに変換する関数。
これも、結果として、「12:00:00」という値を出力する。
今度は、逆に、CDbl関数を使って、日付型のデータを小数で表現してみよう。
以下のマクロを実行すると、「0.5」という値が出力される。
ここから分かるとおり、日付としての12:00:00と小数の0.5は、同値のようなもの。
ということで。
例えば、セルE35に「24:00:00」という値が入っていたとする。
時給\3,000-の人を想定して、その人の労働報酬を計算するなら、
ということ。
最後に、「 * 24 」としていることに注目。
Range(“E35”) の値が、「24:00:00」であれば、それは、小数として扱うなら、「1」と同じですね。
なんで、時給単価とのかけ算を行うなら、24倍しなくてはです。
もっとも、上記のマクロは、本当は以下のように書いたほうが丁寧。
ということで、さらにつづき。
[3-1], [3-2] も、セルの書式関係。
Time_Clearcontents の中に納めてしまおう。以下の要領。
ついでに、今気がついたのだが、セルE36~G36も、セルE38と書式を統一したほうがよいな。
ということで、
Time_Clearcontents は、以下のように変更。
Monthly_total_salary も、最終的に、以下のようになる。
ということで。
今回は、36行あったマクロが、7行になりました。
(※上記のコードでは6行だが、Time_Clearcontents で一行増えたので、そこまで考慮すると7行)
次回は、全体の流れを整理してみます。
この記事は、以下のシリーズの第6回です。
第1回: 給与計算ソフトは結構市販されていますが、融通が利かない場合も – Excelマクロ・VBA
第2回: 添削事例 – 給与計算をするマクロ(その2) – Excelマクロ・VBA
第3回: 範囲を指定してデータを一括クリアする – 給与計算をするマクロ(その3) – Excelマクロ・VBA
第4回: 就業時間内、時間外、深夜割増での賃金を計算する(その4) – Excelマクロ・VBA
第5回: 就業時間内、時間外、深夜割増での合計労働時間を一発で計算する(その5) – Excelマクロ・VBA
お知らせ:
「親指シフト達人養成塾」 (あと1名)
「エクセルデータ分析7つの上級技」 (キャンセル待ち)
「エクセルデータ分析7つの上級技」、うかうかしていたら、定員オーバーになっていました。
現状、キャンセル待ちです。最新の情報はリンク先のページで記載していますので、ご確認ください。
●無料PDFレポート「誰もが知っているWindowsの、誰も知らない12の技」
http://www.exvba.com/freereport/index.php
●法人研修のお問い合わせはこちら
https://sv86.wadax.ne.jp/~exvba-com/closed/toiawase_houjin.php
●ジーザス小川の個人サイト「こねこねのさいと」へはこちらから
http://www.exvba.com/