エクセルマクロ・VBA達人養成塾 小川です。
キューバ旅行記、その90です。
前回「その89」のあと、大嵐でした。
もう、目抜き通りが川になって、下水から水がバンバン噴き出してくるくらい。
キューバのお金のなさから来る治水の悪さもあって、ものすごいことになっていました (@_@;
動画で撮ったので、今度紹介します。
夕食。
泊まっていた部屋はこんな感じでした。
ということで、最終日を迎えました。
朝10時、ハバナからトロントへのフライトでした。
ということで、朝食は、朝の7時から。最終日の朝食はホテルのレストラン。ここでした。
最終日の朝食。
出発前、ホテルで撮影。嵐も去って、すっかり良い天気 ヾ(´ー`)ノ
ホテルの前でタクシーを拾って、空港まで30分です。
塾長のキューバ旅行記、最初から読みたい方はこちらから
受講生村瀬正昭さんからいただいた添削依頼の内容を、ご許可をもらったのでシェアしています。
第1回: 給与計算ソフトは結構市販されていますが、融通が利かない場合も – Excelマクロ・VBA
第2回: 添削事例 – 給与計算をするマクロ(その2) – Excelマクロ・VBA
で、いただいたプログラムの内容はこんな感じ↓でした。
Option Explicit
Sub Monthly_total_salary() ‘
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
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
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
Sub Time_Clearcontents()
Range(“E4:G37”).Clearcontents
End Sub
Sub sun_sut_red()
Dim r As Range
For Each r In Selection
If Weekday(r) = 1 Or Weekday(r) = 7 Then
r.Interior.ColorIndex = 3
End If
Next
End Sub
※便宜上、インデント幅を、4ポイント→2ポイントに変更しました。あとはもらった状態そのまま。
このマクロ、いろいろサブプロシージャが入っていますが、終了する順番に並べていくと、以下の順序です。
そして、その他に、独立して以下があります。
sun_sut_red
で。
昨日は、「sun_sut_red」の添削でした。
今日は、「Time_Clearcontents」について。
これ↓です。
Sub Time_Clearcontents()
Range(“E4:G37”).Clearcontents
End Sub
えー。
まず、何はともあれ、僕ならインデントを直します。
Range(“E4:G37”).Clearcontents は、 Sub … End Sub の直下の部品。
ということで、まずは、以下のとおりに。ついでに、改行のみの行も、間を詰めてみた。
Range(“E4:G37”).Clearcontents
End Sub
あとは…まあ、もともと表のサイズも固定だし、直すべきところはないかな。
表のサイズが固定でなければ、以下のように書き換える可能性はあり。
Dim gyo As Long
gyo = Range(“E” & ActiveSheet.Rows.Count).End(xlUp).Row ‘[1]
If gyo > 3 Then ‘[2]
Range(“E4:G” & gyo).Clearcontents ‘[3]
End If
End Sub
趣旨としては、
[1] E列のデータの入っている最終行が何行目か調べる
[2] それが、3行目より下だったなら
[3] 範囲指定して、データを消しにかかる
という感じ。
[1] では、.xls 形式のファイルなら、
.xlsm, .xlsx 等の形式のファイルなら、
と書いてもよい。
今回は、ファイルの形式に依存しない書き方にしてみた。
[2] の条件分岐は必須。
これがないと、例えば、「もともとデータが入っていなかった」というようなときに、
[3]で指定されるセル範囲が、「E4:G3」になってしまう。
あと、[3]について、あえてややダメな例と比較すると、以下も考えられる。
Range(“E4:G” & gyo).Clear ‘[3-2]
Range(“E4:G” & gyo).Value = “” ‘[3-3]
[3-2] は、セルの書式も消してしまうので、今回は不適切。
[3-3] は、ときどき慣れないうちにこういう書き方をしてしまう人をみかけるが、これは、「長さ0の文字列を記入する」という意味になる。
[3-1] は、「数式と文字を削除する」という意味(ヘルプを参照のこと)。
[3-3] と比較しても、今回やりたいことをいちばん素直に表現している。