Genel Bakış
TextBox (Metin Kutusu), kullanıcının klavyeyle metin ya da sayı yazabildiği ve VBA kodunun bu girişi okuyabildiği Microsoft Forms denetimidir. UserForm üzerinde veri giriş formları hazırlamak, ayrıca çalışma sayfasına ActiveX denetimi olarak eklenen kutulardan değer almak için kullanılır. Denetimin içeriği Text ya da Value özelliğiyle okunur ve yazılır; içerik her zaman metin olarak gelir.
Denetimlere kodda kolay ulaşmak için anlamlı adlar verin (txtAd, txtTutar gibi). Varsayılan özellik Value'dur; yani Nesne.Value yerine yalnız nesne adını yazmak da değeri verir, ancak okunabilirlik için Text ya da Value özelliğini açıkça yazmanız önerilir.
Kutudan gelen değer her zaman metindir. Hesap yapacaksanız önce IsNumeric ile denetleyip CDbl ya da CLng ile sayıya çevirin.
Makro çalışınca kutuya yazılan metin B2 hücresine (Ayşe Yılmaz), MaxLength değeri B3'e (30) ve MultiLine özelliği B4'e (YANLIŞ) aktarılır. B5 hücresindeki karakter sayısı 11 olarak hesaplanır. OLEObjects.Add ile eklenen denetime Object özelliği üzerinden ulaşıldığına dikkat edin.
A2'deki giriş sayıya çevrilebildiği için B2 hücresine 1250 yazılır ve C2'de durum Sayı olur. A3'teki giriş için C3 hücresi Geçersiz, boş bırakılan A4 satırı için C4 hücresi Boş değerini alır. Gerçek bir UserForm'da aynı denetimi Exit ya da BeforeUpdate olayında yapıp geçersiz girişte Cancel değerini True yapabilirsiniz.
Metin kutusunun içeriği dört satırdan oluşur ve Split bu satırları C sütununa dağıtır. C2 hücresinde Kalem Seti x 12, C3 hücresinde A4 Kağıt x 5, C4 hücresinde Dosya Klasör x 8 ve C5 hücresinde Zımba x 3 görünür. Gerçek bir formda aynı Text değeri, EnterKeyBehavior özelliği True olan kutuya kullanıcının yazdığı notları da içerebilir.
TextBox nedir ve nerede kullanılır
TextBox, Microsoft Forms 2.0 denetim kitaplığının bir parçasıdır. İki yerde kullanılır:- UserForm: VBA Düzenleyicisi'nde (Alt+F11) bir UserForm ekleyin, Araç Kutusu (Toolbox) içinden Metin Kutusu (TextBox) simgesini forma sürükleyin.
- Çalışma sayfası: Geliştirici > Denetimler > Ekle > ActiveX Denetimleri > Metin Kutusu (Developer > Controls > Insert > ActiveX Controls > Text Box) yolunu izleyin. Denetimi düzenlemek için Tasarım Modu (Design Mode) açık olmalıdır.
Denetimlere kodda kolay ulaşmak için anlamlı adlar verin (txtAd, txtTutar gibi). Varsayılan özellik Value'dur; yani Nesne.Value yerine yalnız nesne adını yazmak da değeri verir, ancak okunabilirlik için Text ya da Value özelliğini açıkça yazmanız önerilir.
Önemli özellikler
- Text: Kutudaki metni okur ya da değiştirir. Her zaman String türündedir.
- Value: TextBox'ta Text ile aynı içeriği verir; varsayılan özelliktir.
- MaxLength: Yazılabilecek en çok karakter sayısı; varsayılanı 0'dır ve sınırsız anlamına gelir.
- MultiLine: True ise kutuya birden çok satır yazılabilir; varsayılanı False'tur.
- WordWrap: Uzun metnin kutu genişliğinde alt satıra kaydırılıp kaydırılmayacağını belirler.
- ScrollBars: Kaydırma çubuklarını belirler (yok, yatay, dikey ya da ikisi birden).
- EnterKeyBehavior: True ise Enter tuşu çok satırlı kutuda yeni satır açar.
- TabKeyBehavior: True ise Tab tuşu kutuya sekme karakteri yazar, odağı değiştirmez.
- PasswordChar: Ayarlanan karakter (örneğin yıldız) yazılanın yerine görüntülenir; parola girişi için kullanılır.
- Locked: True ise kullanıcı metni değiştiremez, ancak metin seçilip kopyalanabilir.
- Enabled: False ise denetim kullanılamaz ve soluk görünür.
- TextAlign: Metni sola, ortaya ya da sağa hizalar.
- SelStart, SelLength, SelText: Seçili metnin başlangıç konumunu, uzunluğunu ve içeriğini verir.
- ControlSource: Kutuyu bir çalışma sayfası hücresine bağlar.
- AutoSize: Kutu boyutunu metne göre ayarlar.
- BackColor, ForeColor, Font: Görünümü belirler.
- TabIndex: Sekme sırasını belirler.
Önemli yöntemler ve olaylar
Yöntemler:- SetFocus: İmleci kutuya taşır; form açılırken ya da hatalı girişten sonra kullanılır.
- Copy, Cut, Paste: Seçili metni Pano ile aktarır.
- Change: Metin her değiştiğinde çalışır; her tuş vuruşunda tetiklenir.
- KeyPress: Karakter üreten bir tuşa basıldığında çalışır; KeyAscii değeri 0 yapılırsa tuş yok sayılır.
- KeyDown, KeyUp: Tuşa basılıp bırakıldığında çalışır; KeyCode ve Shift bilgisini verir.
- Enter, Exit: Kutu odağı aldığında ya da kaybederken çalışır; Exit olayında Cancel değeri True yapılırsa odak kutuda kalır.
- BeforeUpdate, AfterUpdate: Değer kutudan kesinleşmeden önce ve sonra çalışır.
- DblClick, MouseDown, MouseUp: Fare etkileşimlerinde çalışır.
Söz dizimi ve kod ile kullanım
Bir UserForm'daki metin kutusuna Me.txtAd.Text biçiminde, sayfadaki ActiveX kutuya ise Sayfa.OLEObjects("txtAd").Object.Text biçiminde ulaşılır. Aşağıdaki UserForm kodu yalnız rakam girilmesine izin verir ve kutudaki metni sayfaya yazar:
VBA
14 satır
Private Sub txtAdet_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
' Yalnız rakamlara ve Backspace tuşuna izin ver
If KeyAscii < 48 Or KeyAscii > 57 Then
If KeyAscii <> 8 Then KeyAscii = 0
End If
End Sub
Private Sub btnKaydet_Click()
Worksheets("Siparişler").Range("A2").Value = Me.txtAd.Text
If IsNumeric(Me.txtAdet.Text) Then
Worksheets("Siparişler").Range("B2").Value = CDbl(Me.txtAdet.Text)
End If
Me.txtAd.SetFocus
End Sub
1. Sayfaya metin kutusu ekleme ve özelliklerini okuma
Bu örnek, sayfaya kodla bir ActiveX metin kutusu ekler, MaxLength değerini ayarlar, metin yazar ve özellik değerlerini B sütununa aktarır. Kodu Alt+F11 ile açtığınız VBA Düzenleyicisi'nde Ekle > Modül (Insert > Module) ile eklediğiniz standart modüle yapıştırın. ActiveX denetimleri Windows masaüstü Excel'de çalışır; örnek temiz kalsın diye kutu işlem sonunda silinir.
VBA
28 satır
Option Explicit
Sub MetinKutusuOlustur()
Dim ws As Worksheet
Dim ole As OLEObject
Dim tb As Object
Set ws = ThisWorkbook.Worksheets("Metin Kutusu")
' Sayfaya ActiveX metin kutusu ekle (konum ve boyut punto cinsindendir)
Set ole = ws.OLEObjects.Add(ClassType:="Forms.TextBox.1", _
Left:=250, Top:=20, Width:=150, Height:=22)
ole.Name = "txtAdSoyad"
' Denetimin kendisine Object özelliğiyle ulaşılır
Set tb = ole.Object
tb.MaxLength = 30
tb.Text = "Ayşe Yılmaz"
' Özellik değerlerini sayfaya yaz
ws.Range("B2").Value = tb.Text
ws.Range("B3").Value = tb.MaxLength
ws.Range("B4").Value = tb.MultiLine
ws.Range("B5").Value = Len(tb.Text)
' Örnek sayfa temiz kalsın diye kutuyu sil
ole.Delete
End Sub
TextBox
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Özellik | Değer |
| 2 | Metin (Text) | Ayşe Yılmaz |
| 3 | Azami uzunluk (MaxLength) | 30 |
| 4 | Çok satırlı mı (MultiLine) | YANLIŞ |
| 5 | Karakter sayısı (Len) | 11 |
Metin KutusuExcelDepo v1.0.0
2. Metin kutusundan gelen değeri sayıya çevirme
Metin kutusunun içeriği her zaman metindir. Bu örnek, A sütunundaki girişleri sırayla bir metin kutusuna yazar, Text değerini okur ve sayıya çevrilebiliyorsa B sütununa sayı olarak, çevrilemiyorsa C sütununa durum bilgisiyle yazar. Kodu standart bir modüle yapıştırın.
VBA
31 satır
Option Explicit
Sub MetinleriSayiyaCevir()
Dim ws As Worksheet
Dim ole As OLEObject
Dim tb As Object
Dim r As Long
Dim s As String
Set ws = ThisWorkbook.Worksheets("Sayı Kontrolü")
Set ole = ws.OLEObjects.Add(ClassType:="Forms.TextBox.1", _
Left:=300, Top:=20, Width:=120, Height:=22)
Set tb = ole.Object
For r = 2 To 7
' Girişi metin kutusuna yaz, sonra Text özelliğinden geri oku
tb.Text = CStr(ws.Cells(r, 1).Value)
s = Trim(tb.Text)
If Len(s) = 0 Then
ws.Cells(r, 3).Value = "Boş"
ElseIf IsNumeric(s) Then
ws.Cells(r, 2).Value = CDbl(s)
ws.Cells(r, 3).Value = "Sayı"
Else
ws.Cells(r, 3).Value = "Geçersiz"
End If
Next r
ole.Delete
End Sub
TextBox
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Girilen Metin | Sayı | Durum |
| 2 | 1250 | 1250 | Sayı |
| 3 | abc | Geçersiz | |
| 4 | Boş | ||
| 5 | 340 | 340 | Sayı |
| 6 | 12a | Geçersiz | |
| 7 | 75 | 75 | Sayı |
Sayı KontrolüExcelDepo v1.0.0
3. Çok satırlı metin kutusu kullanma
Bu örnek, MultiLine özelliği True olan bir metin kutusuna sipariş kalemlerini satır satır yazar. Ardından metni Split işleviyle satırlara ayırıp C sütununa yazar. Kodu standart bir modüle yapıştırın.
VBA
35 satır
Option Explicit
Sub SiparisOzetiMetinKutusu()
Dim ws As Worksheet
Dim ole As OLEObject
Dim tb As Object
Dim r As Long
Dim i As Long
Dim metin As String
Dim satirlar As Variant
Set ws = ThisWorkbook.Worksheets("Çok Satırlı Metin")
Set ole = ws.OLEObjects.Add(ClassType:="Forms.TextBox.1", _
Left:=300, Top:=20, Width:=180, Height:=80)
Set tb = ole.Object
' Birden çok satıra izin ver
tb.MultiLine = True
tb.WordWrap = True
' Kalemleri satır sonu (vbCrLf) ile birleştir
For r = 2 To 5
If r > 2 Then metin = metin & vbCrLf
metin = metin & ws.Cells(r, 1).Value & " x " & ws.Cells(r, 2).Value
Next r
tb.Text = metin
' Metin kutusundan geri oku ve satırlara ayır
satirlar = Split(tb.Text, vbCrLf)
For i = 0 To UBound(satirlar)
ws.Cells(i + 2, 3).Value = satirlar(i)
Next i
ole.Delete
End Sub
TextBox
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Kalem | Adet | Metin Kutusu Satırı |
| 2 | Kalem Seti | 12 | Kalem Seti x 12 |
| 3 | A4 Kağıt | 5 | A4 Kağıt x 5 |
| 4 | Dosya Klasör | 8 | Dosya Klasör x 8 |
| 5 | Zımba | 3 | Zımba x 3 |
Çok Satırlı MetinExcelDepo v1.0.0
Kullanırken dikkat edin
- Text ve Value aynı değeri verir, ama hep metindir: Kutuya 100 yazsanız bile Text değeri "100" metnidir. Toplama gibi işlemlerden önce CDbl, CLng ya da Val ile çevirin. Val ondalık ayırıcı olarak yalnız noktayı tanır, virgüllü Türkçe girişlerde CDbl kullanmak daha güvenlidir.
- Boş ve geçersiz girişi denetleyin: Kutu boş bırakıldığında CDbl hata verir. Çevirmeden önce Len(Trim(...)) ve IsNumeric ile denetim yapın.
- Change olayında dikkatli olun: Change olayı her tuş vuruşunda çalışır. Olay içinde kutunun Text değerini yeniden değiştirirseniz olay tekrar tetiklenir ve döngüye girebilir; gerekirse bir bayrak değişkeniyle olayı kısa süreliğine devre dışı bırakın.
- KeyPress yapıştırmayı engellemez: KeyPress ile rakam filtresi kurmanız Ctrl+V ile yapıştırılan ya da fareyle sürüklenen metni engellemez. Kesin doğrulamayı Exit, BeforeUpdate olayında ya da kaydet düğmesinde ayrıca yapın.
- Karakter sınırları: MaxLength değeri 0 ise sınır yoktur. Metni hücreye yazarken bir hücrenin en çok 32.767 karakter tutabildiğini unutmayın.
- Sayfadaki ActiveX denetimleri: Sayfadaki ActiveX metin kutusu, Tasarım Modu açıkken tıklanıp düzenlenir; kapalıyken kullanılır. Bu denetimler Windows masaüstü Excel'e özgüdür; Excel Online ve Mac sürümlerinde sınırlı çalışır ya da hiç çalışmaz.
- Şekil olarak eklenen metin kutusu farklıdır: Ekle > Metin Kutusu (Insert > Text Box) ile eklenen kutu bir Shape nesnesidir. Bu kutunun metnine Shapes("Metin Kutusu 1").TextFrame2.TextRange.Text ile ulaşılır; Change gibi olayları yoktur.
- Parola alanı güvenli değildir: PasswordChar yalnızca ekranda yazılanı gizler. Parolayı kodda açık metin olarak saklamayın; VBA projesi koruması gerçek bir güvenlik sağlamaz.
- İlgili konular: UserForm, Label, ComboBox, ListBox, CommandButton, CheckBox, MsgBox, InputBox, IsNumeric, CDbl, Val, Split, OLEObjects koleksiyonu, Geliştirici sekmesi ve Tasarım Modu. Çalışma sayfası tarafında metin uzunluğunu ölçmek için UZUNLUK, metni sayıya çevirmek için DEĞER işlevlerine de bakabilirsiniz.