データ修正用のユーザーフォームを作成

データ修正用のユーザーフォームを作成
データ修正用のユーザーフォームを作成

Excel2016,2013マクロ 36回

入力したデータを修正するための専用フォーム

ユーザーフォームから順調に入力していたとしても、人間ですから、入力ミスもありますし、修正が必要なこともでてきます。直接シート上で修正しても良いのですが、同じ形式のフォームから修正できた方が便利です。


(サンプルファイルは、こちらから マクロ36回サンプルデータ

Worksheetのイベントプロシージャ

以下のような表で、行を選択したときに、そこにデータがあれば、その行を修正用のユーザーフォームに取り込むようにしましょう。
データ修正用のユーザーフォームを作成マクロ1
VBEを起動しします。使うFORMは35回の登録フォームと同様のものですが、ボタンの名称などを変更して修正用のフォームにしています。
データ修正用のユーザーフォームを作成マクロ2
Sheet1を選択し、右クリックからコードの表示を選びます。Sheet1をダブルクリックしてもコードを表示できます。
データ修正用のユーザーフォームを作成マクロ3
コードウィンドウの左側のプルダウンでWorksheetを選択し、右側のプルダウンからは、SelectionChangeを選択します。
データ修正用のユーザーフォームを作成マクロ4

シートからデータをフォームに取り込む

コードは次のようにしました。udfrm2は更新用に変更したフォームの名称です。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("B5:J10000")) Is Nothing Then
    If Target.Address = Target.EntireRow.Address Then
        udfrm2.txtNo.Value  = Cells(Target.Row, 2).Value 
        udfrm2.txtName.Value  = Cells(Target.Row, 3).Value 
        udfrm2.txtID.Value  = Cells(Target.Row, 4).Value 
        udfrm2.txtad.Value  = Cells(Target.Row, 5).Value 
        udfrm2.combblood.Value  = Cells(Target.Row, 7)
        udfrm2.txtAge.Value  = Cells(Target.Row, 8).Value 
        udfrm2.Show
   End If
  End If
End Sub
If Not Intersect(Target, Range("B5:J10000")) Is Nothing Then
ターゲットが空じゃない時は、If以下の処理をしなさいという意味です。 Range("B5:J10000")は、使用するデータに応じて変更してください。コード記入後、行を選択すると、フォームが表示されます。
データ修正用のユーザーフォームを作成マクロ5
オプションボタンで入力している、性別以外は、データの値が取得できました。残るはオプションボタンの値の取得です。
セルに入力された値が男なら、男性のオプションボタンにチェックする、それ以外は女性にチェックを入れるというコードを追加します。
            If Cells(Target.Row, 6) = "男" Then
                udfrm2.OpMale.Value = True
            Else
                udfrm2.Opfemale.Value = True
            End If
フォームを起動すると、選択した行データを取得しました。データでは女性となっていますが、間違っているので、男性に訂正します。それを元の行に記入しなおす必要があります。
フォームを閉じてVBEに戻ります。
データ修正用のユーザーフォームを作成マクロ6

シートに更新データを上書きするコード

更新ボタン(cmdRewite)を押すと、フォーム上の訂正されたデータに修正されるようにコードを記述します。
データ修正用のユーザーフォームを作成マクロ7
コマンドボタンをクリックしたら、以下のコードを実行するように記述します。
コードでMeとあるのは、対象となるフォームudfrm2のことです。
データ修正用のユーザーフォームを作成マクロ8
xは行ナンバーです。行ナンバーはWorksheet_SelectionChangeのイベントで、 Target.Address = Target.EntireRow.Addressとして取得しているので、それを無駄にせず、フォームにテキストラベルを作成し表示しておくことにします。Worksheet_SelectionChangeに1行追加しておきます。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("B5:J10000")) Is Nothing Then
    If Target.Address = Target.EntireRow.Address Then
        udfrm2.txtNo.Value = Cells(Target.Row, 2).Value
        udfrm2.txtName.Value = Cells(Target.Row, 3).Value
        udfrm2.txtID.Value = Cells(Target.Row, 4).Value
        udfrm2.txtad.Value = Cells(Target.Row, 5).Value
        udfrm2.combblood.Value = Cells(Target.Row, 7).Value
        udfrm2.txtAge = Cells(Target.Row, 8).Value
        udfrm2.lbRow = Target.Row
            If Cells(Target.Row, 6) = "男" Then
                udfrm2.OpMale.Value = True
            Else
                udfrm2.Opfemale.Value = True
            End If
        udfrm2.Show
   End If
  End If
End Sub
ラベルに表示したudfrm2.lbRow = Target.Rowは、行を移動する時にも使います。
データ修正用のユーザーフォームを作成マクロ9
Excelで修正したい行を選択して、更新フォームを起動させます。
データ修正用のユーザーフォームを作成マクロ10
女と入力されていたデータが男に更新されました。
データ修正用のユーザーフォームを作成マクロ11
次回は前ボタン、次ボタンでリストの行を選択できるようにします。
お疲れさまでした。