データ修正用のユーザーフォームを作成
Excel2016,2013マクロ 36回
入力したデータを修正するための専用フォーム
ユーザーフォームから順調に入力していたとしても、人間ですから、入力ミスもありますし、修正が必要なこともでてきます。直接シート上で修正しても良いのですが、同じ形式のフォームから修正できた方が便利です。
(サンプルファイルは、こちらから
マクロ36回サンプルデータ)
Worksheetのイベントプロシージャ
以下のような表で、行を選択したときに、そこにデータがあれば、その行を修正用のユーザーフォームに取り込むようにしましょう。


VBEを起動しします。使うFORMは35回の登録フォームと同様のものですが、ボタンの名称などを変更して修正用のフォームにしています。


Sheet1を選択し、右クリックからコードの表示を選びます。Sheet1をダブルクリックしてもコードを表示できます。


コードウィンドウの左側のプルダウンでWorksheetを選択し、右側のプルダウンからは、SelectionChangeを選択します。


シートからデータをフォームに取り込む
コードは次のようにしました。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")は、使用するデータに応じて変更してください。コード記入後、行を選択すると、フォームが表示されます。

ターゲットが空じゃない時は、If以下の処理をしなさいという意味です。 Range("B5:J10000")は、使用するデータに応じて変更してください。コード記入後、行を選択すると、フォームが表示されます。

オプションボタンで入力している、性別以外は、データの値が取得できました。残るはオプションボタンの値の取得です。
セルに入力された値が男なら、男性のオプションボタンにチェックする、それ以外は女性にチェックを入れるというコードを追加します。
セルに入力された値が男なら、男性のオプションボタンにチェックする、それ以外は女性にチェックを入れるというコードを追加します。
If Cells(Target.Row, 6) = "男" Then udfrm2.OpMale.Value = True Else udfrm2.Opfemale.Value = True End If
フォームを起動すると、選択した行データを取得しました。データでは女性となっていますが、間違っているので、男性に訂正します。それを元の行に記入しなおす必要があります。
フォームを閉じてVBEに戻ります。

フォームを閉じてVBEに戻ります。

シートに更新データを上書きするコード
更新ボタン(cmdRewite)を押すと、フォーム上の訂正されたデータに修正されるようにコードを記述します。


コマンドボタンをクリックしたら、以下のコードを実行するように記述します。
コードでMeとあるのは、対象となるフォームudfrm2のことです。

コードでMeとあるのは、対象となるフォームudfrm2のことです。

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は、行を移動する時にも使います。


Excelで修正したい行を選択して、更新フォームを起動させます。


女と入力されていたデータが男に更新されました。


次回は前ボタン、次ボタンでリストの行を選択できるようにします。
お疲れさまでした。
お疲れさまでした。