3日がかりのその仕事、3分で終わらせる方法教えます!
パソコンスキルの心技体

就業時間内、時間外、深夜割増での合計労働時間を一発で計算する – Excelマクロ・VBA

2012年1月27日
  • このエントリーをはてなブックマークに追加
  • follow us in feedly

エクセルマクロ・VBA達人養成塾 小川です。

キューバ旅行記、その92です。

ハバナからトロント行きの飛行機に乗ります。
ということで、ハバナの空港にて。

エクセルマクロ達人養成塾塾長ブログ-空港内のキオスク。簡素。

空港内のキオスク。簡素。

エクセルマクロ達人養成塾塾長ブログ-イミグレーションを通過したところ

イミグレーションを通過したところ

エクセルマクロ達人養成塾塾長ブログ-ということで、飛行機に乗り込んで

ということで、飛行機に乗り込んで

エクセルマクロ達人養成塾塾長ブログ-あとは、空を飛ぶばかり。

あとは、空を飛ぶばかり。

エクセルマクロ達人養成塾塾長ブログ-ハバナを離れていきます

ハバナを離れていきます。いやー、すげー楽しかった ヾ(´ー`)ノ

そうそう。このブログを読んでいる人中でどのくらいの方がキューバに行かれるのかはよく分かりませんが。
ひとつ、注意。

キューバ土産として知られているもののひとつに、チェ・ゲバラの印刷された人民ペソ貨幣と硬貨があります。

これなんですが。

空港の、イミグレーション通貨前にある両替屋で「両替してくれ」と言うと、「イミグレーションを通過したあとの両替屋にもあるから」と言われましたが。

ダメでした(泣

あと、兌換ペソから日本円への両替も、イミグレーションを入ったあとは、できませんでした。

要注意です。
(2011年9月中旬現在の情報ですが)

ということで、このブログのキューバ旅行記は、明日くらいに地味に終わります ヾ(´ー`)ノ

塾長のキューバ旅行記、最初から読みたい方はこちらから


就業時間内、時間外、深夜割増での合計労働時間を一発で計算するマクロ(その5) – Excelマクロ・VBA

受講生村瀬正昭さんからいただいた添削依頼の内容を、ブログ上で添削しています。

テーマは、就業時間内、時間外、深夜割増での賃金を計算するマクロです。

第1回: 給与計算ソフトは結構市販されていますが、融通が利かない場合も – Excelマクロ・VBA

第2回: 添削事例 – 給与計算をするマクロ(その2) – Excelマクロ・VBA

第3回: 範囲を指定してデータを一括クリアする – 給与計算をするマクロ(その3) – Excelマクロ・VBA

第4回: 就業時間内、時間外、深夜割増での賃金を計算する(その4) – Excelマクロ・VBA

今日は、いただいたマクロの、以下の部分を添削。

Sub Monthly_Totaltm()

    Tm_enter
    
    Dim t As Date
    Dim t2 As Date
    Dim t3 As Date
    Dim cnt As Long
    Dim cMax As Long
        cMax = Range(“B65536”).End(xlUp).Row
    
    For cnt = 4 To cMax
        t = t + Range(“E” & cnt).Value
        t2 = t2 + Range(“F” & cnt).Value
        t3 = t3 + Range(“G” & cnt).Value
    Next
    
    With Range(“E35”)
        .Value = t
        .NumberFormatLocal = “[h]:mm”
    End With
    
    With Range(“F35”)
        .Value = t2
        .NumberFormatLocal = “[h]:mm”
    End With
    
    With Range(“G35”)
        .Value = t3
        .NumberFormatLocal = “[h]:mm”
    End With
    
End Sub

Tm_enter は呼び出されているマクロ。前回のブログで解説しました。

..ということで。

ここでも、まずはインデントをそろえたい。

以下の[1]では、左に一段移動させています。
(あと、便宜上、間の改行を取りました。)

Sub Monthly_Totaltm_ogawa1()
    Tm_enter
    Dim t As Date
    Dim t2 As Date
    Dim t3 As Date
    Dim cnt As Long
    Dim cMax As Long
    cMax = Range(“B65536”).End(xlUp).Row ‘[1]
    For cnt = 4 To cMax
        t = t + Range(“E” & cnt).Value
        t2 = t2 + Range(“F” & cnt).Value
        t3 = t3 + Range(“G” & cnt).Value
    Next
    With Range(“E35”)
        .Value = t
        .NumberFormatLocal = “[h]:mm”
    End With
    With Range(“F35”)
        .Value = t2
        .NumberFormatLocal = “[h]:mm”
    End With
    With Range(“G35”)
        .Value = t3
        .NumberFormatLocal = “[h]:mm”
    End With
End Sub

どうしてこういう整え方をするのか等、詳しい解説は今回はしません。セミナーで説明します。

で、次に、変数について考えたい。

    Dim t As Date
    Dim t2 As Date
    Dim t3 As Date

こういう変数のネーミングは、3つくらいまでならまあそれでも分かるのだが。
人間の記憶には「マジカルナンバーセブン」と呼ばれる限界があり、7つ~8つと増えてくると、取り違いや混同が起こる。

そのへんのことについては、僕が英語学習法についてかつて書いた本「英語嫌いの東大卒が教える私の英語学習法」をご参照。

ということで。

今回は添削ということもあるので、この3つに、別の名前をつけてみたい。

前回、E列、F列、G列のセルを指すときに、以下の定数を作った。

    Const I_KANNAI As Integer = 3
    Const I_KANGAI As Integer = 4
    Const I_SHINYA As Integer = 5

