今回は前回に続き、以前の頁で使った出勤簿から給与計算のマクロ化をしたいと思います。
もう一度マクロ化する作業内容を確認しましょう。
出勤簿から給与計算マクロを作ろう
- 出勤時刻と退勤時刻から勤務時間を取得する
- アルバイト従業員ごとに勤務時間の小計を出す
- 勤務時間に時給を掛けて給料を算出する
今回は2番の、アルバイト従業員ごとの勤務時間の小計を出す、のプログラムを作成したいと思います。
アルバイト従業員ごとに勤務時間の小計を出す
処理を想定してみる
この処理ではアルバイト従業員ごとに勤務時間を集計し、アルバイト従業員ごとの計を出します。
それでは必要な処理を挙げてみましょう
- アルバイト従業員の名前ごとに集計していく
- →1人ずつ全ての行をループし、一致する従業員名の勤務時間を加算する
- 集計した勤務時間をセルにセットする
- →従業員毎に何分働いたかを、別の欄を作って表示する
5列目には勤務時間が表示されているので、6列目にアルバイト従業員の名前、7列目に小計を表示させることとします。
従業員名固定での場合
今回の頁では、従業員が固定の5人であるものとしてプログラムを作成します。 次回の頁では、「変数の配列」を使い、固定ではない従業員名に対応できるプログラムも紹介しています。
今回での従業員は固定の5名ですので、それぞれの名前で5回ループ処理をすることになります。
それでは、まずはループ処理の部分だけ見てみましょう。 今回は固定回数のループ処理ですので、「For Next」でループさせることとします。
Dim i As Integer '1つ目のループカウンタ用 For i = 1 To 5 '5人なので5回のループ Next
今回は5回と決まっているので、1から5の固定値としています。 ループカウンターの値によって、対象となる従業員名を切り替えていくことになります。
それでは「従業員ごと」の部分だけ記述してみましょう。
Dim Jugyoin As String '従業員名を入れる変数 Select Case i Case 1: Jugyoin = "高橋" Case 2: Jugyoin = "黒田" Case 3: Jugyoin = "伊藤" Case 4: Jugyoin = "石黒" Case 5: Jugyoin = "斎藤" End Select
ループ毎に従業員名を変えていき、5回のループで全員網羅していく形になります。
では次に値の取得と集計をしましょう。
Dim KinmuJikan As Integer '勤務時間集計用 Dim j As Integer '2つ目のループカウンタ用 KinmuJikan = 0 '集計用の変数をリセット j = 2 '一行目はヘッダのため2行目から計算する Do Until Cells(j, 5).Value = "" ‘5列目に値がなくなるまでループ If Cells(j, 1).Value = Jugyoin Then '対象の従業員名と一致したら加算していく KinmuJikan = Cells(j, 5).Value + KinmuJikan End If j = j + 1 Loop
そして最後は、6列目に従業員名をセット、7列目に勤務時間の小計をセットする部分ですね。
Cells(i, 6).Value = Jugyoin '6列目に従業員名をセット Cells(i, 6).Value = Jugyoin '7列目に従業員名をセット
それでは以上の機能を組み合わせて、今回のプログラムを流れで見てみましょう。
Sub JikanSyukei() Dim Jugyoin As String Dim i As Integer '1つ目のループカウンタ用 Dim j As Integer '2つ目のループカウンタ用 Dim KinmuJikan As Integer '勤務時間集計用 For i = 1 To 5 '5人なので5回のループ Select Case i '従業員名で1人ずつループさせる Case 1: Jugyoin = "高橋" Case 2: Jugyoin = "黒田" Case 3: Jugyoin = "伊藤" Case 4: Jugyoin = "石黒" Case 5: Jugyoin = "斎藤" End Select KinmuJikan = 0 '集計用の変数をリセット j = 2 '一行目はヘッダのため2行目から計算する Do Until Cells(j, 3).Value = "" Or Cells(j, 4).Value = "" If Cells(j, 1).Value = Jugyoin Then '対象の名前と一致したら加算していく KinmuJikan = Cells(j, 5).Value + KinmuJikan End If j = j + 1 Loop Cells(i, 6).Value = Jugyoin '6列目に従業員名をセット Cells(i, 7).Value = KinmuJikan '7列名に勤務時間の小計をセット Next End Sub
このようなプログラムになります。 今回のプログラムでは、ループの中にループが含まれている構造になっています。 それぞれのループが、従業員、シート内の行数と、別の目的で処理をしていることがわかると思います。
今回のまとめ
今回のプログラムでは、ループを2つ重ねてのプログラムとなっています。 1つで使う場合もですが、2重でループ処理する場合は特に変数のリセット忘れに気をつけましょう。
次回は「変数の配列」をご説明します。
コメント