[ ユーザーフォーム_目次 ]

更新用フォーム

更新用フォームは、選択された会員データの項目を表示し、変更された入力内容でワークシートの同データを更新します。

[ 目次 ]
  1. 画面を再確認
  2. 初期処理
  3. 更新ボタン クリック時
  4. キャンセルボタン クリック時



画面を再確認

更新1



初期処理

使用する各コンボボックスの値を設定しています。設定は標準モジュールで行います。
選択された会員データの項目を、ラベルやテキストボックスにセットします。

Private Sub UserForm_Initialize()

    SetComboBox (Me)
    
    With FormSearch.ListMembers
        LabelID.Caption = .List(.ListIndex, 0)
        BoxName.Value = .List(.ListIndex, 1)
        BoxSex.Value = .List(.ListIndex, 2)
        BoxYear.Value = Year(.List(.ListIndex, 3))
        BoxMonth.Value = Month(.List(.ListIndex, 3))
        BoxDay.Value = Day(.List(.ListIndex, 3))
    End With

End Sub
− Memo −
  1. 標準モジュールの SetComboBox には、引数としてフォーム自体を渡します。



更新ボタン クリック時

未入力チェックを行い、チェックを通過したら、ワークシートの該当データの値を更新します。

Private Sub ButtonMod_Click()

    '入力チェック
    If InputIsInvalid Then
        Exit Sub
    End If
    
    '更新の確認
    If MsgBox(LabelID.Caption & vbCrLf & BoxName.Value & vbCrLf & "この会員情報を更新しますか?" _
                , vbExclamation + vbOKCancel, "確認") = vbOK Then
        '更新処理
        If MemberIsModified(LabelID.Caption) Then
            
            MsgBox LabelID.Caption & vbCrLf & BoxName.Value & vbCrLf & "この会員情報を更新しました。" _
            , vbInformation + vbOKOnly, "確認"
            '検索画面のリストボックスを更新
            FilterMembers
            FormSearch.UpdateListMembers
        
        '更新中止の場合
        Else
            MsgBox LabelID.Caption & vbCrLf & BoxName.Value & vbCrLf & "この会員更新を中止しました。" _
            , vbCritical + vbOKOnly, "確認"
        End If
    
    Else
        MsgBox "キャンセルしました。", vbInformation + vbOKOnly, "確認"
    End If
    
    Unload Me

End Sub

----------------------------------------------------------------------
Private Function InputIsInvalid() As Boolean

    '名前チェック
    If BoxName.Text = "" Then
        MsgBox "名前を入力してください", vbExclamation, "名前 入力エラー"
        InputIsInvalid = True
        Exit Function
    End If

    '性別チェック
    If BoxSex.Text = "" Then
        MsgBox "性別を選択してください", vbExclamation, "性別 選択エラー"
        InputIsInvalid = True
        Exit Function
    End If

    '生年月日チェック
    DateOfBirth = BoxYear.Text & "/" & BoxMonth.Text & "/" & BoxDay.Text
    If Not (IsDate(DateOfBirth)) Then
        MsgBox "生年月日を確認してください", vbExclamation, "生年月日エラー"
        InputIsInvalid = True
        Exit Function
    End If
    
    InputIsInvalid = False
    
End Function

----------------------------------------------------------------------
Private Function MemberIsModified(ByVal inputID As String) As Boolean

    '会員情報更新処理
    Worksheets("Sheet1").Select
        
    Dim lastRow As Integer
    lastRow = Range("A1048576").End(xlUp).Row
    
    Dim i As Integer
    i = 2
    
    Do While i <= lastRow
        If Cells(i, 1).Value = inputID Then
            Cells(i, 2).Value = BoxName.Value
            Cells(i, 3).Value = BoxSex.Value
            Cells(i, 4).Value = DateOfBirth
            MemberIsModified = True
            Exit Function
        End If
        i = i + 1
    Loop
    
    MemberIsModified = False

End Function
− Memo −
  1. すべてを1プロシージャに記述すると長いので、入力チェックとワークシート更新を別プロシージャにしました。
  2. ワークシート更新の戻り値をブーリアンにしているのは、何かしら不具合が生じた場合への、念のための備えです。
  3. 生年月日については、日付妥当性チェックをしています。(2月31日も選択できるような緩い仕様のため)
  4. 更新後、更新完了のメッセージボックスを出して、フォームを閉じます。
  5. フォームを閉じたとき、検索用フォームのリストボックスの値が変更前のままだと違和感がありました。 なので、同じ条件で再検索をして、リストボックスの値を再設定しています。



キャンセルボタン クリック時

更新用フォームを閉じます。

Private Sub ButtonCancel_Click()

    Unload Me

End Sub