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

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

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

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

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

前回「その89」のあと、大嵐でした。

もう、目抜き通りが川になって、下水から水がバンバン噴き出してくるくらい。

キューバのお金のなさから来る治水の悪さもあって、ものすごいことになっていました (@_@;

動画で撮ったので、今度紹介します。

エクセルマクロ達人養成塾塾長ブログ-夕食。

夕食。

エクセルマクロ達人養成塾塾長ブログ-泊まっていた部屋はこんな感じでした

泊まっていた部屋はこんな感じでした。

エクセルマクロ達人養成塾塾長ブログ-レストラン。最終日の朝食はここでした。

ということで、最終日を迎えました。

朝10時、ハバナからトロントへのフライトでした。

ということで、朝食は、朝の7時から。最終日の朝食はホテルのレストラン。ここでした。

エクセルマクロ達人養成塾塾長ブログ-最終日の朝食。

最終日の朝食。

エクセルマクロ達人養成塾塾長ブログ-出発前、ホテルで撮影。

出発前、ホテルで撮影。嵐も去って、すっかり良い天気 ヾ(´ー`)ノ

ホテルの前でタクシーを拾って、空港まで30分です。
塾長のキューバ旅行記、最初から読みたい方はこちらから


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

受講生村瀬正昭さんからいただいた添削依頼の内容を、ご許可をもらったのでシェアしています。

第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ポイントに変更しました。あとはもらった状態そのまま。

このマクロ、いろいろサブプロシージャが入っていますが、終了する順番に並べていくと、以下の順序です。

    • Time_Clearcontents
    • Tm_enter
    • Monthly_Totaltm
    • Monthly_total_salary

 

そして、その他に、独立して以下があります。

sun_sut_red
で。

昨日は、「sun_sut_red」の添削でした。

今日は、「Time_Clearcontents」について。

これ↓です。

Sub Time_Clearcontents()

Range(“E4:G37”).Clearcontents

End Sub

えー。

まず、何はともあれ、僕ならインデントを直します。

Range(“E4:G37”).Clearcontents は、 Sub … End Sub の直下の部品。

ということで、まずは、以下のとおりに。ついでに、改行のみの行も、間を詰めてみた。

Sub Time_Clearcontents()

Range(“E4:G37”).Clearcontents

End Sub

あとは…まあ、もともと表のサイズも固定だし、直すべきところはないかな。

表のサイズが固定でなければ、以下のように書き換える可能性はあり。

Sub Time_Clearcontents_ogawa1()

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 形式のファイルなら、

Range(“E65536”)

.xlsm, .xlsx 等の形式のファイルなら、

Range(“E1048576”)

と書いてもよい。

今回は、ファイルの形式に依存しない書き方にしてみた。

[2] の条件分岐は必須。

これがないと、例えば、「もともとデータが入っていなかった」というようなときに、

[3]で指定されるセル範囲が、「E4:G3」になってしまう。

あと、[3]について、あえてややダメな例と比較すると、以下も考えられる。

    Range(“E4:G” & gyo).Clearcontents ‘[3-1]

Range(“E4:G” & gyo).Clear ‘[3-2]

Range(“E4:G” & gyo).Value = “” ‘[3-3]

[3-2] は、セルの書式も消してしまうので、今回は不適切。

[3-3] は、ときどき慣れないうちにこういう書き方をしてしまう人をみかけるが、これは、「長さ0の文字列を記入する」という意味になる。

[3-1] は、「数式と文字を削除する」という意味(ヘルプを参照のこと)。

[3-3] と比較しても、今回やりたいことをいちばん素直に表現している。


キーワード

コメント

コメントを残す

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

最新の記事

人気記事

最新記事

カテゴリ

最新コメント

タグクラウド