不可勤務は、複数の勤務を指定できますので、
リストから必要な勤務をクリックして選択できると便利です。
選択処理の仕様
・不可勤務の表内を選択すると、入力用のフォームを表示
・この時、選択されたセルの項目を自動選択
複数セルを選択された場合
すべて同じ項目であれば、その勤務を自動選択
異なる種類が混在している場合は選択しない
・フォームで項目を複数選択可
・フォームボタン OKボタン - 表内の選択セルの値を更新
Cancelボタン - 何もせずにフォームを閉じる
コンパイルエラー発生時
ワークシート制御用VBA
Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' ' ワークシートセルの選択位置が変更された場合の処理 ' Dim myCell As Range Dim tmp Dim No As Integer For Each myCell In Target 'はみ出していたら処理しない If Application.Intersect(Range("不可勤務"), myCell) Is Nothing Then Unload frm不可勤務 Exit Sub End If Next ' 不可勤務内のみを選択した場合の処理 Set rngSelect = Target '選択セル With frm不可勤務 .Show vbModeless Dim k As Integer Dim Kinmus As String ' 選択域の値がすべて同じかを調べる Kinmus = Target.Cells(1) For k = 2 To Target.Cells.Count If Kinmus <> Target.Cells(k) Then '1番目と異なる? Kinmus = "" Exit For End If Next k With .ListBox1 For k = 0 To .ListCount - 1 '選択を全て解除 .Selected(k) = False Next k tmp = Split(Kinmus, ",") 'カンマ分割 For k = 0 To UBound(tmp) No = KinmuNo(CStr(tmp(k))) If No > 0 Then .Selected(No - 1) = True End If Next k End With End With End Sub Private Function KinmuNo(Kinmu As String) As Integer '勤務名→番号 With Range("勤務リスト") Dim i As Integer For i = 1 To .Rows.Count If Trim(Kinmu) = .Cells(i, 1) Then KinmuNo = i Exit For End If Next i End With End Function
不可勤務入力用フォーム制御VBA
Option Explicit Private Sub cmdCancel_Click() Unload Me 'フォームを閉じる End Sub Private Sub cmdOK_Click() '選択された項目をシートに転記 Dim i As Integer Dim tmp As String tmp = "" With ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then If tmp <> "" Then tmp = tmp & "," tmp = tmp & .List(i) End If Next i End With rngSelect.Value = tmp End Sub Private Sub UserForm_Initialize() '項目リスト作成 Dim i As Integer Dim tmp As Range Set tmp = Range("勤務リスト") With ListBox1 .Clear For i = 1 To tmp.Rows.Count .AddItem tmp(i) Next i End With End Sub
![]() |
コントロール ・リストボックス プロパティは左図参照 ・コマンドボタン x2 |
次項では、氏名人数を任意にできるように改良。
氏名人数の変更により、変化するセルの範囲が変化するので工夫が必要。