はじめに
今回はユーザーフォームを使って勤務区分を選択すると連動してデータを転記するプログラムを書いてみます。
ユーザーフォームには、コンボボックスとボタンを配置します。

コンボボックスには、勤務区分の名称と共に出勤時間と退勤時間を表示させるようにしてみました。
この方法では、最初に複数選択すると全ての項目に値を転記してくれるので効率良く出勤簿の入力ができるようになります。
※前回の「出勤簿をつくる(1)」で使ったファイルを使用する場合は、シートモジュールのプログラムを消さないと動きませんのでWorksheet_Changeプロシーシャを削除しておいてください。
ユーザーフォームの作り方
ユーザーフォーム(UserForm1)には、ラベル、コンボボックス、コマンドボタンを以下の様に配置します。

ユーザーフォームのプログラムは以下の様になります。
'初期化
Private Sub UserForm_Initialize()
Dim i As Long
Dim ptSh As Worksheet
Set ptSh = Worksheets("勤務パターン")
With Me.ComboBox1
'コンボボックスに値を設定
For i = 3 To 13
If InStr(ptSh.Cells(i, "B"), "公休") > 0 Then
.AddItem ptSh.Cells(i, "B")
ElseIf ptSh.Cells(i, "B") = "" Then
.AddItem "<< 取り消し >>"
Else
.AddItem ptSh.Cells(i, "B") _
& " (" & ptSh.Cells(i, "C").Text & " ~ " & ptSh.Cells(i, "D").Text & " )"
End If
Next i
End With
Me.ComboBox1.Style = fmStyleDropDownList 'リストからのみ値を設定
End Sub
'選択ボタン
Private Sub CommandButton1_Click()
Item = Me.ComboBox1.ListIndex
Call データ転記
End Sub
'閉じるボタン
Private Sub CommandButton2_Click()
Item = -1
Unload Me
End Sub
最初に初期化のUserForm_Initialize()でコンボボックスを作ります。
勤務パターンシートの勤務区分の値に、括弧を付きで(出勤時間~退勤時間)という形で文字列を作っています。
尚、「公休」の場合は出勤時間、退勤時間がありませんので、除外します。また、取り消し用に全ての項目を削除する項目も設けています。
選択ボタンのプログラム CommandButton1_Click() では、コンボボックスで選択されているインデックスをItem変数に入れています。Itemはグローバル変数で標準モジュールの「データ転記」という関数とやり取りします。
閉じるボタンのプログラム CommandButton2_Click() は、値を代入せずにユーザーフォームを閉じます。Itemは -1 としてどれも選択していない状態をとします。
標準モジュールのプログラム
標準モジュールには、勤務パターン選択のユーザーフォームを出す関数と、データを転記する関数を用意します。
また、どの勤務パターンを選択したか分かるように Item というグローバル変数を使います。
Public Item As Long
Sub 勤務パターン選択ボタン()
Item = -1
UserForm1.Show vbModeless 'モードレスで開く
End Sub
Sub データ転記()
If Item < 0 Then Exit Sub
If ActiveSheet.Name = "勤務パターン" Then Exit Sub
Dim ptSh As Worksheet
Set ptSh = Worksheets("勤務パターン")
With ActiveSheet
Dim i As Long
For i = Selection(1).Row To Selection(Selection.Count).Row
If .Cells(i, "B") <> "" Then '日付が無い場合は転記しない
.Cells(i, "D") = ptSh.Cells(Item + 3, "B")
.Cells(i, "E") = ptSh.Cells(Item + 3, "C")
.Cells(i, "F") = ptSh.Cells(Item + 3, "D")
.Cells(i, "G") = ptSh.Cells(Item + 3, "E")
.Cells(i, "I") = ptSh.Cells(Item + 3, "G")
.Cells(i, "J") = ptSh.Cells(Item + 3, "H")
.Cells(i, "K") = ptSh.Cells(Item + 3, "I")
.Cells(i, "L") = ptSh.Cells(Item + 3, "J")
End If
Next i
End With
End Sub
勤務パターン選択ボタン関数は、ユーザーフォームを表示させます。今回はモードレス状態で起動するようにしました。Itemは何も選択されていない状態の -1 をセットしておきます。
データ転記関数は、ユーザーフォームで選択ボタンを押された際に呼び出されます。Itemの中身を見てどの勤務パターンか調べてその値を選択された行に配置していきます。複数選択が可能で、出勤簿シートが変更されても ActiveSheet に対して処理を行います。
尚、勤務パターンシートの場合は除外します。
For i = Selection(1).Row To Selection(Selection.Count).Row の部分は選択範囲が複数ある場合を考慮しています。
動作確認
出勤簿シートは以下のようになります。
出勤簿シートにはボタンを設置して、勤務パターン選択ボタン関数を登録しておきます。

ボタンを押してユーザーフォームを表示させ、日付のある行を選択してから勤務パターンを選択して選択ボタンを押すと、値が転記されます。

勤務パターンシートは以下の様になります。(前回と同じです。)

今回のユーザーフォームを使用した勤務パターン選択では、勤務区分を検索して値を貼り付けているだけなので、勤務区分を空白にしても、出勤時間や退勤時間に影響はありません。
前回のChangeイベントを使用した方法では、勤務区分を空白にすると連動して他も削除されます。どちらが良いかは運用の方法によると思います。
最後に
ユーザーフォームを使用した勤務パターンの転記は、私が実際に運用していた出勤簿プログラムで採用していた方法です。ユーザーにはこちらの方がわかりやすく感じるようです。
次回は、新たに社員名リストのシートを追加し、そこから出勤簿シートを作っていけるようにしたいと思います。
コメント