What is going on with this article? このページは「エクセルVBAで住所録入力フォームを作る」ページの続きとなり、入力データの修正に関するページとなります。, いちいち画面スクロールして目的の顧客を探して、見つけたら修正してまた戻るって作業は時間の無駄なので、ユーザーフォームを使って一瞬で終わらせてしまいましょう。, 前ページでも見ていただいた住所録フォーム、以前は新規登録フォームと修正フォームを別々にしていたのですが、多少経験値が上がったのかな?まとめることが出来たので、新しくこのページも修正していきます。, 基本的に新規登録と修正登録の操作方法を同じにして、未登録番号ならば新規登録ができるようになり、登録済み番号ならば既存データを探して見つけたらフォーム上に自動表示されて確認・修正をして修正登録ボタンを押せば、データが元の場所に上書きされるようになっています。, ボタンを1回押すだけでこれだけの作業を一瞬で行ってくれるので、探す手間もなくなりますので仕事作業の効率が大幅にアップしますよ!, 新規登録ボタン同様に、顧客番号を入力するテキストボックス(TextBox1)に顧客番号を入力して顧客番号確定ボタン(CommandButton1)を押すのが当たり前なのですが、うっかりテキストボックスに何も入力しないで押してしまった時に、メッセージを表示してあげると親切ですし、誤った操作という事をお知らせできるので設定することをおススメします。, If UserForm1.TextBox1 = “” ThenMsgBox (“会員番号が未入力です”), 顧客番号がTextBox1に入力されて顧客番号確定ボタンを押したら、登録済み番号の時は自動的に番号に該当する名前などの住所録データが自動的に各テキストボックスに表示されます。, 修正を加えたら修正登録ボタンを押すとメッセージで「修正しますか?」と表示されるので「はい」「いいえ」を選択できるようにして、確認できるようにします。, msg = MsgBox(“修正登録しますか?”, Buttons:=vbYesNo + vbExclamation), エクセル住所録で一番面倒で時間と手間のかかる引っ越しなどで住所が変わった時に、修正しますが住所録リストの中から該当者を探して書き換える作業です。, 実は、顧客番号確定ボタンを押した時にカーソルが見えないところで入力した顧客番号の位置に移動しています。, そして現在のカーソルの位置を”ActiveCell“とVBAコードでは表し、ActiveCellを基準にセルの位置と入力データのやり取りを行い、ActiveCell.Offset(,1)で1列右のセルを意味しています。, If msg = vbYes ThenActiveCell.Offset(, 1).Value = UserForm1.TextBox2.ValueActiveCell.Offset(, 2).Value = UserForm1.TextBox3.ValueActiveCell.Offset(, 3).Value = UserForm1.TextBox4.ValueActiveCell.Offset(, 4).Value = UserForm1.TextBox5.ValueActiveCell.Offset(, 5).Value = UserForm1.TextBox6.ValueActiveCell.Offset(, 6).Value = UserForm1.TextBox7.ValueActiveCell.Offset(, 7).Value = UserForm1.TextBox8.ValueIf OptionButton4.Value = True ThenActiveCell.Offset(, 9).Value = “男”ElseIf OptionButton5.Value = True ThenActiveCell.Offset(, 9).Value = “女”End IfEnd If, データの確認だけで修正箇所が無い場合などは「いいえ」を選んだら住所録フォームを閉じて、メインメニューに必要なデータを読み込んでメインメニューを開きます。, Unload UserForm1UserForm4.Label1.Caption = Range(“P2”).ValueUserForm4.TextBox1.Value = Range(“S2”).ValueUserForm4.TextBox2.Value = Range(“T2”).ValueUserForm4.Show, 顧客番号確定ボタンを押すと、ここまで記載した処理を順番に一瞬で行ってくれるのですが、その処理の度にカーソルが処理をしているセルの位置に実際は移動しています。, そこでちらつき防止処理するVBAコード” Application.ScreenUpdating ”の前後に入れましょう。, これで顧客番号確定ボタンのVBAコードの設定が終わりました。 下記が実際のVBAコードで、コピペして使っていただいても構いませんよ, Private Sub CommandButton3_Click()Application.ScreenUpdating = FalseIf UserForm1.TextBox1 = “” ThenMsgBox (“会員番号が未入力です”)Elsemsg = MsgBox(“修正登録しますか?”, Buttons:=vbYesNo + vbExclamation)If msg = vbYes ThenActiveCell.Offset(, 1).Value = UserForm1.TextBox2.ValueActiveCell.Offset(, 2).Value = UserForm1.TextBox3.ValueActiveCell.Offset(, 3).Value = UserForm1.TextBox4.ValueActiveCell.Offset(, 4).Value = UserForm1.TextBox5.ValueActiveCell.Offset(, 5).Value = UserForm1.TextBox6.ValueActiveCell.Offset(, 6).Value = UserForm1.TextBox7.ValueActiveCell.Offset(, 7).Value = UserForm1.TextBox8.ValueIf OptionButton4.Value = True ThenActiveCell.Offset(, 9).Value = “男”ElseIf OptionButton5.Value = True ThenActiveCell.Offset(, 9).Value = “女”End IfEnd IfEnd IfUnload UserForm1UserForm4.Label1.Caption = Range(“P2”).ValueUserForm4.TextBox1.Value = Range(“S2”).ValueUserForm4.TextBox2.Value = Range(“T2”).ValueUserForm4.ShowApplication.ScreenUpdating = TrueEnd Sub, エクセルの検索機能と言えば、ワークシート上でctrl+Fでこのような画面が表示されます。, この機能を使えば、わざわざExcel-VBAを使って検索をしなくてもいいのですが、住所録のデータが入っているセルを直接触るようになるので、計算式が入っているセルを誤って消してしまったりするリスクがあります。, そのリスクを避けるためにExcel-VBAを使った検索機能と登録修正を組み合わせた方が安全です, 顧客番号検索フレーム内のテキストボックス(TextBox12)に電話番号を入力して電話番号検索ボタンを押したら、住所録リストを検索して見つけたら検索結果表示をするようにしましょう。, 修正登録ボタン同様に、電話番号を入力するテキストボックス(TextBox12)に電話番号を入力して電話番号検索ボタン(CommandButton6)を押すのが当たり前なのですが、うっかりテキストボックスに何も入力しないで押してしまった時に、メッセージを表示してあげると親切ですし、誤った操作という事をお知らせできるので設定することをおススメします。, If UserForm1.TextBox12 = “” ThenMsgBox (“電話番号が入力されていません”), TextBox12に入力された電話番号をセルR12へ転記することで、R12に記載された電話番号をFindメソッドを使って、探し出せるようにします。, Range(“R12”).Value = UserForm1.TextBox12.Value, 住所録で電話番号が入力されているのはAH列なので、ここでは2行目から1000行目までを検索範囲とし、同じ条件でデータ続けて検索するにはFindNextメソッドを使います。, 本来、電話番号なので同一番号がないと思ってFindメソッドを使っていましたが、ご家族などで固定電話番号で複数人登録されて、検索できなかったので繰り返し処理を行うFindNextメソッドを使う方が間違えないです。, 検索して該当した電話番号から、顧客番号と名前をセルBG列・BH列にリストアップする。, Dim myRange As Range, meRange As Range, myAddress As String, i As IntegerSet meRange = Range(“AH2:AH1000”)Set myRange = meRange.Find(What:=Range(“R12”).Value, LookIn:=xlValues)If Not myRange Is Nothing ThenmyAddress = myRange.Addressi = 2DoCells(i, “BG”).Value = myRange.Offset(, -6).ValueCells(i, “BH”).Value = myRange.Offset(, -5).ValueSet myRange = meRange.FindNext(After:=myRange)i = i + 1Loop Until myRange.Address = myAddress, 見つけた電話番号のセルの位置にカーソルが移動し(myRange)-6なので左へ6列目のセルの値(顧客番号)をBG列の2行目から順に、-5なので左へ5列目のセルの値(名前)をBH列の2行目から順にリストアップします。, 表示方法はユーザーフォームに配置したLabelの名前(Caption)を書き換える方法です。, For j = 1 To 20With UserForm2.Controls(“Label” & j).Caption = Cells(j + 1, 59).ValueEnd WithWith UserForm2.Controls(“Label” & j + 20).Caption = Cells(j + 1, 60).ValueEnd WithNext j, ここでは最大20名分をリストアップ可能にしたので変数jは1~20となり、ラベルの数は顧客番号が1~20で名前が21~40を使用するのでj+20となります。, また取得するセル番地はj+1で2行目の59列目(BG列)、60列目(BH列)となります。, 検索によりリストアップされた顧客番号と名前が読み込まれてからこのフォームは表示され、住所録入力フォームは閉じられてフォームの切り替えが行われます。, このフォームに表示された顧客番号をクリックすると顧客番号が入力された状態で住所録入力フォームに切り替わります。, リストアップが終わり、UserForm2にデータは引き継がれたのでセルを空欄に戻しておくことも忘れずに行います。, 電話番号検索ボタンを押すと、ここまで記載した処理を順番に一瞬で行ってくれるのですが、その処理の度にカーソルが処理をしているセルの位置に実際は移動しています。, Private Sub CommandButton6_Click()Application.ScreenUpdating = FalseIf UserForm1.TextBox12 = “” ThenMsgBox (“電話番号が入力されていません”)ElseRange(“R12”).Value = UserForm1.TextBox12.ValueDim myRange As Range, meRange As Range, myAddress As String, i As IntegerSet meRange = Range(“AH2:AH1000”)Set myRange = meRange.Find(What:=Range(“R12”).Value, LookIn:=xlValues)If Not myRange Is Nothing ThenmyAddress = myRange.Addressi = 2DoCells(i, “BG”).Value = myRange.Offset(, -6).ValueCells(i, “BH”).Value = myRange.Offset(, -5).ValueSet myRange = meRange.FindNext(After:=myRange)i = i + 1Loop Until myRange.Address = myAddressFor j = 1 To 20With UserForm2.Controls(“Label” & j).Caption = Cells(j + 1, 59).ValueEnd WithWith UserForm2.Controls(“Label” & j + 20).Caption = Cells(j + 1, 60).ValueEnd WithNext jUnload UserForm1UserForm2.ShowRange(“BG2:BH1000”).Value = “”ElseMsgBox “該当者がいません”End IfEnd IfApplication.ScreenUpdating = TrueEnd Sub, 使用するVBAコードもほぼ電話番号検索ボタンと一緒で、違いはテキストボックスに入力されたフリガナの転記先が画像のようにQ12に変わり、FindNextメソッドのmyRange.Offsetの位置がフリガナを基準になります。, Cells(i, “BG”).Value = myRange.Offset(, -2).ValueCells(i, “BH”).Value = myRange.Offset(, -1).Value, 生年月日を記入する欄に「西暦記入」と書いてあってもなぜか、わざわざ平成○○年って書く人っていますよね。, その度に西暦に置き換えるのが意外と面倒という声があり、住所録フォームに追加したところ好評です。, 作るのも簡単でエクセル関数VLOOKUPを使いワークシートに表を用意して、ユーザーフォーム上ではテキストボックスとオプションボタンで完成です。, Y2が検査値、W5:X229が和暦と西暦の表の範囲、2が列番号(表の2列目「西暦」)、0が完全一致となります。, 年を入力するテキストボックス(TextBox14)に年を入力して変換ボタン(CommandButton8)を押すのが当たり前なのですが、うっかりテキストボックスに何も入力しないで押してしまった時に、メッセージを表示してあげると親切ですし、誤った操作という事をお知らせできるので設定することをおススメします。, If UserForm1.TextBox14.Value = “” ThenMsgBox (“年が入力されていません”), If OptionButton1.Value = True ThenRange(“W2”).Value = “昭和”ElseIf OptionButton2.Value = True ThenRange(“W2”).Value = “平成”ElseIf OptionButton3.Value = True ThenRange(“W2”).Value = “令和”ElseIf OptionButton6.Value = True ThenRange(“W2”).Value = “予備”End If, UserForm1.Label35.Caption = Range(“Y4”).Value, Private Sub CommandButton8_Click()If UserForm1.TextBox14.Value = “” ThenMsgBox (“年が入力されていません”)ElseIf OptionButton1.Value = True ThenRange(“W2”).Value = “昭和”ElseIf OptionButton2.Value = True ThenRange(“W2”).Value = “平成”ElseIf OptionButton3.Value = True ThenRange(“W2”).Value = “令和”ElseIf OptionButton6.Value = True ThenRange(“W2”).Value = “予備”End IfRange(“X2”).Value = TextBox14.TextUserForm1.Label35.Caption = Range(“Y4”).ValueEnd IfEnd Sub, ここまで書いた和暦を西暦にする方法、2018年当時の私自身のエクセルの知識ではこんな感じでしたが、現在ではかなりシンプルに作れるようになりました。.