
エクセルVBAで住所録検索してリストを修正するユーザーフォームを作る


このページは「エクセルVBAで住所録入力フォームを作る」ページの続きとなり、入力データの修正に関するページとなります。

住所録の修正が一番面倒で時間がかかる作業ですよね。
いちいち画面スクロールして目的の顧客を探して、見つけたら修正してまた戻るって作業は時間の無駄なので、ユーザーフォームを使って一瞬で終わらせてしまいましょう。
前ページでも見ていただいた住所録フォーム、以前は新規登録フォームと修正フォームを別々にしていたのですが、多少経験値が上がったのかな?まとめることが出来たので、新しくこのページも修正していきます。
住所録を一瞬で修正するオリジナルフォーム
それでは続きを書いていきます。
【修正登録】ボタンにVBAコードを登録しよう
基本的に新規登録と修正登録の操作方法を同じにして、未登録番号ならば新規登録ができるようになり、登録済み番号ならば既存データを探して見つけたらフォーム上に自動表示されて確認・修正をして修正登録ボタンを押せば、データが元の場所に上書きされるようになっています。
- 誤って顧客番号確定ボタンが押された時のエラー回避メッセージ表示
- 修正登録するかしないかを「はい」「いいえ」で選択させる
- 「はい」を選んだらデータを上書きする
- 「いいえ」を選んだらフォームを閉じてメインメニューを表示
- 上記1~4の作業を行う時に画面が作業中チラつくので、ちらつき防止処理をする
ボタンを1回押すだけでこれだけの作業を一瞬で行ってくれるので、探す手間もなくなりますので仕事作業の効率が大幅にアップしますよ!
1、誤って顧客番号確定ボタンが押された時のエラー回避メッセージ表示
新規登録ボタン同様に、顧客番号を入力するテキストボックス(TextBox1)に顧客番号を入力して顧客番号確定ボタン(CommandButton1)を押すのが当たり前なのですが、うっかりテキストボックスに何も入力しないで押してしまった時に、メッセージを表示してあげると親切ですし、誤った操作という事をお知らせできるので設定することをおススメします。
If UserForm1.TextBox1 = “” Then
MsgBox (“会員番号が未入力です”)

2、修正登録するかしないかを「はい」「いいえ」で選択させる
顧客番号がTextBox1に入力されて顧客番号確定ボタンを押したら、登録済み番号の時は自動的に番号に該当する名前などの住所録データが自動的に各テキストボックスに表示されます。
修正を加えたら修正登録ボタンを押すとメッセージで「修正しますか?」と表示されるので「はい」「いいえ」を選択できるようにして、確認できるようにします。
msg = MsgBox(“修正登録しますか?”, Buttons:=vbYesNo + vbExclamation)

3、「はい」を選んだらデータを上書きする
エクセル住所録で一番面倒で時間と手間のかかる引っ越しなどで住所が変わった時に、修正しますが住所録リストの中から該当者を探して書き換える作業です。
この作業を一瞬で終わらせることが作業効率アップの方法なのです。
実は、顧客番号確定ボタンを押した時にカーソルが見えないところで入力した顧客番号の位置に移動しています。
そして現在のカーソルの位置を”ActiveCell“とVBAコードでは表し、ActiveCellを基準にセルの位置と入力データのやり取りを行い、ActiveCell.Offset(,1)で1列右のセルを意味しています。
If msg = vbYes Then
ActiveCell.Offset(, 1).Value = UserForm1.TextBox2.Value
ActiveCell.Offset(, 2).Value = UserForm1.TextBox3.Value
ActiveCell.Offset(, 3).Value = UserForm1.TextBox4.Value
ActiveCell.Offset(, 4).Value = UserForm1.TextBox5.Value
ActiveCell.Offset(, 5).Value = UserForm1.TextBox6.Value
ActiveCell.Offset(, 6).Value = UserForm1.TextBox7.Value
ActiveCell.Offset(, 7).Value = UserForm1.TextBox8.Value
If OptionButton4.Value = True Then
ActiveCell.Offset(, 9).Value = “男”
ElseIf OptionButton5.Value = True Then
ActiveCell.Offset(, 9).Value = “女”
End If
End If
4、「いいえ」を選んだらフォームを閉じてメインメニューを表示
データの確認だけで修正箇所が無い場合などは「いいえ」を選んだら住所録フォームを閉じて、メインメニューに必要なデータを読み込んでメインメニューを開きます。
Unload UserForm1
UserForm4.Label1.Caption = Range(“P2”).Value
UserForm4.TextBox1.Value = Range(“S2”).Value
UserForm4.TextBox2.Value = Range(“T2”).Value
UserForm4.Show
5、上記1~4の作業を行う時に画面が作業中チラつくので、ちらつき防止処理をする
顧客番号確定ボタンを押すと、ここまで記載した処理を順番に一瞬で行ってくれるのですが、その処理の度にカーソルが処理をしているセルの位置に実際は移動しています。
このままだと、画面が移動に合わせてあちこち移動するので画面がチラつき、見苦しい!
そこでちらつき防止処理するVBAコード” Application.ScreenUpdating ”の前後に入れましょう。


