出勤簿を作る (1)

ラボ

はじめに

 今回は、入力規則のドロップダウンリストから勤務パターンを選んで始業時間や退勤時間を入力できるようにしてみます。
 尚、ドロップダウンリストはデータの入力規則からリストを使って表示するようにします。
 リストは勤務パターンシートの勤務区分を範囲としています。

ドロップダウンの設定

 最初に出勤簿シートの勤務区分(D列)の範囲を選択します。その状態からメニューの「データ」>「データの入力規則」を選択してドロップダウンのリストを指定します。

 リストは以下の様に勤務パターンシートの勤務区分の範囲を指定します。
 最後の空白行は取り消しの時に使いますので、範囲に入れておいてください

 リストは以下の様に勤務パターンシートの勤務区分の範囲を指定します。

データの入力規則のダイアログは以下の様になります。

 「元のデータ」は以下の様になります。
  =勤務パターン!$B$3:$B$13

 これで勤務区分のドロップダウンが完成しました。あとはこれに連動して出勤時間~残業までの値を代入できるようにプログラムします。

イベントプロシージャのプログラム

 ドロップダウンの値に連動して他の項目の値を設定するには、イベントプロシージャのChangeイベントを使います。出勤簿シートの勤務区分のセルが変更された時(Change)を拾ってプログラムを起動させます。
 イベントプロシージャはシートモジュールに書きますので、今回は出勤簿シートを選択してChangeイベントのプロシージャを選択します。

 プログラムは以下の様になります。

'// このプログラムは出勤簿シートのモジュールに記述します。 //
Private Sub Worksheet_Change(ByVal Target As Range)
    '指定した範囲以外は抜けます。 (1)
    If Intersect(Target, Range("D5:D35")) Is Nothing Then Exit Sub
    
    With Worksheets("勤務パターン")
    
    Dim i As Long, cnt As Long
    For cnt = 1 To Target.Count   ' 選択範囲分の繰り返し (2)
        For i = 3 To 13     ' 勤務パターン分の繰り返し  (3)
            If Target(cnt).Value = .Cells(i, "B") Then    ' (4)
                Target(cnt).Offset(0, 1) = .Cells(i, "C")
                Target(cnt).Offset(0, 2) = .Cells(i, "D")
                Target(cnt).Offset(0, 3) = .Cells(i, "E")
                Target(cnt).Offset(0, 5) = .Cells(i, "G")
                Target(cnt).Offset(0, 6) = .Cells(i, "H")
                Target(cnt).Offset(0, 7) = .Cells(i, "I")
                Target(cnt).Offset(0, 8) = .Cells(i, "J")
                
            End If
        Next i
    Next cnt
    
    End With
End Sub

 Changeイベントプロシージャの引数であるTargetには、変更されたセルの情報が入っていますが、これが単体とは限りませんので、これを考慮する必要があります。

 プログラム冒頭のIntersect関数は、Targetと勤務区分部分のセルが重なっていない場合は処理を抜けるようにしています。(1)
 (2)のFor文では、Targetが複数のセルであることを考慮しています。Target(cnt)の添え字のcntに何番目の要素であるかが入っています。
 (3)のFor文は勤務パターン分の繰り返しになります。次のIf文(4)で同じ勤務パターンであれば値を転記していきます。

 蛇足になりますが、Worksheet_Changeプロシージャ内で、引数に当たるTargetのセル情報を変更すると、その変更によりWorksheet_Changeが起動されて思うように動作しない事があります。
 このような時は、Application.EnableEventsを一旦Falseにして、操作すると上手くいきます。最後に、Trueに戻しておくことを忘れないようにしましょう。

 今回はTargetの右の列を変更していますが、一行目のIntersect部分で除外しているので問題ありません。

複数選択して入力する方法

 データの入力規則では、1行づつしか入力できませんが、今回はChangeイベントを使ってプログラミングしているため複数選択して値を転記する事が可能です。
 方法は、最初にどれか勤務区分を選択しておき、次いで必要なセルを複数選択して貼り付けます。貼り付けた部分はChangeイベントで値を転記してくれます。

最後に

 今回の方法は、あるセルを入力規則のリストで選択すると、他のセルに値を代入するという者でした。出勤簿に限らず他の場面でも使えると思いますので、かつようしてみてください。

 次回は、ユーザーフォームを使って転記する方法を試してみます。

コメント

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