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

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

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

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

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

エクセルマクロ達人養成塾塾長ブログ-空港に到着しました。

空港に到着しました。

エクセルマクロ達人養成塾塾長ブログ-こちらは、道の反対側。
こちらは、道の反対側。

エクセルマクロ達人養成塾塾長ブログ-空港内にて。9:35のトロント行き。

空港内にて。9:35のトロント行き。

エクセルマクロ達人養成塾塾長ブログ-キオスク。絵はがき等売っています。

空港内のキオスク。絵はがき等売っています。

エクセルマクロ達人養成塾塾長ブログ-お土産やにて。葉巻は有名。

空港内のお土産屋にて。葉巻は名産です。

そうそう。僕は、紙巻きたばこは吸ったことないですが、水タバコと葉巻は海外で吸ったことあります。

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


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

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

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

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

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

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

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

Sub Tm_enter()

    Time_Clearcontents
    
    Dim cnt As Long
    Dim cMax As Long
        cMax = Range(“B65536”).End(xlUp).Row
    Dim zikann As Date
    For cnt = 0 To cMax – 3
    If Range(“B4”).Offset(cnt).Value <> “” Then
        zikann = Range(“C4”).Offset(cnt).Value – Range(“B4”).Offset(cnt).Value – Range(“D4”).Offset(cnt).Value
        If Range(“C4”).Offset(cnt).Value >= #10:00:00 PM# Then
                With Range(“E4”).Offset(cnt)
                    .Value = #8:00:00 AM#
                    .NumberFormatLocal = “[h]:mm”
                End With
                
                With Range(“F4”).Offset(cnt)
                    .Value = zikann – #8:00:00 AM#
                    .NumberFormatLocal = “[h]:mm”
                End With
                
                With Range(“G4”).Offset(cnt)
                    .Value = Range(“C4”).Offset(cnt).Value – #10:00:00 PM#
                    .NumberFormatLocal = “[h]:mm”
                End With
        Else
            If zikann >= #8:00:00 AM# Then
                With Range(“E4”).Offset(cnt)
                    .Value = #8:00:00 AM#
                    .NumberFormatLocal = “[h]:mm”
                End With
                
                With Range(“F4”).Offset(cnt)
                    .Value = zikann – #8:00:00 AM#
                    .NumberFormatLocal = “[h]:mm”
                End With
            Else
                With Range(“E4”).Offset(cnt)
                    .Value = zikann
                    .NumberFormatLocal = “[h]:mm”
                End With
            End If
        End If
    End If
        
    Next
End Sub

Time_Clearcontents は呼び出されているマクロ。

他の部分を見ていきます。

..というところで。

まず何よりも、インデントをそろえたい。

ということで、以下。[1]は一段左へ。[2ここから]から[2ここまで]は、全体を一番右へ。
[2ここから]から[2ここまで]は、全体を一番左へ。

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

Sub Tm_enter_ogawa1()

    Time_Clearcontents
    
    Dim cnt As Long
    Dim cMax As Long
    cMax = Range(“B65536”).End(xlUp).Row ‘[1]
    Dim zikann As Date
    For cnt = 0 To cMax – 3
        ‘[2ここから]
        If Range(“B4”).Offset(cnt).Value <> “” Then
            zikann = Range(“C4”).Offset(cnt).Value – Range(“B4”).Offset(cnt).Value – Range(“D4”).Offset(cnt).Value
            If Range(“C4”).Offset(cnt).Value >= #10:00:00 PM# Then
                ‘[3ここから]
                With Range(“E4”).Offset(cnt)
                    .Value = #8:00:00 AM#
                    .NumberFormatLocal = “[h]:mm”
                End With
                
                With Range(“F4”).Offset(cnt)
                    .Value = zikann – #8:00:00 AM#
                    .NumberFormatLocal = “[h]:mm”
                End With
                
                With Range(“G4”).Offset(cnt)
                    .Value = Range(“C4”).Offset(cnt).Value – #10:00:00 PM#
                    .NumberFormatLocal = “[h]:mm”
                End With
                ‘[3ここまで]
            Else
                If zikann >= #8:00:00 AM# Then
                    With Range(“E4”).Offset(cnt)
                        .Value = #8:00:00 AM#
                        .NumberFormatLocal = “[h]:mm”
                    End With
                    
                    With Range(“F4”).Offset(cnt)
                        .Value = zikann – #8:00:00 AM#
                        .NumberFormatLocal = “[h]:mm”
                    End With
                Else
                    With Range(“E4”).Offset(cnt)
                        .Value = zikann
                        .NumberFormatLocal = “[h]:mm”
                    End With
                End If
            End If
        End If
        ‘[2ここまで]
    Next
End Sub

それから、次。

各セルのプロパティを設定するところでは、

[1] 値を入れ
[2] 書式を設定する

という2つの処理をしているが、僕ならこうはやらないです。
あらかじめ、エクセルの操作で、セルの書式を設定します。そうすれば、そもそも、マクロでいちいち処理する必要がなくなる。

または、マクロのすべての処理がはじまるか、終わるかするタイミングで、一気に実施。

後者なら、以下の要領。

必然的に、各セルのプロパティを設定するところでWith句が不要になる。