これで顧客番号確定ボタンのVBAコードの設定が終わりました。 下記が実際のVBAコードで、コピペして使っていただいても構いませんよ
Private Sub CommandButton3_Click()
Application.ScreenUpdating = False
If UserForm1.TextBox1 = “” Then
MsgBox (“会員番号が未入力です”)
Else
msg = MsgBox(“修正登録しますか?”, Buttons:=vbYesNo + vbExclamation)
If msg = vbYes Then
ActiveCell.Offset(, 1).Value = UserForm1.TextBox2.Value
ActiveCell.Offset(, 2).Value = UserForm1.TextBox3.Value
ActiveCell.Offset(, 3).Value = UserForm1.TextBox4.Value
ActiveCell.Offset(, 4).Value = UserForm1.TextBox5.Value
ActiveCell.Offset(, 5).Value = UserForm1.TextBox6.Value
ActiveCell.Offset(, 6).Value = UserForm1.TextBox7.Value
ActiveCell.Offset(, 7).Value = UserForm1.TextBox8.Value
If OptionButton4.Value = True Then
ActiveCell.Offset(, 9).Value = “男”
ElseIf OptionButton5.Value = True Then
ActiveCell.Offset(, 9).Value = “女”
End If
End If
End If
Unload UserForm1
UserForm4.Label1.Caption = Range(“P2”).Value
UserForm4.TextBox1.Value = Range(“S2”).Value
UserForm4.TextBox2.Value = Range(“T2”).Value
UserForm4.Show
Application.ScreenUpdating = True
End Sub
顧客番号を検索する機能
エクセルの検索機能と言えば、ワークシート上でctrl+Fでこのような画面が表示されます。

この機能を使えば、わざわざExcel-VBAを使って検索をしなくてもいいのですが、住所録のデータが入っているセルを直接触るようになるので、計算式が入っているセルを誤って消してしまったりするリスクがあります。
そのリスクを避けるためにExcel-VBAを使った検索機能と登録修正を組み合わせた方が安全です
電話番号検索ボタンにVBAコードを登録
顧客番号検索フレーム内のテキストボックス(TextBox12)に電話番号を入力して電話番号検索ボタンを押したら、住所録リストを検索して見つけたら検索結果表示をするようにしましょう。
- 誤って電話番号検索ボタンが押された時のエラー回避メッセージ表示
- テキストボックスに入力された電話番号をセルR12へ転記
- 顧客番号入力している列から入力した電話番号を探しリストアップする
- リストアップした顧客番号と名前を検索結果用フォームに書き出す
- ユーザーフォーム切替える
- 該当者がいない時はメッセージで知らせる
- 上記1~6の作業を行う時に画面が作業中チラつくので、ちらつき防止処理をする
ボタンを1回押すだけでこれだけの作業を一瞬で行ってくれるので、探す手間もなくなりますので仕事作業の効率が大幅にアップしますよ!
1、誤って電話番号検索ボタンが押された時のエラー回避メッセージ表示
修正登録ボタン同様に、電話番号を入力するテキストボックス(TextBox12)に電話番号を入力して電話番号検索ボタン(CommandButton6)を押すのが当たり前なのですが、うっかりテキストボックスに何も入力しないで押してしまった時に、メッセージを表示してあげると親切ですし、誤った操作という事をお知らせできるので設定することをおススメします。
If UserForm1.TextBox12 = “” Then
MsgBox (“電話番号が入力されていません”)

2、テキストボックスに入力された電話番号をセルR12へ転記

TextBox12に入力された電話番号をセルR12へ転記することで、R12に記載された電話番号をFindメソッドを使って、探し出せるようにします。

Range(“R12”).Value = UserForm1.TextBox12.Value

