Anasayfa | Akademik Forum | Sizden Gelenler | Sipariş
Menü Açıklamaları
Sorular - Cevaplar
Makaleler
Makrolar
Yerleşik İşlevler
Animasyonlar
Yumurtalar
Fonksiyonlar
MTK Programlar
ExcelCE
Dosya İndir
Neler Yaptık?
İletişim
Makaleler
TextBox Nesnelerinin İçini Temizlemek - M. Temel Korkmaz - 22.07.2004
Merhaba,

E-Mailime gelen bir çok istek yeni hazırlama aşamasında olduğum "Soru-Cevap ve Özel Teknikler" adlı kitabın içeriğinden örnek görmek üzerineydi. Bu isteklere her nekadar tek tek maillerle cevap vermeye çalışmış olsam da bu bir müddet sonra benim için zor bir duruma dönüştü. Bu nedenle küçük bir konuyu burada sizlerle paylaşmaya karar verdim. Dolayısı ile kitabın anlatım üslubu ve konuları işleyiş tarzı açısından farkını görmüş olacaksınız. Ayrıca "Makrolar kitabından farkı nedir?" sorularına da net bir cevap bulabileceksiniz.

--------------------------------------------------------------------------------
Soru 24:

Bir UserForm üzerine 40-50 civarında TextBox nesnesi yerleştirdim. Bu nesnelerin içeriğini dolduruyorum ve kaydediyorum. Sonra temizleme işlemi yaptırmak istiyorum. Bunun için tek tek bütün nesnelerin içeriğini, TextBox1= “ ” kodu ile temizlemeye çalışıyorum. Oysa biz hücreleri temizlemek istediğimizde For next döngüsünü kullanabiliyoruz. TextBox’lar için de For Next döngüsü yazmaya kalktığımda hata veriyor.

For i = 1 To 40
    TextBox & i=" "
Next i

Yukarıdaki kodda & işlecini kabul etmiyor. 40 adet TextBox kutusunu tek tek yazmak hem kod sayfasının yükünü arttırıyor hem de çok fazla zaman alıyor. Bu işlemi gerçekleştirmenin bir yolu yok mu?

Cevap 24:

Maalesef bir yanlış yapıyorsunuz ve Excel de sizin bu yanlışınızı düzeltmek için çalışıyor. Neneleri herhangi bir metinsel yada rakamsal ifade olarak düşünürseniz yanlış yaparsınız. Siz de burada TextBox nesnesinin Name özelliğini değiştirmeye çalışmışsınız. TextBox1 yada txtKutu yazmanız arasında bir fark yoktur. Sonda görmüş olduğunuz “1” ifadesi Name özelliğinin bir parçasıdır. Değiştirmeye çalışırsanız hata ile karşılaşmanız muhtemeldir. Şimdi sorunuzun çözümüne geçmeden evvel bazı ön açıklamalar yapıp konuyu açıklamaya çalışayım.

UserForm ve UserForm üzerine yerleştirilen Nesnelerin (TextBox, Label, ComboBox vs) birer Control olduğunu biliyoruz. Eğer bilmiyorsak da şu anda böylece bilmiş olduk. UserForm nesnesi her ne kadar kendi başına bir kontrol olsa da, kendisi üzerine yerleştirilen her bir nesne UserForm’a ait olan birer Control’dür. Bunu anlayabilmek için şöyle bir deneme yapalım.

Bir UserForm üzerine TextBox ve CommandButton yerleştirelim. Şekil-72 ve Şekil-73’e göz atalım.


Şekil-72


Şekil-73


Her iki şekilde de şunu ispatlamaya çalıştık. Kod satırına UserForm1 yazıp nokta koyduğunuz da açılan hatırlatma listesinde Hem TextBox1 hem de CommandButton1 nesnesi bulunmaktadır. Bu da gösteriyor ki, UserForm1 üzerine yerleştirdiğimiz bu Kontrol Nesneleri, UserForm1’e ait Control’ler haline dönüşmüştür.

Buraya kadar olan kısım anlaşıldı ise sorunumuzun büyük bir kısmını çözdük demektir. Şimdi kontroller ile alakalı küçük bir kod yazalım. Hani yukarıda UserForm1’in üzerine TextBox1 ve CommandButton1 nesnesi yerleştirmiştik ya, işte onlar dursun ve CommandButton’un Click olayına aşağıdaki kodu yazın ve çalıştırın.

