Excel VBA Blog

2010-10-15

Metin Kutusuna Girişi Sınırlama-1

Filed under: VBA — Etiketler:, , , , , , , , — dutali @ 4:39 am

 

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.

WordPress.com'da Blog Oluşturun.