エクセルマクロ・VBA達人養成塾 小川です。
キューバ旅行記、その91です。
空港に到着しました。
こちらは、道の反対側。
空港内にて。9:35のトロント行き。
空港内のキオスク。絵はがき等売っています。
空港内のお土産屋にて。葉巻は名産です。
そうそう。僕は、紙巻きたばこは吸ったことないですが、水タバコと葉巻は海外で吸ったことあります。
受講生村瀬正昭さんからいただいた添削依頼の内容を、ブログ上で添削しています。
テーマは、就業時間内、時間外、深夜割増での賃金を計算するマクロです。
第1回: 給与計算ソフトは結構市販されていますが、融通が利かない場合も – Excelマクロ・VBA
第2回: 添削事例 – 給与計算をするマクロ(その2) – Excelマクロ・VBA
第3回: 範囲を指定してデータを一括クリアする – 給与計算をするマクロ(その3) – Excelマクロ・VBA
今日は、いただいたマクロの、以下の部分を添削。
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ここまで]は、全体を一番左へ。
どうしてこういう整え方をするのか等、詳しい解説は今回はしません。セミナーで説明します。
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句が不要になる。
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を使ってセルを指定するなら、ここまで↓するのもありかと。
定数を使うと、可読性が増す。以下の要領。
「定数って何?」って人は、変数でも可。
..と言われても「何のことやら」っていう方は、一度、基礎からガッツリ学んでください。
定数名は、本人が識別できる範囲で、もっと短くてよいと思う。
今回は、デモということで、丁寧にやってみた、というだけ。
同じようなモノを扱うときに使う変数・定数は、その変数名、定数名の長さを同じにそろえておくと可読性が高い。
今回はその恩恵を特に感じるようなマクロではなかったが、ガンガン上達したいなら、いずれ意識してもらいたいところ。
こまかい給与計算のロジックに瑕疵がないかとかも、ここまで可読性が高まれば、判断しやすいだろうと思う。
(実際、このマクロには、実は瑕疵がある。何かというと、「16時~23時に勤務」というような場合、「時間外」の値が負になる。)
お知らせ:
人気のセミナー2つを、久しぶりに開催します。受講受付開始しました。ふるってご参加ください☆
「親指シフト達人養成塾」 (あと3名)
「エクセルデータ分析7つの上級技」 (あと1名)
「エクセルデータ分析」は、ほとんどリピータの方だけで埋まってしまいまして、早くも、残席1つだけとなりました。
親指シフトも、あと3名くらいです。
●無料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/