Private Sub CommandButton1_Click()
    MsgBox UserForm1.Controls(1).Name
End Sub

Kodu çalıştırdığınızda Şekil-74’ deki görüntü ile karşılaşacaksınız.

Kodu kısaca açıklayalım. User-Form nesnesi üzerine yerleştirdiğimiz her bir kontrol nesnesine Excel bir numara verir. Bu numaralandırma 0’dan başlar. Yani ilk yerleştirdiğimiz nesne, 0 (sıfır), daha sonra 1 (bir) ve böylece artan sıra ile gider. Biz ilk olarak TextBox nesnesini yerleştirdik ve ardından CommandButton nesnesini.



Şekil-74

Dolayısı ile 1 indexi CommandButton’a ait bir index oldu. Kodu aşağıdaki gibi yazalım.

Private Sub CommandButton1_Click()
    Dim i As Integer

   
For i = 0 To 1
        Cells(i + 1, 1) = Controls(i).Name
    Next i
End Sub

Yukarıdaki kodu çalıştırdığınızda Şekil-75’dekine benzer bir görüntü elde edeceksiniz. Farkındaysanız, UserForm1 yazmadığımız halde uygun bir sonuç elde ettik. Ancak bu kısaltmalar bazen kaşıklığa neden olabilir. Uygun olan size göre hangisi ise o şekilde kullanabilirsiniz.



Şekil-75

Biraz daha ilerleyelim. UserForm’un üzerine yeni nesneler ekleyelim. Aşağıdaki kodu yazıp çalıştıralım.