3、顧客番号を入力している列から入力した電話番号を探しリストアップする
住所録で電話番号が入力されているのはAH列なので、ここでは2行目から1000行目までを検索範囲とし、同じ条件でデータ続けて検索するにはFindNextメソッドを使います。
本来、電話番号なので同一番号がないと思ってFindメソッドを使っていましたが、ご家族などで固定電話番号で複数人登録されて、検索できなかったので繰り返し処理を行うFindNextメソッドを使う方が間違えないです。
検索して該当した電話番号から、顧客番号と名前をセルBG列・BH列にリストアップする。
Dim myRange As Range, meRange As Range, myAddress As String, i As Integer
Set meRange = Range(“AH2:AH1000”)
Set myRange = meRange.Find(What:=Range(“R12”).Value, LookIn:=xlValues)
If Not myRange Is Nothing Then
myAddress = myRange.Address
i = 2
Do
Cells(i, “BG”).Value = myRange.Offset(, -6).Value
Cells(i, “BH”).Value = myRange.Offset(, -5).Value
Set myRange = meRange.FindNext(After:=myRange)
i = i + 1
Loop Until myRange.Address = myAddress
見つけた電話番号のセルの位置にカーソルが移動し(myRange)-6なので左へ6列目のセルの値(顧客番号)をBG列の2行目から順に、-5なので左へ5列目のセルの値(名前)をBH列の2行目から順にリストアップします。

4、リストアップした顧客番号と名前を検索結果用フォームに書き出す
リストアップして書き出された顧客番号と名前を検索結果フォームに表示します。
表示方法はユーザーフォームに配置したLabelの名前(Caption)を書き換える方法です。
For j = 1 To 20
With UserForm2.Controls(“Label” & j)
.Caption = Cells(j + 1, 59).Value
End With
With UserForm2.Controls(“Label” & j + 20)
.Caption = Cells(j + 1, 60).Value
End With
Next j
ここでは最大20名分をリストアップ可能にしたので変数jは1~20となり、ラベルの数は顧客番号が1~20で名前が21~40を使用するのでj+20となります。
また取得するセル番地はj+1で2行目の59列目(BG列)、60列目(BH列)となります。
5、ユーザーフォーム切替える

Label1~20が顧客番号・21~40が名前に変わります
検索によりリストアップされた顧客番号と名前が読み込まれてからこのフォームは表示され、住所録入力フォームは閉じられてフォームの切り替えが行われます。

このフォームに表示された顧客番号をクリックすると顧客番号が入力された状態で住所録入力フォームに切り替わります。
リストアップが終わり、UserForm2にデータは引き継がれたのでセルを空欄に戻しておくことも忘れずに行います。
6、該当者がいない時はメッセージで知らせる
検索した結果該当者がいない場合はメッセージで知らせます。
Else
MsgBox “該当者がいません”
7.上記1~の6作業を行う時に画面が作業中チラつくので、ちらつき防止処理をする
電話番号検索ボタンを押すと、ここまで記載した処理を順番に一瞬で行ってくれるのですが、その処理の度にカーソルが処理をしているセルの位置に実際は移動しています。
このままだと、画面が移動に合わせてあちこち移動するので画面がチラつき、見苦しい!
そこでちらつき防止処理するVBAコード” Application.ScreenUpdating ”の前後に入れましょう。

Private Sub CommandButton6_Click()
Application.ScreenUpdating = False
If UserForm1.TextBox12 = “” Then
MsgBox (“電話番号が入力されていません”)
Else
Range(“R12”).Value = UserForm1.TextBox12.Value
Dim myRange As Range, meRange As Range, myAddress As String, i As Integer
Set meRange = Range(“AH2:AH1000”)
Set myRange = meRange.Find(What:=Range(“R12”).Value, LookIn:=xlValues)
If Not myRange Is Nothing Then
myAddress = myRange.Address
i = 2
Do
Cells(i, “BG”).Value = myRange.Offset(, -6).Value
Cells(i, “BH”).Value = myRange.Offset(, -5).Value
Set myRange = meRange.FindNext(After:=myRange)
i = i + 1
Loop Until myRange.Address = myAddress
For j = 1 To 20
With UserForm2.Controls(“Label” & j)
.Caption = Cells(j + 1, 59).Value
End With
With UserForm2.Controls(“Label” & j + 20)
.Caption = Cells(j + 1, 60).Value
End With
Next j
Unload UserForm1
UserForm2.Show
Range(“BG2:BH1000”).Value = “”
Else
MsgBox “該当者がいません”
End If
End If
Application.ScreenUpdating = True
End Sub
【フリガナ検索】ボタンにVBAコードを登録しよう
今度は電話番号の代わりにフリガナ(苗字)で顧客番号を検索できるようにします。

