|
|
|
 |
|
|
 |
 |
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
| |
|
|
 |
|
|
|