出勤簿を作る (6)

ラボ

はじめに

 今回はエラーを探知するプログラムです。
 探知すると言っても、どのようなエラーが起こるかを想定しておいて、それに対処する形になります。
 
 出勤簿を実際に運用していくと、出勤簿をつけている人が異なるため色々な間違いが発生すると思います。
 そのような間違いを観察して、再度発生した時は間違いを注意喚起するような仕組みです。
 
 そのため、このようなプログラムは日々更新されていくでしょう。
 筆者の経験では、数年はミスによる対応が続きますが、ある程度運用を継続するとミスの対応は減っていきます。
 これは、プログラムのバグが減っていく事もあるでしょうが、ユーザー側が慣れてくるという一面もあります。
 
 間違いやミスを放っておかず、今回のようなシステムで注意喚起すれば、ユーザーもミスに気付く事ができスムーズな運用が出来るようになるでしょう。

 レイアウトとしては出勤簿シートの右上に「チェック」というボタンが追加されました。このボタンを押すと、間違いを探知してA列に ? とコメントを付けてくれます。
 ?マークの付いた行を正しく修正し、再度チェックボタンを押すと?マークとコメントは消えます。コメントはどんなエラーかを教えてくれます。

 上の例では、有給時間の合計が実働時間を超えてしまっています。有給時間を8(h)に修正してチェックボタンを押せば ? とコメントは消えるでしょう。

チェックボタンの設置

 チェックボタンは出勤簿シート毎に(社員分)必要になります。今回のプログラムでは、原本シートからコピーして作るので、原本シートのM1セル付近にボタンを設置しておきます。

 もし、すでに社員分の出勤簿シートがある場合は、各シートにボタンを設置する必要があります。その場合はボタンにマクロを登録してからコピー&貼り付けしていけば良いでしょう。

プログラムコード

 エラーチェック用のプログラムは標準モジュールに書いていきます。本プロジェクトでは、記事ごとに標準モジュールを追加していますので、サンプルではModule6に書いています。

 まずはA列に?マークとコメントを記述するプロシージャです。引数はRangeとString(文字列)です。RangeはA列の任意の行。文字列にはエラーの詳細を渡します。

Sub setComments(rng As Range, cmmt As String)
    rng = "?"
    rng.Font.ColorIndex = 3 '文字色 赤
    rng.ClearComments
    rng.AddComment (cmmt)
    rng.Comment.Shape.TextFrame.Characters.Font.Size = 12
    rng.Comment.Shape.TextFrame.AutoSize = True
End Sub

 次はエラーチェックのコードです。

Sub CheckError()
    Dim i As Long
    
    With ActiveSheet
    
    If .Name <> "原本" _
     And .Name <> "社員リスト" _
     And .Name <> "メニュー" _
     And .Name <> "勤務パターン" _
     And .Name <> "集計" Then
     
        '数式マクロの書換え
        Call writeMyFormula
        Debug.Print .Name & " 数式マクロ書換え"
        
        For i = 5 To 35
            If .Cells(i, "B") = "" Then Exit For
            
            'A列の値とコメントを初期化
            .Cells(i, "A").ClearContents
            .Cells(i, "A").ClearComments
            
            '///--- エラー処理コード ---///
            '勤務区分は値が必要です。
            If .Cells(i, "D") = "" Then
                Call setComments(.Cells(i, "A"), "勤務区分は値が必要です。")
            End If
            
            '欠勤時間が実働時間を超えています。
            If .Cells(i, "I") > 0 And .Cells(i, "H") < 0 Then
                Call setComments(.Cells(i, "A"), "欠勤時間が実働時間を超えています。")
            End If
            
            '有給時間が実働時間を超えています。
            If .Cells(i, "J") > .Cells(i, "H") Then
                Call setComments(.Cells(i, "A"), "有給時間が実働時間を超えています。")
            End If
            '///--- エラー処理コード ---///
            
        Next i
        
    End If
    
    End With
End Sub

 まず冒頭で、シート名のチェックを行っています。社員の出勤簿でなければ対象となりません。

 次に数式マクロの書換えプログラムを実行しています。前回はシートチェンジのイベントで実行していましたが、これですと何度も実行されてしまいますので、チェックボタンを押した時にエラーチェックと一緒に行うように変更しました。
 ご自身でプログラムを書いている場合は、ThisWorkbook モジュールの Workbook_SheetChange プロシージャのコードは削除しておいてください。

 続いて日付ごとの繰り返し処理に移っていきます。まずはA列に残っているかもしれない値とコメントを削除します。その先の ///— エラー処理コード —/// と書かれた部分に想定されるエラーをIf文で書いて、エラーメッセージを setComments 関数に記述します。

 今回は例ですので、以下の3つを想定しました。
  ・勤務区分の記述が無いケース
  ・欠勤が実働時間を上回るケース
  ・有給が実働時間を上回るケース
どのような想定をするかは、運用の仕方によって変わると思います。出勤簿を管理する立場の人は、同じような間違いが何度も繰り返される事が良くあると思います。そのような間違いを今回のようなプログラムで探知して注意喚起してやるのが目的です。

 この機能に関しては、独自のアイデアも必要になります。そのために新しい項目を設けたり、実働時間の計算方法を変えたりする必要があるかもしれません。いずれにせよ、出勤簿の運用をスムーズに行うためにはこのような機能は必須であると考えられます。

最後に

 今回のエラー探知プログラムは、運用していく上でのアイデアが必要になってくると思います。筆者の場合は、交通費などを扱っていたため、そのカウント方法が意外と複雑で苦労しました。
 ただ、プログラムが完成すると入力側のミスも減ってくるので楽になっていきます。

 今回のサンプルにはミスした所がそのまま入っていますので、訂正して動作を確認してみてください。
自分の環境で運用したい場合は、既にある社員の出勤簿シートを削除してください。

 次回は有給休暇の残を管理できるようにしてみたいと思います。今回の出勤簿プログラムは、次月度の出勤簿を出力できるので、ある時点での有給休暇の残を記録しておくとその月の利用時間数を差し引いて次月の値を得るようにすれば良いでしょう。

コメント

タイトルとURLをコピーしました