|
前述のように、テキストボックスの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
|
|