Bu yazıyı exceltr.net altında okumak için tıklayın
[Örnek dosyayı indirmek için sayfanın en altına bakın]
Excel userform da metin kutularının (textbox) kullanım amacına göre girilmesi istenen veri için çeşitli şartları sağlaması beklenebilir. Mesela isim girilsin diye oluşturulmuş bir metin alanına rakam girilmemesi beklenir, ya da bir ürünün adetinin girileceği alana harf girilmemesi beklenir. Bunun yanında girilen metnin uzunluğunun da belli bir değerin üstünde olmaması ya da belli bir uzunluktan az veya çok olmaması istenebilir.E-posta veya telefon numarasında olduğu gibi belli bir motifte giriş yapılması da beklenebilir. Fakat işler beklentilerle yürümez. Kullanıcı ne kadar dikkatli de olsa zaman zaman hatalar vukuu bulabilir. Şahsen ben prosedür gereği doldurmam gerektiğinde, e-posta alanlarını kafadan atmaya meyilliyim. Ama karşı taraf için alanların doğruluğu hayati önem taşıyabilir. Eğer verilrle sayısal işlem de yapılacak ise özellikle giriş hatası istenmez. Bu sebeplerle girişlerin doğru olması için dua etmek yerine, veya her tarafa uyarı yazıları koymak yerine, girişlerin teknik anlamda doğru olduğunu siz garanti etmelisiniz.
Başlayalım;
Diyelim ki giriş alanımız isim için ayrılmış. Kullanıcının ismi herhangi bir uzunlukta olabilir. (Çok önemsiyorsanız: bkz)Fakat sadece metin olması gerektiğine eminsiniz. Peki bunu nasıl sağlayabilirsiniz:
-Kullanıcıya uyarı yazıları çıkartarak (böylece hatalı girişlerin büyük ihtimalle dikkatsizlik sonucu olduğunu düşünebilirsiniz)
-Metin kutusundan çıkıldığı anda veya metin kutusuna bir karakte girildiği anda kontrol ederbilirsiniz
Doğal olarak bizim ilgi alanımız ikincisi. Userform üzerinde birçok metin alanı, düğme vs varsa kullanıcı bazen fare imleci ile, bazen de tab tuşu ile başka alanlara geçebilir. Ya da kulanıcı girişini tamamladığında otomatik olarak başka alana geçiliyordur ya da enter tuşu gibi bir tuş ile bu sağlanıyordur. Geçiş şekillerinin çeşidi çok. Eğer en sonda kontrol yapacaksanız her bir geçiş olayı için kod yazmanız gerekir. En iyisi her karakter girildiğinde kontrolü yapmak.
Diyelim ki her karakter girildiğinde kontrol yaptık. Rakam girildi ise ne yapalım?”Giriş hatalı, baştan girin” uyarısı çıkarmak çok iyi bir çözüm olmaz.En iyisi hiç rakam girilemesin. Kullanıcı, rakamlara bastığında metin kutusuna etkisi olmasın.
Bunu kontrol için IsNumeric fonksiyonunu kullanabiliriz. Kullanıcıya giriş için bir engel koymayacağız, eğer rakam girer ise biz o rakamı hemen silerek o tuşa basmamış gibi bir durum yaratacağız.Bunu yaparken giriş yapılan karakterin son karakter olmayabileceğini unutmayacağız.
Bir ayrıntı daha ; kullanıcı kopyala yapıştır yaparak da isim yazabilir. Yani aynı anda birkaç karakter girebilir
Bu sebeple ve başka sakıncaları sebebiyle her bir tuşa basıldığında basılan tuşu kontrol etmek iyi bir çözüm olmaz
Bütün bunların nihayetinde rakam dışında diğer karakterlerin girilmesine izin verdik. Şimdi bu kontrolü yapan birşeyler yazalım
Private Sub TextBox1_Change() Dim i As Integer Dim str As String With TextBox1 For i = 1 To Len(TextBox1.Text) str = Mid(.Text, i, 1) If IsNumeric(str) And .Value <> vbNullString Then .Text = Mid(TextBox1.Text, 1, i - 1) & Mid(TextBox1.Text, i + 1) End If Next End With End If End Sub
Bu kodu her metin kutusunun Change olayına tekrardan yazmak yerine fonksiyona çevirelim
Private Sub SadeceMetin(obj) ' Programcı: Ebubekir Çelik . ' https://exceltr.wordpress.com Dim i As Integer Dim str As String If TypeName(obj) = "TextBox" Then With obj For i = 1 To Len(obj.Text) str = Mid(.Text, i, 1) If IsNumeric(str) And .Value <> vbNullString Then .Text = Mid(obj.Text, 1, i - 1) & Mid(obj.Text, i + 1) End If Next End With End If
Eveet oldu. Bunun kullanımı da şöyle olacak;
Private Sub TextBox1_Change() SadeceMetin TextBox1 End Sub
Şimdi de sadece sayıya izin veren bir fonksiyon yazalım. Tamamen aynı yöntemle;
Sub SadeceSayi(obj) 'Userform metin kutusuna sadece rakam girilmesine izin verir 'Kodlayan: Ebubekir Çelik Dim i As Integer Dim str As String If TypeName(obj) = "TextBox" Then With obj For i = 1 To Len(obj.Text) str = Mid(.Text, i, 1) If Not IsNumeric(str) And .Value <> vbNullString Then .Text = Mid(obj.Text, 1, i - 1) & Mid(obj.Text, i + 1) End If Next End With End If End Sub
Kulanımı da gene aynı
Private Sub TextBox2_Change() SadeceSayi TextBox2 End Sub
Kaynak kod
Dizinin bir sonraki yazısında kısıtlamaları daha da arttıracağız ; E-posta, iban, telefon numarası gibi belli bir motifi olan veya uzunluğu belli bir değerdeki alanlara bakacağız.