見出し画像

この春にやりたいこと 住所録をつくる⑫ ~「修正」~

ExcelVBAを使用して、住所録を作っていきたい。
ユーザーフォーム上に入力フォームを作り、エクセルシート上に入力データを保存する、という流れを実現していく。
今回は、前回修正したコードを利用して「修正」の動作を完成させたい。


Lst_一覧クリック時の動作

各テキストボックス、コンボボックスに値を入れるためには

下の画像のようにOpt_修正をTrueにした状態で、Lst_一覧内をクリック。画像ではID2の田中花子を選択している。すると、各Boxに田中花子のデータが反映されている。どういう仕組みか?

オプションボタンを「修正」にした状態でリストボックス内を選択すると、各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 Sub
  • List(ListIndex,列数値)でリストボックス内のデータが取得できる。ListIndexは、リストボックス内の行数値を返す。ListIndexは0から始まる。

  • If .ListIndex = 0 Then Exit SubListIndex=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にする

  • 「修正」ボタンを押す

A→Oに変更される

次回

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

いいなと思ったら応援しよう!