2016-04-12 24 views
1

Ürün adını girmek için bir metin kutusu olan bir kullanıcı formum var ve yinelenen bir ad girildiğinde kullanıcıyı uyarmak istiyorum. Bu sütuna girilen Değerler A sütununda saklanır ve A sütunum Kat-1, kat-2, Amp-0, Pji-4 gibi değerlere sahip olacaktır. Aşağıdaki kodu denedim ama bana iki kez girdi Bir 'k' girildiğinde mesaj. Esasen, 'Kat-1' için tamamen kontrol etmek ve daha sonra bir çift giriş mesajı görüntülemek istiyorum.Kullanıcı formunda bir metin kutusuna çift giriş için uyarı kullanıcısı

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

Bir 'txt_BPName_Exit' olay alt öğesinde yinelenen verileri denetleyen kodu yerleştirmeyi deneyin. Daha sonra, kullanıcı tamamen veriyi yazdıktan sonra çoğaltılmış veriyi kontrol eder ve başka bir sekmeyi tıklatmaya veya tıklamaya çalışır (yani, metin kutusu odağı kaybeder). – Tim

+0

Tim ve Stewbob önerilerine ek olarak, '' Her cel için myrange' döngüsünün aslında 'txt_BPName' TextBox akım değerinin' myrange' aralığında olanların bir kopyası olup olmadığını test etmediğini belirtmek isterim. Daha ziyade, 'myrange' çiftleri varsa,' myrange 'içeriğinin mevcut textbox değerinden bağımsız olması gerektiğinden kullanışlı olmayacak gibi görünüyor. Son olarak, bazı "GO" düğmesine basarak kullanıcının ilgili UserForm kontrollerinin değerini "toplam" olarak kontrol etmeyi öneririm: Burada çapraz kontrolleri yapabilir ve tüm geçersiz veriler hakkında kullanıcıyı bilgilendirebilirsin (eğer varsa) – user3598756

+0

öneride gerekli değişikliği yaptım. – Abhi0609

cevap

0

Yapmanız gereken şey için yanlış olayı denetliyorsunuz. Kullanıcı, metin kutunuzun içeriğinin herhangi bir bölümünü her değiştirdiğinde her zaman çalışacaktır.

Kodunuzdaki koşulların bir grup ile bu işi yapmak mümkün olabilir, ancak daha iyi bir yolu olacaktır:

txt_BPName_AfterUpdate()

odak metin kutusu bıraktı sonra AfterUpdate olay yangınları, bu yüzden Temelde kullanıcı veri girişi yaptıktan sonra.

+0

"Afterupdate" olayını kullanmayla ilgili sorun, .setfocus'u metin kutusuna geri döndürememesidir. Bu yüzden "exit" etkinliğini kullanması gerekiyor. Bence bu konuda bir konu var ama bu [dışında] bir şey bulamıyorum (http://www.mrexcel.com/forum/excel-questions/491006-visual-basic-applications-afterupdate-setfocus- not-working.html) – Tim

+0

Yardım için teşekkürler. Bir çıkış olayı kullanarak ve ardından cancel = true değerini ayarlamak sorunu çözdü. AfterUpdate ile odağı tekrar imlecin içine koymak ile ilgili bir sorun var. Sadece beforeUpdate() olayını bilmek merak ediyorum. Bu durumda yararlı olur mu? – Abhi0609

+0

Çıkış olayımın sonunda yinelenen giriş mesajını görmeme rağmen. Burada başka bir sorun var, eğer benim sütunum Kat-1 içeriyorsa, mevcut program Kat-2'nin girişine izin vermiyor, bunu çift giriş olarak düşünür. Bu kodu, Kat-1'in çift olarak yeniden girilmesi gibi düşünmesini sağlamak için değiştirmek mümkün mü? – Abhi0609