TextBox'ta Sadece Rakam

Excel vba da TextBox'a sadece sayı girilmesini istiyorsak, bunu gerçekleştirmenin bir çok yöntemi var. Aşağıda bu yöntemlerden ikisi ele alınmıştır. Bu yöntemler ele alınırken Bölgesel dil ayarları göz önünde bulundurularak kodlanmıştır. Bölgesel dil ayarlarının değişmesi kodların çalışmasına bir etkisi olmaz. KeyPress ile klavyeden sayı harici girişlerin engellenmesi ve RegExp ifadesi ile textbox'a girişlerin sayı olup olmadığının kontrolü. Bu iki yöntemin tam sayı, ondalık'lı sayı ve negatif sayı olarak ayrı ayrı uygulanışını anlatmaya çalıştım. Size uygun olan yöntemi seçip kullanabilirsiniz veya her iki yöntemide aynı anda kullanabilirsiniz. Her iki yöntemde textbox'a klavyeden ve kopyala yapıştırdan gelen sayı harici girişleri engeller ve binlik ayırıcı ile biçimlendirir.

 

  • KeyPress İle Klavyeden Tam Sayı Harici Girişi Engellemek
  • RegExp İle TextBox'a Tam Sayı Harici Girişi Engellemek
  • KeyPress İle Klavyeden Sadece Ondalık'lı Sayı ve Tam Sayı Harici Girişi Engellemek
  • RegExp İle TextBox'a Ondalık'lı Sayı ve Tam Sayı Harici Girişi Engellemek
  • KeyPress İle Klavyeden Sadece Negatif Sayı, Ondalık'lı Sayı ve Tam Sayı Harici Girişi Engellemek
  • RegExp İle TextBox'a Negatif Sayı, Ondalık'lı Sayı ve Tam Sayı Harici Girişi Engellemek
  • IsNumeric İle TextBox'a Tam Sayı Harici Girişi Engellemek
  •  

  • Sadece Tam Sayı Girişi
  • Excel Vba UserForm üzerinde oluşturduğumuz textbox'a sadece rakam girilmesini istiyorsak, userformun kod bölümünde textbox'sun KeyPress olayına aşağıdaki kodları yerleştiriyoruz. Bu kod bloku klavyeden textboxa rakam haricindeki tüm girişleri engeller yok sayar.

    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
         Select Case KeyAscii
         	Case 48 To 57
    
            Case Else
            	KeyAscii = 0 
         End Select
    End Sub
    

    KeyPress olayında Klavyeden Basılan Tuşun KeyAscii Kodunu Öğreniyoruz. KeyAscii kodları konusuna burdan ulaşabilirsiniz.

    Select Case Deyimi ile KeyAscii Koduna Göre Denetim Yapıyoruz.

    KeyAscii tablosunda 48 ile 57 Arasındaki Ascii Kodları Klavyedeki Sıfır ile Dokuz Arasındaki Rakamları Temsil Eder.

    Case 48 To 57 Eğer Klavyeden, Sıfır ile Dokuz Arasındaki Bir Rakama Basılmışsa, Denetiminin Altını Boş Bırakarak Müdahale Etme, İzin Ver Dedik.

    Case 48 To 57  yerine    Case vbKey0 To vbKey9    veya    Case Asc("0") To Asc("9")    şeklinde de Kod Yazılabiliriz Sonuç Aynı Olacaktır.

    Case Else Klavyeden basılan tuşun KeyAcii değeri 48 ile 57 arasında değilse KeyAscii = 0 Kodu ile Textbox'a Hiçbir Şey Yazmamasını Bildirdik.

    !..Bu Kod Klavyeden TextBox'a Sayı Harici Girişleri Engeller Ama Kopyala Yapıştırla Gelen Girişlere Engel Olamaz..!

    Textbox'a Kopyala Yapıştırı Engellemek İçin Keydown Olayına Aşağıdaki Kodu Yazıyoruz.
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If (Shift = 2 And KeyCode = vbKeyV) Or (Shift = 1 And KeyCode = vbKeyInsert) Then
            KeyCode = 0
        End If
    End Sub
    

    Textbox’sun KeyDown Olayı İle Klavyeden Ctrl +V ve Shift + Insert tuş Kombinasyonları ile Kopyala Yapıştır Yapılmasını Engelledik.

    KeyDown Olayında Klavyeden Basılan Tuşun KeyCode Kodunu Öğreniyoruz. KeyCode kodları konusuna burdan ulaşabilirsiniz.

    Eğer (Shift = 2 And KeyCode = vbKeyV) Ctrl + V Klavye Tuşlarına Basıldıysa (Shift = 2 Ctrl tuşuna basıldığını ifade eder. Shift = 1 Ctrl tuşuna basıldığını ifade eder) Veya (Shift = 1 And KeyCode = vbKeyInsert) Shift + Insert Tuşlarına Basıldıysa Engelle Demiş Olduk.

    Not:Bu kodların Karşılığı KeyAscii de Olmadığı için Keydown da Yaptık.


    Textbox'a İlk Girilen Rakam Sıfır Olmasın İstiyorsak Keypress Kodumuzu Aşağıdaki Gibi Revize Ediyoruz.

    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    	Select Case KeyAscii
    		Case 49 To 57
    
    		Case 48
    			If Len(Trim(TextBox1.Value & vbNullString)) = 0 Then
    				KeyAscii = 0
    			End If
    		Case Else
    			KeyAscii = 0 
    	End Select
    End Sub
    


    Textbox'a Sayı Girdikçe Binlik Ayraçla Biçimlendirilmesini istiyorsak (Örnek 92.582) Aşağıdaki Kodu Ekliyoruz

    Private Sub TextBox1_Change()
        TextBox1 = Format(TextBox1, "#,##0")
    End Sub
    


    Konu Videosuna Aşağıdaki Linkten Ulaşabilirsiniz.

    TetBox'a Sadece Sayı Girişi (Tam Sayı)

    Örnek Dosya İndir







  • RegExp İle TextBox'a Sadece Tam Sayı

  • RegExp İle TextBox'a Sadece Tam Sayı Kodu, KeyPress ile Klavyeden Sayı Harici Girişi Engellemek Ve KeyDown İle Kopyala Yapıştırı Engellemek Kodlarının Birleşmiş Halidir.

    Aralarındaki Fark RegExp Kopyala Yapıştıra İzin Verir Ama Kopyala Yapıştırla Gelen Veriden Sadece Sayıları Textbox'ta Bırakır, Sayı Haricini Siler.

    Private Sub TextBox1_Change()
        Dim rgxp As Object
        Set rgxp = CreateObject("vbscript.RegExp")
        
        If Len(Trim(TextBox1.Value & vbNullString)) > 0 Then
            With rgxp
                .Pattern = "[^0-9]" 
                .Global = True
                TextBox1 = .Replace(TextBox1, vbNullString)
             End With
        End If
    End Sub
    


    Change Olayı TextBox'a Her Veri Girişinde Otomatik Olarak Çalışır. Kodumuza öncelikle RexExp'i Programımıza Tanıtarak Başlıyoruz. Dim rgxp As Object ve Set rgxp = CreateObject("vbscript.RegExp") Kodları Gec Bağlantı Türü İle RegExp'i Tanımladık.


    RegExp'in Erken Bağlantı şeçeneğinde Kütüphaneden Microsoft VBScript Regular Expressions 5.5 işaretleyek Dim rgxp As RegExp ve Set rgxp = New RegExp Kodları ile Erken Bağlantı Türünü Yapabiliriz.

    Erken Bağlantı İle Geç Bağlantı Arasındaki Fark Erken Bağlantıda Kod Yazarken, Kodun Tamamlama Özeliği Devreye Girer Bu da Bize Kodun Neler İçerebileceği Hakkın da Fikir Verir.

    RegExp Kodumuzu Tanımladıktan Sonra .Pattern = "[^0-9]" Kodu İle RegExp İfademizi Tanımlıyoruz.

    [^0-9] Kodu Sıfır İle Dokuz Arasındaki Rakamları İfade Eder.

    TextBox1 = .Replace(TextBox1, vbNullString) Kodu İle Textbox'a Girilen Verilerden RegExp İfademize Uymayanlarını Siler. İfademizde Sıfır ile Dokuz Arasındaki Rakamlar Olduğu İçin TextBox'a Sayı Harici Girişleri Siler.

    Textbox'a İlk Girilen Rakam Sıfır Olmasın İstiyorsak RegExp İfademizi Aşağıdaki Gibi Revize Ediyoruz.

    Private Sub TextBox1_Change()
        Dim rgxp As Object
        Set rgxp = CreateObject("vbscript.RegExp")
        
        If Len(Trim(TextBox1.Value & vbNullString)) > 0 Then
            With rgxp
                .Pattern = "^0|[^0-9]" 
                .Global = True
                TextBox1 = .Replace(TextBox1, vbNullString)
             End With
        End If
    End Sub
    


    "^0|[^0-9]" RegExp İfademizde, TextBox'a Giren İlk Karakter Sıfır Olamaz İlk Karakter Girdikten Sonra Sıfır İle Dokuz Rakamları Arasındaki rakamlar haricinde Veri Girişi Olamaz Dedik.

    Textbox'a Sayı Girdikçe Binlik Ayraçla Biçimlendirilmesini istiyorsak (Örnek 92.582) Kodu Aşağıdaki Gibi Revize Ediyoruz.

    Private Sub TextBox1_Change()
        Dim rgxp As Object
        Set rgxp = CreateObject("vbscript.RegExp")
        
        If Len(Trim(TextBox1.Value & vbNullString)) > 0 Then
            With rgxp
                .Pattern = "^0|[^0-9]" 
                .Global = True
                TextBox1 = Format(.Replace(TextBox1, vbNullString), "#,##0")
             End With
        End If
    End Sub
    


    Konu Videosuna Aşağıdaki Linkten Ulaşabilirsiniz.

    TetBox'a RegExp İfadesi İle Sadece Sayı Girişi (Tam Sayı)


    Örnek Dosya İndir








  • Sadece Tam Sayı ve Ondalıklı Sayı Girişi
  • Yukarıdaki kod tam sayılar için uygundur ama ondalıklı sayılarda bölgesel dil ayarlarımıza göre virgül veya nokta girişinede izin vermemiz ve Kontrol altına almamız gerekir.
    Öncelikle exceli açtığımızda excelin bölgesel dil ayarlarını kulanmasını sağlayacak kodları resimde de işaretlendiği gibi BuÇalışmaKitabı objesinin kod bölümüne aşağıdaki kodları yazıyoruz.
    Private Sub Workbook_Open()
    If Application.UseSystemSeparators = False Then
    	Application.UseSystemSeparators = True
    End If
    End Sub
    

    2019 Excel de Sırasıyla Dosya-Diğer-Seçenekler-Gelişmiş Seçeneğinde Düzenleme Seçenekleri başlığı altında Sistem Ayırıcılarını kullan seçeneğini aktif ederek excelin Bölgesel Dil ayarlarını kullanmasını sağlayabiliriz.

     

     

     

     

     

     

     

     

    Excelin Bölgesel Dil ayarlarını kullanmasını sağladıktan sonra Userformun kod bölümünde textbox'sun KeyPress olayına aşağıdaki kodları yazıyoruz. Bu kod bloku klavyeden textboxa rakam ve Bölgesel Dil ayarlarındaki ondalık ayraç haricindeki tüm girişleri engeller yok sayar.

    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        Select Case KeyAscii
            Case 44, 46
                If InStr(1, TextBox1.Text, Application.International(xlDecimalSeparator)) > 0 Or Len(Trim(TextBox1.Value & vbNullString)) = 0 Then
                    KeyAscii = 0
                Else
                    KeyAscii = Asc(Application.International(xlDecimalSeparator))
                End If
            Case 48 To 57
            
            Case Else
                KeyAscii = 0
        End Select
    End Sub
    

    KeyPress olayında Klavyeden Basılan Tuşun KeyAscii Kodunu Öğreniyoruz. KeyAscii kodları konusuna burdan ulaşabilirsiniz.

    Select Case Deyimi ile KeyAscii Koduna Göre Denetim Yapıyoruz.

    KeyAscii tablosunda, 44 Ascii kodu, virgülü 46 noktayı Temsil Eder.

    Case 44, 46 Klavyeden Virgül veya Noktaya basılmışsa

    InStr(1, TextBox1.Text, Application.International(xlDecimalSeparator)) > 0 Bu kodla textbox'ta ondalık ayracın olup olmadığını kontrol ediyoruz (Bölgesel Dil ayarında ondalık ayraç virgülse Virgülü noktaysa Noktayı). Textbox'ta ondalık ayraç varsa ikinci ondalık ayracın basımını KeyAscii = 0 kodu ile iptal eder.

    NOT: KeyPress Olayı klavyenin tuşuna basıldığı an çalışmaya başlar biz virgüle bastığımızda virgül textbox'ta yer almamış olur bu sebepten yukardaki ondalık ayraç varmı kontrolüne, keypress olayının çalışmasını sağlayan virgül girmemiş oluyor.

    Len(Trim(TextBox1.Value & vbNullString)) = 0 Bu kodla textbox'sun uzunluğunu kontrol ediyoruz. Textbox boşsa basılan virgül veya nokta tuşunun basımını KeyAscii = 0 kodu ile iptal eder. Bu kodun amacı textbox'a ilk girilen karakterin virgül veya nokta (ondalık ayraç) olmasını engellemek.

    KeyAscii = Asc(Application.International(xlDecimalSeparator)) Bu kodla textbox'umuzda ondalık ayraç yoksa veya textbox boş değilse basılan tuş virgül de olsa nokta da olsa Bölgesel Dil Ayarında ki ondalık ayracı textbox'sa yazdırıyoruz. Burdaki amaç ondalık ayraç virgül se klavyeden noktaya da bassak ta textbox'a virgül olarak yazsın.

    KeyAscii tablosunda, 48 Ascii kodu, sıfır sayısını 57 dokuz sayısını Temsil Eder.

    Case 48 To 57 Klavyeden sıfır ile dokuz sayısı arasında bir sayıya basılmışsa. Kontrolün altını boş bırakıyoruz böylelikle sayı girişlerine izin vermiş oluyoruz.

    Case Else koduyla Klavyeden basılan tuşun KeyAcii değeri 44,46 ve 48 ile 57 arasında değilse KeyAscii = 0 Kodu ile Textbox'a Hiçbir Şey Yazmamasını Bildirdik.

     

    Textbox'tan çıktık sonra en son karakterin ondalık ayraç, olup olmadığını kontrol etmek varsa silmek için aşağıda kodları yazıyoruz.

    Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        If InStr(1, TextBox1, Application.International(xlDecimalSeparator)) = Len(Trim(TextBox1.Value & vbNullString)) Then
            TextBox1 = Replace(TextBox1, Application.International(xlDecimalSeparator), vbNullString)
        End If
    End Sub
    

    InStr(1, TextBox1.Text, Application.International(xlDecimalSeparator)) InStr fonksiyonu ile ondalık ayracın textbox'taki veride (dizede) ondalık ayracın kaçıncı karakter olduğunu öğreniyoruz Len(Trim(TextBox1.Value & vbNullString)) Len fonksiyonuyla textbox'taki verinin (Dizenin) kaç karakterden oluştuğunu yani uzunluğunu öğreniyoruz. Ondalık ayracın bulunduğu konum ile dize'nin uzunluğu eşitse en sondaki karakter ondalık ayraç'tır TextBox1 = Replace(TextBox1, Application.International(xlDecimalSeparator), vbNullString) koduyla sondaki ondalık ayracı siliyoruz.

    Yukarıdaki kodlara alternetif olarak aşağıdaki kodlarıda kullanabiliriz.

    Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)  
        If Right(TextBox1, 1) = Application.International(xlDecimalSeparator) Then
            TextBox1 = Left(TextBox1, Len(TextBox1) - 1)
        End If
    End Sub    
    

    Right(TextBox1, 1) Right fonksiyonu ile textbox'taki dizenin son karakterinin String değerini öğreniyoruz bu değer ondalık ayraçla aynı ise Left(TextBox1, Len(TextBox1) - 1) left fonksiyonunu kullanarak, textboxtaki dizenin soludan başlayarak dizenin uzunluğunun bir eksiğine kadar yani dizeyi son karakter hariç alıyoruz. Böylelikle dizenin son karakteri olan ondalık ayracı silmiş oluyoruz.

     

    !..KeyPress ile uygulağımız Kodlar Klavyeden TextBox'a Sayı Harici Girişleri Engeller Ama Kopyala Yapıştırla Gelen Girişlere Engel Olamaz..!

    Textbox'a Kopyala Yapıştırı Engellemek İçin Keydown Olayına Aşağıdaki Kodu Yazıyoruz.

    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If (Shift = 2 And KeyCode = vbKeyV) Or (Shift = 1 And KeyCode = vbKeyInsert) Then
            KeyCode = 0
        End If
    End Sub
    

    Textbox’sun KeyDown Olayı İle Klavyeden Ctrl +V ve Shift + Insert tuş Kombinasyonları ile Kopyala Yapıştır Yapılmasını Engelledik.

    KeyDown Olayında Klavyeden Basılan Tuşun KeyCode Kodunu Öğreniyoruz. KeyCode kodları konusuna burdan ulaşabilirsiniz.

    Eğer (Shift = 2 And KeyCode = vbKeyV) Ctrl + V Klavye Tuşlarına Basıldıysa Veya (Shift = 1 And KeyCode = vbKeyInsert) Shift + Insert Tuşlarına Basıldıysa Engelle Demiş Olduk.

    Not:Bu kodların Karşılığı KeyAscii de Olmadığı için Keydown da Yaptık.

     

    Textbox'a Sayı Girdikçe Binlik Ayraçla Biçimlendirilmesini istiyorsak (Örnek 92.582) Aşağıdaki Kodu Ekliyoruz

    Private Sub TextBox1_Change()
        Dim strDecimalSeparator As String
        strDecimalSeparator = Application.International(xlDecimalSeparator)
    
        If InStr(1, TextBox1, strDecimalSeparator) = 0 Then
            TextBox1 = Format(TextBox1, "#,##0")
        ElseIf InStr(1, TextBox1, strDecimalSeparator) > 1 And (Len(TextBox1) - InStr(1, TextBox1, strDecimalSeparator)) = 1 Then
            TextBox1 = Format(TextBox1, "#,##0.0")
        ElseIf InStr(1, TextBox1, strDecimalSeparator) > 1 And Len(TextBox1) <> InStr(1, TextBox1, strDecimalSeparator) Then
            TextBox1 = Format(TextBox1, "#,##0.00")
        End If
    End Sub
    

     

    Konu Videosuna Aşağıdaki Linkten Ulaşabilirsiniz.

    TetBox'a Sadece Sayı Girişi (Tam Sayı ve Ondalıklı Sayı)

    Örnek Dosya İndir

     



     

  • RegExp İle TextBox'a Sadece Tam Sayı ve Ondalık'lı Sayı
  •  

    RegExp İle TextBox'a Sadece Tam Sayı ve Ondalık'lı Sayı Kodu, KeyPress ile Klavyeden Sayı Harici Girişi Engellemek Ve KeyDown İle Kopyala Yapıştırı Engellemek Kodlarının Birleşmiş Halidir. KeyPress ile ondalık'lı sayı Kodlarında uygulamış olduğumuz tüm kuralları burda da uyguladık aynı işlevi görüyor sadece yöntem farklı.

    Aralarındaki Fark RegExp Kopyala Yapıştıra İzin Verir Ama Kopyala Yapıştırla Gelen Veriden Sadece Sayıları Textbox'ta Bırakır, Sayı Haricini Siler.

    Private Sub TextBox1_Change()
        Dim rgxOndalik As Object
        Dim strDecimalSeparator As String
        Dim strThousandsSeparator As String
        Dim vrntBolunen As Variant
    
    
        Set rgxOndalik = CreateObject("vbscript.RegExp")
        strDecimalSeparator = Application.International(xlDecimalSeparator)
        strThousandsSeparator = Application.International(xlThousandsSeparator)
    
        If Right(TextBox1, 1) = strThousandsSeparator Then
            TextBox1 = Left(TextBox1, Len(TextBox1) - 1) & Replace(Right(TextBox1, 1), strThousandsSeparator, strDecimalSeparator)
        End If
        
        If (Len(TextBox1) - Len(Replace(TextBox1, strDecimalSeparator, "", 1, -1, vbTextCompare))) > 1 Then
            TextBox1 = Left(TextBox1, Len(TextBox1) - 1)
        End If
    
        If Len(Trim(TextBox1.Value & vbNullString)) > 0 Then
            With rgxOndalik
                .Pattern = "^\" & strDecimalSeparator & "|[^0-9\" & strDecimalSeparator & "]"
                .Global = True
                If InStr(1, TextBox1, strDecimalSeparator) = 1 Then
                    TextBox1 = .Replace(TextBox1, vbNullString)
                ElseIf InStr(1, TextBox1, strDecimalSeparator) = 0 Then
                    TextBox1 = Format(.Replace(TextBox1, vbNullString), "#,##0")
                ElseIf InStr(1, TextBox1, strDecimalSeparator) > 1 And (Len(TextBox1) - InStr(1, TextBox1, strDecimalSeparator)) = 1 Then
                    TextBox1 = Format(.Replace(TextBox1, vbNullString), "#,##0.0")
                ElseIf InStr(1, TextBox1, strDecimalSeparator) > 1 And Len(TextBox1) <> InStr(1, TextBox1, strDecimalSeparator) Then
                    TextBox1 = Format(.Replace(TextBox1, vbNullString), "#,##0.00")
                End If
            End With
            
            If InStr(1, TextBox1, strDecimalSeparator) Then
                vrntBolunen = Split(TextBox1, strDecimalSeparator)
                TextBox1 = vrntBolunen(0) & strDecimalSeparator & vrntBolunen(1)
            End If
        End If
    
    	Set rgxOndalik = Nothing
    	strDecimalSeparator = vbNullString
    	strThousandsSeparator = vbNullString
    	vrntBolunen = vbNullString
    End Sub
    
    Dim rgxOndalik As Object - Dim strDecimalSeparator As String - Dim strThousandsSeparator As String - Dim vrntBolunen As Variant - Dim i As Long - Set rgxOndalik = CreateObject("vbscript.RegExp") - strDecimalSeparator = Application.International(xlDecimalSeparator) - strThousandsSeparator = Application.International(xlThousandsSeparator) Kodlar ile Change olayında kullanacağımız değişkenleri tanımladık.

    Bölgesel dil ayarlarına göre klavyeden binlik ayraca basılmışsa bunu ondalık ayracı ile değiştiriyoruz. Türkiye de Genelde binlik ayraç nokta ondalık ayraç virgüldür. Noktaya basılmışsa noktayı virgül ile değiştir kodunu yazıyoruz.
    If Right(TextBox1, 1) = strThousandsSeparator Then Right sağdan fonksiyonu ile textbox'a girilen son karakteri kontrol ediyoruz. Son karakter binlik ayraçsa TextBox1 = Left(TextBox1, Len(TextBox1) - 1) & Replace(Right(TextBox1, 1), strThousandsSeparator, strDecimalSeparator) Kodu ile binlik ayracı ondalık ayraç ile değiştiriyoruz.Left(TextBox1, Len(TextBox1) - 1) kodu ile textbox'taki dizenin son karakteri hariç diyerek dizenin son karakterini almadan devam ediyoruz.Replace(Right(TextBox1, 1), strThousandsSeparator, strDecimalSeparator) kodu ile son karakter olan binlik ayracı onluk ayraç ile değiştiriyoruz. Kodu ikiye bölmemizin sebebi Left(TextBox1, Len(TextBox1) - 1) bu ayırdığımız dizede, textbox'su biçimlendirdiğimiz için başka binlik ayraçlarda olabilir onların da ondalık ayraçla değişmesini istemiyoruz istediğimiz klavyeden son girilen binlik ayracı değişmesi.

    TextBox'a ikinci bir ondalık ayracın girilmesini engellemek.
    (Len(TextBox1) - Len(Replace(TextBox1, strDecimalSeparator, "", 1, -1, vbTextCompare))) > 1 Len fonksiyonu ile textbox'un dize uzunluğunu buluyoruz Len(Replace(TextBox1, strDecimalSeparator, "", 1, -1, vbTextCompare))) > 1replace fonksiyonu ile ondalık ayraçları siliyoruz. Tetxbox'sun dize uzunluğundan, virgüllerin silinmiş halindeki dizenin uzunluğunu çıkarıyoruz sonuç birden büyükse TextBox1 = Left(TextBox1, Len(TextBox1) - 1) kodu ile son karakterin textbox'a girişini engeliyoz.

    RegExp ifadesi konusu bir önceki konularda detaylı anlatıldığı için detay anlatmadan devam ediyorum. .Pattern = "^\" & strDecimalSeparator & "|[^0-9\" & strDecimalSeparator & "]" RegExp ifadesi ile ilk karakter ondalık ayraç olamaz dedik sonrasında sıfır ile dokuz arasındaki rakamlar ve ondalık ayraç dışında ki karakterler olamaz dedik

    Kopyala yapıştır ile gelen dizede regExp ifadesi sayı ve ondalık ayraç dışındakileri siler ama dizede fazladan ondalık ayraç varsa onları silemez. Kopyala yapıştırdan gelen fazladan ondalık ayraçları silmek için vrntBolunen = Split(TextBox1, strDecimalSeparator) split fonksiyonun dan yararlanıyoruz. Split fonksiyonu ile ondalık ayraçların arasındaki dizeleri alıyoruz ve TextBox1 = vrntBolunen(0) & strDecimalSeparator & vrntBolunen(1) kodu ile parçaları birleştiriyoruz. Textbox'u biçimlendirmede ondalık ayractan sonra iki hane yaptığımız için iki bölümü birleştirmek yetiyor daha fazlası isterseniz bu kodun devamına aşağıdaki kodu ekleyebilirsiniz. i değişkenini long ve integer olarak tanımlamayı unutmayın.

    	If UBound(vrntBolunen) > 1 Then
    		For i = 2 To UBound(vrntBolunen)
    			TextBox1 = TextBox1 & vrntBolunen(i)
    		Next i
    	End If
    

     

    Textbox' tan çıkarken sayının sonu ondalık ayraçla bitiyorsa yani son karakter ondalık ayraçsa silmek için aşağıdaki kodu yazıyoruz.

    Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        If Right(TextBox1, 1) = Application.International(xlDecimalSeparator) Then
            TextBox1 = Left(TextBox1, Len(TextBox1) - 1)
        End If
    End Sub
    

    Konu Videosuna Aşağıdaki Linkten Ulaşabilirsiniz.

    TetBox'a RegExp İfadesi İle Sadece Sayı Girişi (Tam Sayı ve Ondalıklı Sayı)

    Örnek Dosya İndir

     

     



     

     

  • Sadece Negatif Sayı,Tam Sayı ve Ondalıklı Sayı Girişi
  • Negatif sayılarada giriş izni vermek istiyorsak, Keypess olayındaki kodlara negatif girişinide eklicez.

    Öncelikle exceli açtığımızda excelin bölgesel dil ayarlarını kulanmasını sağlayacak kodları resimde BuÇalışmaKitabı objesinin kod bölümüne aşağıdaki kodları yazıyoruz. Bölgesel dil ayarları konusu yukarıdaki konuda anlattım detaya girmiyorum.

    Private Sub Workbook_Open()
      If Application.UseSystemSeparators = False Then
          Application.UseSystemSeparators = True
      End If
    End Sub
    

     

    Excelin Bölgesel Dil ayarlarını kullanmasını sağladıktan sonra Userformun kod bölümünde textbox'sun KeyPress olayına aşağıdaki kodları yazıyoruz. Bu kod bloku klavyeden textbox'a eksi(negatif) karakteri, rakam ve Bölgesel Dil ayarlarındaki ondalık ayraç haricindeki tüm girişleri engeller yok sayar.
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        Select Case KeyAscii
            Case 45
                If InStr(1, TextBox1.Text, "-") > 0 Or Len(Trim(TextBox1.Value & vbNullString)) > 0 Then
                   KeyAscii = 0
                End If
            Case 44, 46
                If InStr(1, TextBox1.Text, Application.International(xlDecimalSeparator)) > 0 Or Len(Trim(TextBox1.Value & vbNullString)) = 0 Or _
                ((Left(TextBox1, 1) = "-") And (Len(Trim(TextBox1.Value & vbNullString)) = 1)) Then
                    KeyAscii = 0
                Else
                    KeyAscii = Asc(Application.International(xlDecimalSeparator))
                End If
            Case 48 To 57
            
            Case Else
                KeyAscii = 0
        End Select
    End Sub
    

    KeyPress olayında Klavyeden Basılan Tuşun KeyAscii Kodunu Öğreniyoruz. KeyAscii kodları konusuna burdan ulaşabilirsiniz.

    Select Case Deyimi ile KeyAscii Koduna Göre Denetim Yapıyoruz.

    KeyAscii tablosunda, 45 Ascii kodu eksi karakterini temsil eder. Case 45 Klavyeden eksi tuşuna basılmışsa

    InStr(1, TextBox1.Text, "-") > 0 Bu kodla textbox'ta eksi karakterinin olup olmadığını kontrol ediyoruz. Textbox'ta eksi karakter varsa ikinci eksi karakter basımını KeyAscii = 0 kodu ile iptal eder.

    NOT: KeyPress Olayı klavyenin tuşuna basıldığı an çalışmaya başlar biz eksi karakterine bastığımızda eksi textbox'ta yer almamış olur bu sebepten yukardaki eksi karakteri varmı kontrolüne, keypress olayının çalışmasını sağlayan eksi karakteri girmemiş oluyor.

    Len(Trim(TextBox1.Value & vbNullString)) > 0 Bu kodla textbox'sun uzunluğunu kontrol ediyoruz. Textbox boş değilse basılan eksi karakter tuşunun basımını KeyAscii = 0 kodu ile iptal eder. Bu kodun amacı textbox'a ilk karakter haricinde eksi girişinin yapılmasını engellemek.

    KeyAscii tablosunda, 44 Ascii kodu, virgülü 46 noktayı Temsil Eder.

    Case 44, 46 Klavyeden Virgül veya Noktaya basılmışsa

    InStr(1, TextBox1.Text, Application.International(xlDecimalSeparator)) > 0 Bu kodla textbox'ta ondalık ayracın olup olmadığını kontrol ediyoruz (Bölgesel Dil ayarında ondalık ayraç virgülse Virgülü noktaysa Noktayı). Textbox'ta ondalık ayraç varsa ikinci ondalık ayracın basımını KeyAscii = 0 kodu ile iptal eder.

    NOT: KeyPress Olayı klavyenin tuşuna basıldığı an çalışmaya başlar biz virgüle bastığımızda virgül textbox'ta yer almamış olur bu sebepten yukardaki ondalık ayraç varmı kontrolüne, keypress olayının çalışmasını sağlayan virgül girmemiş oluyor.

    Len(Trim(TextBox1.Value & vbNullString)) = 0 Bu kodla textbox'sun uzunluğunu kontrol ediyoruz. Textbox boşsa basılan virgül veya nokta tuşunun basımını KeyAscii = 0 kodu ile iptal eder. Bu kodun amacı textbox'a ilk girilen karakterin virgül veya nokta (ondalık ayraç) olmasını engellemek.

    ((Left(TextBox1, 1) = "-") And (Len(Trim(TextBox1.Value & vbNullString)) = 1)) Bu kod da Left fonksiyonu ile ilk karakterin eksi ye eşitmi kontrolü yapıyoruz ve Len fonksiyonu ile textbox karakter sayısının bire eşitmi kontrolünü yapıyoruz. Bu kodun amacı eksi karakterinin ardından ondalık ayracın girişini engellemek

    KeyAscii = Asc(Application.International(xlDecimalSeparator)) Bu kodla textbox'umuzda ondalık ayraç yoksa veya textbox boş değilse veya eksi karakterinden hemen sonra değilse basılan tuş virgül de olsa nokta da olsa Bölgesel Dil Ayarında ki ondalık ayracı textbox'sa yazdırıyoruz. Burdaki amaç ondalık ayraç virgül se klavyeden noktaya da bassak textbox'a virgül olarak yazsın.

    KeyAscii tablosunda, 48 Ascii kodu, sıfır sayısını 57 dokuz sayısını Temsil Eder.

    Case 48 To 57 Klavyeden sıfır ile dokuz sayısı arasında bir sayıya basılmışsa. Kontrolün altını boş bırakıyoruz böylelikle sayı girişlerine izin vermiş oluyoruz.

    Case Else koduyla Klavyeden basılan tuşun KeyAcii değeri 44,45,46 ve 48 ile 57 arasında değilse KeyAscii = 0 Kodu ile Textbox'a Hiçbir Şey Yazmamasını Bildirdik.

     

    Textbox'tan çıktık sonra en son karakterin ondalık ayraç, olup olmadığını kontrol etmek varsa silmek için aşağıda kodları yazıyoruz.

    Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        If InStr(1, TextBox1, Application.International(xlDecimalSeparator)) = Len(Trim(TextBox1.Value & vbNullString)) Then
            TextBox1 = Replace(TextBox1, Application.International(xlDecimalSeparator), vbNullString)
        End If
    End Sub
    

    InStr(1, TextBox1.Text, Application.International(xlDecimalSeparator)) InStr fonksiyonu ile ondalık ayracın textbox'taki veride (dizede) ondalık ayracın kaçıncı karakter olduğunu öğreniyoruz Len(Trim(TextBox1.Value & vbNullString)) Len fonksiyonuyla textbox'taki verinin (Dizenin) kaç karakterden oluştuğunu yani uzunluğunu öğreniyoruz. Ondalık ayracın bulunduğu konum ile dize'nin uzunluğu eşitse en sondaki karakter ondalık ayraç'tır TextBox1 = Replace(TextBox1, Application.International(xlDecimalSeparator), vbNullString) koduyla sondaki ondalık ayracı siliyoruz.

    Yukarıdaki kodlara alternetif olarak aşağıdaki kodlarıda kullanabiliriz.

    Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)  
        If Right(TextBox1, 1) = Application.International(xlDecimalSeparator) Then
            TextBox1 = Left(TextBox1, Len(TextBox1) - 1)
        End If
    End Sub    
    

    Right(TextBox1, 1) Right fonksiyonu ile textbox'taki dizenin son karakterinin String değerini öğreniyoruz bu değer ondalık ayraçla aynı ise Left(TextBox1, Len(TextBox1) - 1) left fonksiyonunu kullanarak, textboxtaki dizenin soludan başlayarak dizenin uzunluğunun bir eksiğine kadar yani dizeyi son karakter hariç alıyoruz. Böylelikle dizenin son karakteri olan ondalık ayracı silmiş oluyoruz.

     

    !..KeyPress ile uygulağımız Kodlar Klavyeden TextBox'a Sayı Harici Girişleri Engeller Ama Kopyala Yapıştırla Gelen Girişlere Engel Olamaz..!

    Textbox'a Kopyala Yapıştırı Engellemek İçin Keydown Olayına Aşağıdaki Kodu Yazıyoruz.

    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If (Shift = 2 And KeyCode = vbKeyV) Or (Shift = 1 And KeyCode = vbKeyInsert) Then
            KeyCode = 0
        End If
    End Sub
    

    Textbox’sun KeyDown Olayı İle Klavyeden Ctrl +V ve Shift + Insert tuş Kombinasyonları ile Kopyala Yapıştır Yapılmasını Engelledik.

    KeyDown Olayında Klavyeden Basılan Tuşun KeyCode Kodunu Öğreniyoruz. KeyCode kodları konusuna burdan ulaşabilirsiniz.

    Eğer (Shift = 2 And KeyCode = vbKeyV) Ctrl + V Klavye Tuşlarına Basıldıysa Veya (Shift = 1 And KeyCode = vbKeyInsert) Shift + Insert Tuşlarına Basıldıysa Engelle Demiş Olduk.

    Not:Bu kodların Karşılığı KeyAscii de Olmadığı için Keydown da Yaptık.

     

    Textbox'a Sayı Girdikçe Binlik Ayraçla Biçimlendirilmesini istiyorsak (Örnek 92.582) Aşağıdaki Kodu Ekliyoruz

    Private Sub TextBox1_Change()
        Dim strDecimalSeparator As String
        strDecimalSeparator = Application.International(xlDecimalSeparator)
    
        If InStr(1, TextBox1, strDecimalSeparator) = 0 Then
            TextBox1 = Format(TextBox1, "#,##0")
        ElseIf InStr(1, TextBox1, strDecimalSeparator) > 1 And (Len(TextBox1) - InStr(1, TextBox1, strDecimalSeparator)) = 1 Then
            TextBox1 = Format(TextBox1, "#,##0.0")
        ElseIf InStr(1, TextBox1, strDecimalSeparator) > 1 And Len(TextBox1) <> InStr(1, TextBox1, strDecimalSeparator) Then
            TextBox1 = Format(TextBox1, "#,##0.00")
        End If
    End Sub
    

    Örnek Dosya İndir

     

     



     

     

  • RegExp ile Sadece Negatif Sayı,Tam Sayı ve Ondalıklı Sayı Girişi
  • Private Sub TextBox1_Change()
        Dim rgxOndalik As Object
        Dim strDecimalSeparator As String
        Dim strThousandsSeparator As String
        Dim vrntBolunen As Variant
        Dim vrntBolunen1 As Variant
        
        Set rgxOndalik = CreateObject("vbscript.RegExp")
        strDecimalSeparator = Application.International(xlDecimalSeparator)
        strThousandsSeparator = Application.International(xlThousandsSeparator)
    
        If Right(TextBox1, 1) = strThousandsSeparator Then
            TextBox1 = Left(TextBox1, Len(TextBox1) - 1) & Replace(Right(TextBox1, 1), strThousandsSeparator, strDecimalSeparator)
        End If
    
        If (Len(TextBox1) - Len(Replace(TextBox1, strDecimalSeparator, "", 1, -1, vbTextCompare))) > 1 Or ((Left(TextBox1, 1) = "-") And (InStr(1, TextBox1, strDecimalSeparator) = 2)) Then
            TextBox1 = Left(TextBox1, Len(TextBox1) - 1)
        End If
    
        If Len(Trim(TextBox1.Value & vbNullString)) > 0 Then
            With rgxOndalik
                .Pattern = "^\" & strDecimalSeparator & "|[^0-9\-\" & strDecimalSeparator & "]"
                .Global = True
                If InStr(1, TextBox1, strDecimalSeparator) = 1 Then
                    TextBox1 = .Replace(TextBox1, vbNullString)
                ElseIf InStr(1, TextBox1, strDecimalSeparator) = 0 Then
                    TextBox1 = Format(.Replace(TextBox1, vbNullString), "#,##0")
                ElseIf InStr(1, TextBox1, strDecimalSeparator) > 1 And (Len(TextBox1) - InStr(1, TextBox1, strDecimalSeparator)) = 1 Then
                    TextBox1 = Format(.Replace(TextBox1, vbNullString), "#,##0.0")
                ElseIf InStr(1, TextBox1, strDecimalSeparator) > 1 And Len(TextBox1) <> InStr(1, TextBox1, strDecimalSeparator) Then
                    TextBox1 = Format(.Replace(TextBox1, vbNullString), "#,##0.00")
                End If
            End With
            
            If InStr(1, TextBox1, strDecimalSeparator) Then
                vrntBolunen = Split(TextBox1, strDecimalSeparator)
                TextBox1 = vrntBolunen(0) & strDecimalSeparator & vrntBolunen(1)
            End If
            
            If InStr(1, TextBox1, "-") Then
                vrntBolunen1 = Split(TextBox1, "-")
                TextBox1 = "-" & vrntBolunen1(0) & vrntBolunen1(1)
            End If
        End If
    
        Set rgxOndalik = Nothing
        strDecimalSeparator = vbNullString
        strThousandsSeparator = vbNullString
        vrntBolunen = vbNullString
        vrntBolunen1 = vbNullString
    End Sub
    

     

        If Right(TextBox1, 1) = Application.International(xlDecimalSeparator) Or Right(TextBox1, 1) = "-" Then
            TextBox1 = Left(TextBox1, Len(TextBox1) - 1)
        End If
    

    Örnek Dosya İndir

     

     



     

     

  • IsNumeric ile Sadece Tam Sayı Girişi
  • Textbox'a girilen her karakteri for next döngüsüyle tek tek IsNumeric fonksiyonu ile kontrol eder sayı olmayanı siler. Kopyala yapıştırdan geleni engeller. Binlik ayraçla Biçimlendirmeye Uygun bir kod değildir.

      Private Sub TextBox1_Change()
          Dim byteKarakterKonum As Byte
          Dim strSyDgl As String
          For byteKarakterKonum = 1 To Len(TextBox1.Text)
              strSyDgl = Mid(TextBox1.Text, byteKarakterKonum, 1)
              If Not IsNumeric(strSyDgl) And TextBox1.Value <> vbNullString Then
                  TextBox1.Text = Mid(TextBox1.Text, 1, byteKarakterKonum - 1) & Mid(TextBox1.Text, byteKarakterKonum + 1)
              End If
          Next byteKarakterKonum
      End Sub
    

    Örnek Dosya İndir

     

     

    Yorumlar

    Yorum Gönder

    Bu blogdaki popüler yayınlar

    Stok Takip Programı Excel Vba

    KeyAscii