使用するVBAコードもほぼ電話番号検索ボタンと一緒で、違いはテキストボックスに入力されたフリガナの転記先が画像のようにQ12に変わり、FindNextメソッドのmyRange.Offsetの位置がフリガナを基準になります。
Cells(i, “BG”).Value = myRange.Offset(, -2).Value
Cells(i, “BH”).Value = myRange.Offset(, -1).Value
あとは同じVBAコードが使用できますから難しくはありません。
昭和・平成・令和から西暦にする
生年月日を記入する欄に「西暦記入」と書いてあってもなぜか、わざわざ平成○○年って書く人っていますよね。
その度に西暦に置き換えるのが意外と面倒という声があり、住所録フォームに追加したところ好評です。
作るのも簡単でエクセル関数VLOOKUPを使いワークシートに表を用意して、ユーザーフォーム上ではテキストボックスとオプションボタンで完成です。
- ワークシートに和暦と西暦の表を作成
- オプションボタンとテキストボックスの値を転記するセルと数式を準備
- VLOOKUP関数で検索した西暦をフォームに表示
ボタンを1回押すだけでこれだけの作業を一瞬で行ってくれるので、探す手間もなくなりますので仕事作業の効率が大幅にアップしますよ!
1、ワークシートに和暦と西暦の表を作成

和暦西暦ワークシート(一部抜粋)
セルW5~X229に左の図のように和暦と西暦の対照表を作っておきます。
オプションボタンで選択された和暦がセルW2
テキストボックスの年がセルX2
W2とX2とX1をくっつけてY2
- 和暦が昭和1年~昭和64年
- 平成1年~平成31年
- 令和1年~令和82年
これで西暦1926年~2100年まで対応します。
Y2の値をVLOKUP関数で見つけた西暦をY4
Y4の値をユーザーフォームに表示させる
それでは、ワークシートの準備です。
2、オプションボタンとテキストボックスの値を転記するセルと数式を準備
=W2&X2&X1
セルの値同士をくっつけるには「&」でできるようになります。
=VLOOKUP(Y2,W5:X229,2,0)
Y2が検査値、W5:X229が和暦と西暦の表の範囲、2が列番号(表の2列目「西暦」)、0が完全一致となります。
次に変換ボタンにVBAコードを書き込みます。
3、VLOOKUP関数で検索した西暦をフォームに表示
年を入力するテキストボックス(TextBox14)に年を入力して変換ボタン(CommandButton8)を押すのが当たり前なのですが、うっかりテキストボックスに何も入力しないで押してしまった時に、メッセージを表示してあげると親切ですし、誤った操作という事をお知らせできるので設定することをおススメします。
If UserForm1.TextBox14.Value = “” Then
MsgBox (“年が入力されていません”)

次にオプションボタンの設定で、選んだボタンの和暦がセルW2に転記させます。
If OptionButton1.Value = True Then
Range(“W2”).Value = “昭和”
ElseIf OptionButton2.Value = True Then
Range(“W2”).Value = “平成”
ElseIf OptionButton3.Value = True Then
Range(“W2”).Value = “令和”
ElseIf OptionButton6.Value = True Then
Range(“W2”).Value = “予備”
End If
年を入力するテキストボックス(TextBox14)の値をセルX2に転記させます。
Range(“X2”).Value = TextBox14.Text
最後に和暦西暦対照表から探し出した西暦をフォーム(Label35)に表示する。
UserForm1.Label35.Caption = Range(“Y4”).Value
これで変換ボタンで西暦が表示されるようになりました。
Private Sub CommandButton8_Click()
If UserForm1.TextBox14.Value = “” Then
MsgBox (“年が入力されていません”)
Else
If OptionButton1.Value = True Then
Range(“W2”).Value = “昭和”
ElseIf OptionButton2.Value = True Then
Range(“W2”).Value = “平成”
ElseIf OptionButton3.Value = True Then
Range(“W2”).Value = “令和”
ElseIf OptionButton6.Value = True Then
Range(“W2”).Value = “予備”
End If
Range(“X2”).Value = TextBox14.Text
UserForm1.Label35.Caption = Range(“Y4”).Value
End If
End Sub

ここまで書いた和暦を西暦にする方法、2018年当時の私自身のエクセルの知識ではこんな感じでしたが、現在ではかなりシンプルに作れるようになりました。
ちょっとだけ成長した和暦西暦変換を見ていてコピペして使ってもらえると嬉しいな!!
