2016-04-12 6 views
1

У меня есть пользовательская форма с текстовым полем для ввода имени продукта, и я хотел бы предупредить пользователя, когда будет введено дублирующее имя. Значения, введенные в этот столбец, будут храниться в столбце A, а мой столбец A будет иметь значения, такие как Kat-1, kat-2, Amp-0, Pji-4 и т. Д. Я попробовал код ниже, но он дает мне дубликат записи когда вводится «k». По сути, я бы хотел, чтобы он полностью проверил «Kat-1», а затем отобразил дублирующее сообщение.Оповещать пользователя о двойной записи в текстовое поле на userform

Private Sub txt_BPName_Change() 
Dim cel As Variant 
Dim myrange As Range 
Set myrange = Worksheets("Sheet1").Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).row) 
'myrange.Interior.ColorIndex = xlNone 

For Each cel In myrange 
    If Application.WorksheetFunction.CountIf(myrange, cel) > 1 Then 
    MsgBox ("Duplicate Entry") 
Exit For 
    End If 
Next 

Dim i As Long 
Dim Count As Long 
Do 
For i = 1 To Len(txt_BPName.Text) 
    Select Case Asc(Mid(txt_BPName.Text, i, 1)) 
    Case 45, 48 To 57, 65 To 90, 97 To 122 
    'Cells(Row, 1).Select 
    ActiveCell.Formula = txt_BPName.Text 
    Count = 0 
    Case Else 
    MsgBox ("Invalid Entry") 
Exit For 
    txt_BPName.SetFocus 
    Count = 1 
End Select 
Next 
Loop While Count <> 0 

End Sub 
+0

Попробуйте поместить код, который проверяет наличие повторяющихся данных в субтитре 'txt_BPName_Exit'. Затем он будет проверять только дублированные данные после того, как пользователь полностью набрал данные и попытается выполнить табуляцию или нажать что-нибудь еще (т. Е. Текстовое поле теряет фокус). – Tim

+0

В дополнение к предложениям Тима и Стейбоба я хотел бы указать, что ваш цикл 'For Every cel In myrange' на самом деле не тестирует, если текущее значение TextBox' txt_BPName' является дубликатом того, что находится в диапазоне 'myrange'. Скорее, это тестирование, если 'myrange' имеет дубликаты, что, похоже, не полезно, поскольку контент' myrange' должен быть независимым от текущего значения текстового поля. Наконец, я предлагаю, чтобы у вас была «общая» проверка ваших соответствующих значений UserForm, когда пользователь нажимал кнопку «GO»: там вы можете выполнять скрещенные проверки и информировать пользователя обо всех недопустимых данных (если есть) – user3598756

+0

Спасибо за Я сделал необходимые изменения. – Abhi0609

ответ

0

Вы проверяете неправильное событие за то, что вам нужно сделать.

txt_BPName_Change() будет запускаться каждый раз, когда пользователь изменяет какую-либо часть содержимого вашего текстового поля.

Вы могли бы быть в состоянии сделать эту работу с кучей условий в вашем коде, но лучше было бы:

txt_BPName_AfterUpdate()

The AfterUpdate пожаров событий после того, как в центре внимания оставил текстовое поле, так в основном после того, как пользователь выполнил ввод данных в него.

+0

Проблема с использованием события after afterdate заключается в том, что он не может '.setfocus' вернуться в текстовое поле. Вот почему он должен использовать событие 'exit'. Я думаю, что на этом есть SO-поток, но я не нахожу ничего кроме [этого] (http://www.mrexcel.com/forum/excel-questions/491006-visual-basic-applications-afterupdate-setfocus- not-working.html) – Tim

+0

Спасибо за помощь. Используя выходное событие, а затем установив cancel = true, он решил проблему. С afterUpdate возникает проблема с установкой фокуса обратно в курсор. Мне просто интересно узнать о событии beforeUpdate(). Будет ли это полезно в этой ситуации? – Abhi0609

+0

Хотя я вижу дублирующее сообщение ввода в конце моего события выхода. Здесь есть еще одна проблема: если в моей колонке уже есть Kat-1, текущая программа не позволяет вводить Kat-2, она считает это дубликатной записью. Возможно ли изменить этот код, чтобы заставить его думать, как повторное включение Kat-1 в качестве дубликата. – Abhi0609

Смежные вопросы