今回も、同様のネーミングにしよう。
ネーミングに統一感があるほうが、何かとコーディングも楽。

Sub Monthly_Totaltm_ogawa2()
    Tm_enter
    Dim tNai As Date
    Dim tGai As Date
    Dim tSny As Date
    Dim cnt As Long
    Dim cMax As Long
    cMax = Range(“B65536”).End(xlUp).Row
    For cnt = 4 To cMax
        tNai = tNai + Range(“E” & cnt).Value
        tGai = tGai + Range(“F” & cnt).Value
        tSny = tSny + Range(“G” & cnt).Value
    Next
    With Range(“E35”)
        .Value = tNai
        .NumberFormatLocal = “[h]:mm” ‘[2-1]
    End With
    With Range(“F35”)
        .Value = tGai
        .NumberFormatLocal = “[h]:mm” ‘[2-2]
    End With
    With Range(“G35”)
        .Value = tSny
        .NumberFormatLocal = “[h]:mm” ‘[2-3]
    End With
End Sub

..そんなに、前回の定数と統一感ないか。まあいいや(汗

いずれにせよ、前回の定数と同様、各変数の変数名は同じ長さの文字列にする。そのほうが、可読性が高い。

あと、前回のマクロの中で、

Range(“E4:G34”).NumberFormatLocal = “[h]:mm”

としたが、これを

Range(“E4:G35”).NumberFormatLocal = “[h]:mm”

としておけば[2-1]~[2-3]の記述も不要。

ということで、以下のとおりになる。

Sub Monthly_Totaltm_ogawa3()
    Tm_enter
    Dim tNai As Date
    Dim tGai As Date
    Dim tSny As Date
    Dim cnt As Long
    Dim cMax As Long
    cMax = Range(“B65536”).End(xlUp).Row
    ‘[3ここから]
    For cnt = 4 To cMax
        tNai = tNai + Range(“E” & cnt).Value
        tGai = tGai + Range(“F” & cnt).Value
        tSny = tSny + Range(“G” & cnt).Value
    Next
    ‘[3ここまで]
    Range(“E35”).Value = tNai
    Range(“F35”).Value = tGai
    Range(“G35”).Value = tSny
End Sub

だいぶ、すっきりした。

さらに言うと、[3ここから]から[3ここまで]では、セルE4~E34, F4~F34, G4~G34 のそれぞれについて合計を求めているのだが、この部分は、以下のようにWorksheetfunction.Sumを使うと一発で済む。

Sub Monthly_Totaltm_ogawa4()
    Tm_enter
    Dim tNai As Date
    Dim tGai As Date
    Dim tSny As Date
‘    Dim cnt As Long
    Dim cMax As Long
    cMax = Range(“B65536”).End(xlUp).Row
    
    ‘[3ここから]
    tNai = WorksheetFunction.Sum(Range(“E4:E34”))
    tGai = WorksheetFunction.Sum(Range(“F4:F34”))
    tSny = WorksheetFunction.Sum(Range(“G4:G34”))
    ‘[3ここまで]
    
    Range(“E35”).Value = tNai
    Range(“F35”).Value = tGai
    Range(“G35”).Value = tSny
End Sub

というか、ここまでやるなら、そもそも、変数tNai, tGai, tSny を宣言する必要すらない。

Sub Monthly_Totaltm_ogawa5()
    Dim cMax As Long ‘[4]
    cMax = Range(“B65536”).End(xlUp).Row ‘[5]
    
    Range(“E35”).Value = WorksheetFunction.Sum(Range(“E4:E34”))
    Range(“F35”).Value = WorksheetFunction.Sum(Range(“F4:F34”))
    Range(“G35”).Value = WorksheetFunction.Sum(Range(“G4:G34”))
End Sub

変数 cMax を使って、足し算の対象とするセル範囲を指定していました。
でも、これは、表のサイズが固定なら、なくてもいいかも。
ということで、僕なら、[4], [5] も落とします。

それじゃ身も蓋もない、ということでしたら、まあこの変数は残して、以下のとおり。

Sub Monthly_Totaltm_ogawa6()
    Dim cMax As Long
    cMax = Range(“B65536”).End(xlUp).Row
    
    Range(“E35”).Value = WorksheetFunction.Sum(Range(“E4:E” & cMax))
    Range(“F35”).Value = WorksheetFunction.Sum(Range(“F4:F” & cMax))
    Range(“G35”).Value = WorksheetFunction.Sum(Range(“G4:G” & cMax))
End Sub

ということで。

24行のマクロが5行になってしまいました ヾ(´ー`)ノ

今日の添削の見所は、Worksheetfunction.Sum の使い方と、

Range(“E4:E34”) → Range(“G4:G” & cMax)

という、文字列の一部を変数に置き換えるノウハウかな。

前者のノウハウで、就業時間内、時間外、深夜割増での合計労働時間を一発で計算できました。

後者は、正しいトレーニングを積めば難なくできるようになりますけど、基礎ができてないとなかなか難しいかもしれませんね。


お知らせ:

人気のセミナー2つを、久しぶりに開催します。受講受付開始しました。ふるってご参加ください☆

「親指シフト達人養成塾」 (あと3名)
「エクセルデータ分析7つの上級技」 (あと1名)

「エクセルデータ分析」は、ほとんどリピータの方だけで埋まってしまいまして、早くも、残席1つだけとなりました。

親指シフトも、あと3名くらいです。

●塾長のTwitterはこちらです↓。フォローお待ちしていますね。
  http://twitter.com/kanjizaibosatsu

●無料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/

キーワード

コメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

最新の記事

人気記事

最新記事

カテゴリ

最新コメント

タグクラウド