Private Sub CommandButton1_Click(
   
Dim i As Integer

   
For i = 0 To 11
        Cells(i + 1, 1) = Controls(i).Name
    Next i
End Sub


Şekil-76


Kodu çalıştırdığımızda Şekil-76’daki görüntü ile karşılaşıyoruz. Aslında yazdığımız kodda bir değişiklik yok. Ancak siz de farkındasınız ki kodu bu şekilde yazarsak For Next döngüsündeki 11 ifadesini her defasında kendimiz değiştirmek zorunda kalacağız. Bu durumdan kurtulmak için UserForm üzerindeki nesneleri sayan bir koda ihtiyacımız var. Makroyu aşağıdaki gibi değiştirelim.

Private Sub CommandButton1_Click()
    Dim i As Integer
    For i = 0 To Controls.Count - 1
        Cells(i + 1, 1) = Controls(i).Name
    Next i
End Sub

Controls.Count ile UserForm üzerindeki kontrol nesneleri sayılır. Dolayısı ile 12 adet nesne bulunacak. Ancak bizim döngümüz 0 dan başlıyor. Bunun nedenini yukarıda anlatmıştık. Bu sebeple bulunan nesne sayısından “-1” ile bir değer düşürülür. Kodu çalıştırdığınızda Şekil-76’daki görüntünün aynı olacaktır. Ancak bu defa UserForm üzerine herhangi bir ekleme yapıldığında kodda değişiklik yapmamıza gerek kalmayacak.

Artık sıra UserForm üzerinde bulunan 40-50 adet TextBox nesnesinin içeriğini temizleyecek kod çeşitlerini yazmaya çalışalım. Öncelikle, yukarıdaki kodlardan faydalanabileceğimiz basit bir kod yazalım.Yalnız şöyle bir şartımız var. TextBox nesnelerinin Name özelliklerinin ilk 7 harfi “TextBox” olarak kalsın. Örneğin,

TextBox1
TextBox2
…..
TextBox39
TextBox40

Şimdi bir kural çıkartalım. Başka bir deyişle bir kriter oluşturalım. Kriterimiz şu, 40 adet TextBox’un da ilk 7 harfi aynı. O halde aşağıdaki kod her biri için aynı olacaktır. “Makrolar” kitabından Mid fonksiyonunun kullanılışını biliyorsunuz.

Mid(Controls(i).Name, 1, 7) = "TextBox"

Şimdi, şöyle düşünelim “Eğer, i sayacının belirlediği nesnenin Name özelliği “TextBox” metnine eşit ise, bu nesnelin Value özelliğini “ ” (boşluğa) eşitle.” İşte bu kadar. Bunu kod haline dönüştürdüğümüzde ise aşağıdaki kod ile karşılaşacağız.

Private Sub CommandButton1_Click()
    Dim i As Integer

   
For i = 0 To Controls.Count - 1
        If Mid(Controls(i).Name, 1, 7) = "TextBox" Then
            Controls(i).Value = ""
        End If
    Next i
End Sub

Aynı işlemleri “ComboBox”  için yapmaya çalıştığınızda eğer “7” yi “8” olarak değiştirmezseniz uğraşıp durursunuz J. Artık UserForm üzerindeki bütün TextBox nesnelerinin içeriğini boşaltacak basit bir kod yazmış olduk. Fakat siz de benim gibi UserForm üzerine yerleştirdiğiniz nesnelerin Name özelliğini değiştiriyorsanız yukarıda yazdığımız kod hiçbir işe yaramayacaktır. O halde daha farklı bir kodlamaya ihtiyaç duyacağız. Her ne kadar bunun için geliştirilmiş bir özel tanımlama olmuş olsa da ilk olarak kendi geliştirdiğim bazı kodlamaları sizlere aktarmak istiyorum. Çünkü, TypeOf Is adlı tanımlama ile işlem yaparken bazı olumsuzluklara rastladım. Bu tamamen benden kaynaklanabileceği gibi tanımlamanın kendisinden de olabilir. Öncelikle kendi hazırladığım bir kodu aktarıyorum.

Private Sub CommandButton1_Click()
    On Error Resume Next
    Dim i As Integer

   
For i = 0 To Controls.Count - 1
        If Not IsEmpty(Controls(i)) Then
            Controls(i).Value = ""
        End If
    Next i
End Sub

Mantık kısaca şu, “Eğer, kontrol nesnesinin değeri (Value yada Text) boş değilse, boşalt”  Ancak bu işlem gerçekleştirilirken UserForm üzerinde bulunan CommandButton yada diğer bazı nesnelerin bu özellikleri olmadığı için hata ile karşılaşacağız. İşte bu hatayı gözardı etmek için kodlamanın en başına On Error Resume Next yazdık. “Ehh, artık yeter yahu, şu olaya bir nokta koyalım demenin zamanı geldi sanırım. Son olarak aşağıdaki olaya dikkatinizi çekip, en profesyonel çözümü koyalım ve gerçekten bu konuyu sonlandıralım.

Şekil-76 ya dikkat ederseniz, A sütununa nesnelerin Name özelliklerini yazdırmıştık. Oysa bir de nesnelerin kendi adları bulunuyor. TextBox, CommandButton gibi. Şimdi bu kontrollerin adarlını listeleyecek kodu yazalım.

Private Sub CommandButton1_Click()
    Dim i As Integer
    For i = 0 To Controls.Count - 1
        Cells(i + 1, 1) = TypeName(Controls(i))
    Next i
End Sub

Dikkat ederseniz burada TypeName metodunu kullandık. TypeName fonksiyonu kullanılmış olan seçimin yada nesnenin tipini belirler. Bizim örneğimizde Şekil-77 görüldüğü gibi kontrol nesnelerinin isimleri A sütununa sıralanmıştır. TypeName sadece Kitap ve Sayfa içersindeki diğer nesneler için de geçerlidir. Şimdi son adıma geçerek bu çilekeş yolculuğa son verelim.


Şekil-77


Aşağıdaki kod ile TextBox nesnelerinin içerisini bir hamle de boşaltabilirsiniz.

Private Sub CommandButton1_Click()
    For Each nesne In Controls
        If TypeName(nesne) = "TextBox" Then
            nesne.Value = ""
        End If
    Next nesne
End Sub 

Destek
M.ÖZTÜRK - Y.KARAMAN
Bu siteyi, "Hayatını çocuklarının Ahlâklı ve Dürüst yetişmesi için harcamış olan Cefakar ve Fedakar, Canım ANNEM'e adadım."
Copyright © 1998-2011 M. Temel Korkmaz - Tüm hakları saklıdır.