データ修正用のユーザーフォームを作成
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で修正したい行を選択して、更新フォームを起動させます。
女と入力されていたデータが男に更新されました。
次回は前ボタン、次ボタンでリストの行を選択できるようにします。
お疲れさまでした。
お疲れさまでした。