この春にやりたいこと 住所録をつくる⑫ ~「修正」~
ExcelVBAを使用して、住所録を作っていきたい。
ユーザーフォーム上に入力フォームを作り、エクセルシート上に入力データを保存する、という流れを実現していく。
今回は、前回修正したコードを利用して「修正」の動作を完成させたい。
Lst_一覧クリック時の動作
各テキストボックス、コンボボックスに値を入れるためには
下の画像のようにOpt_修正をTrueにした状態で、Lst_一覧内をクリック。画像ではID2の田中花子を選択している。すると、各Boxに田中花子のデータが反映されている。どういう仕組みか?

コード作成
Private Sub Lst_一覧_Click()
With Lst_一覧
If .ListIndex = 0 Then Exit Sub
Txt_ID.Text = .List(.ListIndex, 0)
Txt_名前.Text = .List(.ListIndex, 1)
Txt_読み仮名.Text = .List(.ListIndex, 2)
Txt_頭文字.Text = .List(.ListIndex, 3)
Cmb_性別.Text = .List(.ListIndex, 4)
Cmb_血液型.Text = .List(.ListIndex, 5)
Txt_生年月日.Text = .List(.ListIndex, 6)
Txt_郵便番号.Text = .List(.ListIndex, 7)
Txt_都道府県.Text = .List(.ListIndex, 8)
Txt_市区町村.Text = .List(.ListIndex, 9)
Txt_町域.Text = .List(.ListIndex, 10)
Txt_町域以降.Text = .List(.ListIndex, 11)
Txt_電話番号.Text = .List(.ListIndex, 12)
Txt_メールアドレス.Text = .List(.ListIndex, 13)
Txt_備考欄.Text = .List(.ListIndex, 14)
End With
End SubList(ListIndex,列数値)でリストボックス内のデータが取得できる。ListIndexは、リストボックス内の行数値を返す。ListIndexは0から始まる。
If .ListIndex = 0 Then Exit SubはListIndex=0の場合は処理から抜ける、という意味。ListIndex=0は1行目。ヘッダー部分だ。ヘッダーを各Boxに表示させるのは意味がないのでこの一文を加えている。
このように各Boxにデータを表示させた状態で、該当するBoxの値を修正する、という流れになる。では、どのように修正コードを書けばいいか?
コード作成
Private Sub Btn_修正_Click()
Dim R As Long, LR As Long
With Sheets("住所録")
LR = .Cells(Rows.Count, 1).End(xlUp).Row
For R = 2 To LR ’住所録シートの2行目~最下行のIDをForNextで回してTxt_IDと同じだった場合
If Txt_ID.Text = .Cells(R, 1).Value Then
.Cells(R, 2).Value = Txt_名前.Text
.Cells(R, 3).Value = Txt_読み仮名.Text
.Cells(R, 4).Value = Txt_頭文字.Text
.Cells(R, 5).Value = Cmb_性別.Text
.Cells(R, 6).Value = Cmb_血液型.Text
.Cells(R, 7).Value = Txt_生年月日.Text
.Cells(R, 8).Value = Txt_郵便番号.Text
.Cells(R, 9).Value = Txt_都道府県.Text
.Cells(R, 10).Value = Txt_市区町村.Text
.Cells(R, 11).Value = Txt_町域.Text
.Cells(R, 12).Value = Txt_町域以降.Text
.Cells(R, 13).Value = Txt_電話番号.Text
.Cells(R, 14).Value = Txt_メールアドレス.Text
.Cells(R, 15).Value = Txt_備考欄.Text
’各Boxに値を修正していれる。
End If
Next R
End With
Call TextBox内の値を消去
End Sub一見、「登録」の時のコードを似ているように見える。しかし微妙に違う。
ForNextで住所録シートの2行名から最下行のIDと、Txt_IDが同じであれば、各Boxの値を、ForNextでIDが一致した行の値を、各Boxの値に上書きする、という動作になる。
ややこしそうだが、まあそうでもない。何回もコードを書けば見えてくる。
実際に動かす
とりあえずID1の山田太郎の血液型をO型に変えてみたい。

Lst_一覧からID1の行を選択。各Boxに値を反映させる。
Cmb_血液型の値をOにする
「修正」ボタンを押す

次回
「削除」まで行きたかったが、今回はここまで。次回は「削除」をやりたい。「修正」と「削除」は動作がよく似ているのでさらっと終わらせる。