Sub Tm_enter_ogawa2()

    Time_Clearcontents
    
    Dim cnt As Long
    Dim cMax As Long
    cMax = Range(“B65536”).End(xlUp).Row
    Dim zikann As Date
    For cnt = 0 To cMax – 3
        If Range(“B4”).Offset(cnt).Value <> “” Then
            zikann = Range(“C4”).Offset(cnt).Value – Range(“B4”).Offset(cnt).Value – Range(“D4”).Offset(cnt).Value
            If Range(“C4”).Offset(cnt).Value >= #10:00:00 PM# Then
                Range(“E4”).Offset(cnt).Value = #8:00:00 AM#
                Range(“F4”).Offset(cnt).Value = zikann – #8:00:00 AM#
                Range(“G4”).Offset(cnt).Value = Range(“C4”).Offset(cnt).Value – #10:00:00 PM#
            Else
                If zikann >= #8:00:00 AM# Then
                    Range(“E4”).Offset(cnt).Value = #8:00:00 AM#
                    Range(“F4”).Offset(cnt).Value = zikann – #8:00:00 AM#
                Else
                    Range(“E4”).Offset(cnt).Value = zikann
                End If
            End If
        End If
    Next
    Range(“E4:G34”).NumberFormatLocal = “[h]:mm” ‘[4]
End Sub

だいぶ、すっきりした ヾ(´ー`)ノ

あと、値をクリアも、書式の設定も、どちらも初期化のプロセスとみなして、ならば、[4]は、サブプロシージャ「Time_Clearcontents」の中に入れたい。

あとは、For Next構文の中身をもうちょっと見てみて…。

どうせOffsetを使ってセルを指定するなら、ここまで↓するのもありかと。

Sub Tm_enter_ogawa3()
    
    Time_Clearcontents
    
    Dim cnt As Long
    Dim cMax As Long
    cMax = Range(“B65536”).End(xlUp).Row
    Dim zikann As Date
    For cnt = 0 To cMax – 3
        With Range(“B4”).Offset(cnt)
            If .Value <> “” Then
                zikann = .Offset(, 1).Value – .Offset(, 0).Value – .Offset(, 2).Value
                If .Offset(, 1).Value >= #10:00:00 PM# Then
                    .Offset(, 3).Value = #8:00:00 AM#
                    .Offset(, 4).Value = zikann – #8:00:00 AM#
                    .Offset(, 5).Value = .Offset(, 1).Value – #10:00:00 PM#
                Else
                    If zikann >= #8:00:00 AM# Then
                        .Offset(, 3).Value = #8:00:00 AM#
                        .Offset(, 4).Value = zikann – #8:00:00 AM#
                    Else
                        .Offset(, 3).Value = zikann
                    End If
                End If
            End If
        End With
    Next
End Sub

定数を使うと、可読性が増す。以下の要領。

「定数って何?」って人は、変数でも可。
..と言われても「何のことやら」っていう方は、一度、基礎からガッツリ学んでください。

Sub Tm_enter_ogawa4()
    Time_Clearcontents
    
    Dim cnt As Long
    Dim cMax As Long
    cMax = Range(“B65536”).End(xlUp).Row
    Dim zikann As Date
    
    Const I_SHIGYO As Integer = 0
    Const I_SHUGYO As Integer = 1
    Const I_KYUKEI As Integer = 2
    Const I_KANNAI As Integer = 3
    Const I_KANGAI As Integer = 4
    Const I_SHINYA As Integer = 5
    For cnt = 0 To cMax – 3
        With Range(“B4”).Offset(cnt)
            If .Value <> “” Then
                zikann = .Offset(, I_SHUGYO).Value – .Offset(, I_SHIGYO).Value – .Offset(, I_KYUKEI).Value
                If .Offset(, I_SHUGYO).Value >= #10:00:00 PM# Then
                    .Offset(, I_KANNAI).Value = #8:00:00 AM#
                    .Offset(, I_KANGAI).Value = zikann – #8:00:00 AM#
                    .Offset(, I_SHINYA).Value = .Offset(, I_SHUGYO).Value – #10:00:00 PM#
                Else
                    If zikann >= #8:00:00 AM# Then
                        .Offset(, I_KANNAI).Value = #8:00:00 AM#
                        .Offset(, I_KANGAI).Value = zikann – #8:00:00 AM#
                    Else
                        .Offset(, I_KANNAI).Value = zikann
                    End If
                End If
            End If
        End With
    Next
End Sub

定数名は、本人が識別できる範囲で、もっと短くてよいと思う。
今回は、デモということで、丁寧にやってみた、というだけ。

同じようなモノを扱うときに使う変数・定数は、その変数名、定数名の長さを同じにそろえておくと可読性が高い。

今回はその恩恵を特に感じるようなマクロではなかったが、ガンガン上達したいなら、いずれ意識してもらいたいところ。

こまかい給与計算のロジックに瑕疵がないかとかも、ここまで可読性が高まれば、判断しやすいだろうと思う。
(実際、このマクロには、実は瑕疵がある。何かというと、「16時~23時に勤務」というような場合、「時間外」の値が負になる。)


お知らせ:

人気のセミナー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/

キーワード

コメント

コメントを残す

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

最新の記事

人気記事

最新記事

カテゴリ

最新コメント

タグクラウド