| 
    
     |  | 前述のように、テキストボックスのChangeイベントは 1文字入力されるたびに発生しますから、入力途中の
 支店コードをキー入力があるたびにチェックしても
 重複チェックはできないです。
 そこで、提案なのですが、
 UserForm1の支店コードを入力するTextBox1 を
 ComboBoxコントロールに置き換えてみてはいかがでしょうか?
 そうすると、ユーザーは ComboBox1から既存リストの一覧を
 選択するだけで、コードと対応する支店名をTextBox2 に
 表示することができます。いちいちコードをタイプする必要
 はなくなりますし、コードがどの支店名のものであるかを
 ビジブルに確認できます。
 また、こうすると、
 UserForm1の[新規登録]ボタンを押して、UserForm2 を表示して
 新規コードと支店名を登録するときも、UserForm1のComboBox1
 が使っているセル範囲をすぐ参照して、すでに既存のコードが
 がないかチェックするのも容易になります。
 
 '----------------------------------------------- UserForm1
 Option Explicit
 Private Sub UserForm_Initialize()
 Call Update支店コード表
 End Sub
 
 Sub Update支店コード表() 'UserForm1とUserForm2 から呼ばれるプロシージャ
 Dim rg As Range
 With Worksheets("Sheet1")
 Set rg = .Range("A2", .Cells(Rows.Count, 1).End(xlUp)).Resize(, 2)
 End With
 With ComboBox1
 .ColumnCount = 2
 .ColumnWidths = "40;50"
 .ColumnHeads = True
 .RowSource = rg.Address(External:=True)
 End With
 End Sub
 
 Private Sub ComboBox1_Change()
 Dim i As Long
 i = ComboBox1.ListIndex
 If i < 0 Then Exit Sub
 TextBox2.Text = ComboBox1.List(i, 1)
 TextBox3.Text = ""
 End Sub
 
 Private Sub btn新規_Click()
 UserForm2.Show 0
 End Sub
 
 '----------------------------------------------- UserForm2
 Option Explicit
 
 Private Sub btn新規登録_Click()
 Dim sCode As String
 Dim sName As String
 Dim rg As Range
 Dim m
 
 sCode = TextBox1.Text
 sName = TextBox2.Text
 If Len(sCode) < 2 Then Exit Sub
 If Len(sName) < 1 Then Exit Sub
 
 Set rg = Excel.Range(UserForm1.ComboBox1.RowSource)
 m = Application.Match(sCode, rg.Columns(1), 0)
 If IsNumeric(m) Then
 MsgBox rg.Item(m, 1) & vbTab & rg.Item(m, 2) & vbCr _
 & "は すでに登録されています"
 Else
 '---- 新規支店セット
 With rg
 .Item(rg.Rows.Count + 1, 1).Value = sCode
 .Item(rg.Rows.Count + 1, 2).Value = sName
 End With
 UserForm1.Update支店コード表
 End If
 End Sub
 
 |  |