Genel Bakış
Controls (Denetimler koleksiyonu), bir UserForm, Frame (Çerçeve) ya da MultiPage sayfası üzerindeki tüm denetimleri (TextBox, Label, CommandButton vb.) tek bir koleksiyon olarak döndüren özelliktir. Denetimlere ad ya da dizin numarasıyla erişmenizi, hepsini döngüyle dolaşmanızı ve çalışma zamanında yeni denetim eklemenizi sağlar.
UserForm nesnesinin Controls koleksiyonu, Frame içindekiler dahil formdaki tüm denetimleri verir. Bir Frame'in Controls koleksiyonu ise yalnızca o çerçevenin içindeki denetimleri içerir. MultiPage için her sayfanın kendi Controls koleksiyonu vardır: MultiPage1.Pages(0).Controls.
Bu örnek UserForm gerektirdiği için burada çalıştırılmaz. Döngü, formdaki her denetimin türüne TypeName ile bakar; metin kutularını boşaltır, onay kutusunun işaretini kaldırır, açılan listedeki seçimi iptal eder. Etiket gibi diğer türler Select Case içinde karşılığı olmadığından değişmeden kalır. Parametreyi Object olarak tanımlamak, aynı yordamı her UserForm için kullanmanızı sağlar.
Bu örnek bir UserForm üzerinde çalıştığı için burada çalıştırılmaz. Döngü her ay için lblAy0, lblAy1 gibi adlarla bir etiket, txtAy0, txtAy1 gibi adlarla bir metin kutusu ekler ve her çifti 24 nokta aşağıya yerleştirir. Eklenen denetimlere sonradan Controls("txtAy1") ile ad üzerinden erişebilirsiniz. Çalışma zamanında eklenen denetimlerin olayları kendiliğinden çalışmaz; olay yakalamak için WithEvents tanımlı bir sınıf modülü gerekir.
Makro, A2 hücresindeki adın ilk üç harfini txt olarak alır ve bunu TextBox türüyle eşleştirir. Aynı mantık cmbSehir satırında cmb önekini ComboBox türüne çevirir. Tanımadığı önek, örneğin son satırdaki grd, Bilinmiyor olarak işaretlenir. Bir UserForm döngüsünde ise ad önekine bakmak yerine doğrudan TypeName(ctl) kullanabilirsiniz; önek kuralı, aynı türdeki denetimleri ada göre ayıklamak istediğinizde işe yarar.
Söz dizimi
Controls özelliği bir UserForm, Frame ya da MultiPage sayfası nesnesi üzerinde kullanılır. Kod UserForm modülünün içindeyse nesne yerine Me yazabilirsiniz. Kullanım biçimleri:
VBA
5 satır
nesne.Controls
nesne.Controls(Dizin)
nesne.Controls("Ad")
Set ctl = nesne.Controls.Add(ProgID, [Ad], [Görünür])
nesne.Controls.Remove "Ad"
- nesne: UserForm, Frame ya da MultiPage sayfası (Pages(i)); zorunlu.
- Dizin: Denetimin sıra numarası. Sayım 0'dan başlar; 0 ile Count - 1 arasında olmalıdır.
- Ad: Denetimin Name özelliği. Add yönteminde isteğe bağlıdır; vermezseniz Excel otomatik bir ad atar.
- ProgID: Eklenecek denetimin tür kimliği, örneğin Forms.TextBox.1; Add için zorunlu.
- Görünür: İsteğe bağlı mantıksal değer. True verirseniz denetim eklenir eklenmez görünür; emin olmak için bu değeri açıkça yazın.
Önemli özellikler ve yöntemler
Koleksiyonun başlıca üyeleri şunlardır:- Count: Koleksiyondaki denetim sayısını verir.
- Item: Ad ya da dizinle tek denetimi döndürür; Controls("txtAd") yazımının uzun biçimidir ve varsayılan üyedir.
- Add: Çalışma zamanında yeni denetim ekler.
- Remove: Adı verilen denetimi kaldırır. Yalnız çalışma zamanında Add ile eklenen denetimler kaldırılabilir.
- Clear: Koleksiyondaki denetimleri temizler; yine yalnızca çalışma zamanında eklenen denetimler için güvenlidir.
Denetimlere erişim ve döngü
Tek bir denetime adıyla erişmek için Controls("txtAd") kullanılır. Ad bir metin birleştirmesiyle de üretilebilir; böylece txt1, txt2, txt3 gibi adlı denetimleri sayaçla dolaşabilirsiniz. Tüm denetimler için For Each döngüsü en pratik yoldur. Döngüde denetimin türünü ayırt etmek için TypeName işlevi kullanılır; bu işlev TextBox, Label, ComboBox gibi tür adını metin olarak döndürür.
VBA
3 satır
For Each ctl In Me.Controls
If TypeName(ctl) = "TextBox" Then ctl.Value = ""
Next ctl
Add için ProgID değerleri
Add yönteminde kullanabileceğiniz başlıca ProgID değerleri:- Forms.Label.1: Etiket
- Forms.TextBox.1: Metin kutusu
- Forms.ComboBox.1: Açılan liste kutusu
- Forms.ListBox.1: Liste kutusu
- Forms.CheckBox.1: Onay kutusu
- Forms.OptionButton.1: Seçenek düğmesi
- Forms.CommandButton.1: Komut düğmesi
- Forms.Frame.1: Çerçeve
1. Formdaki tüm giriş alanlarını temizleme
Bir UserForm üzerinde metin kutuları, onay kutuları ve açılan liste kutuları olduğunu varsayın. Aşağıdaki kodu standart bir modüle yapıştırın. UserForm'daki Temizle düğmesinin Click olayında FormuTemizle Me satırıyla çağırın. Tablo, formdaki denetimleri ve her türe uygulanan işlemi gösterir.
VBA
21 satır
Option Explicit
' UserForm modülündeki bir düğmeden çağrılır:
' Private Sub cmdTemizle_Click()
' FormuTemizle Me
' End Sub
Sub FormuTemizle(frm As Object)
Dim ctl As Object
' Formdaki tüm denetimleri tek tek dolaş
For Each ctl In frm.Controls
Select Case TypeName(ctl)
Case "TextBox"
ctl.Value = ""
Case "CheckBox"
ctl.Value = False
Case "ComboBox"
ctl.ListIndex = -1
End Select
Next ctl
End Sub
Controls
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Denetim Adı | Tür | Yapılan İşlem |
| 2 | txtAd | TextBox | Value = boş metin |
| 3 | txtSoyad | TextBox | Value = boş metin |
| 4 | cmbSehir | ComboBox | ListIndex = -1 |
| 5 | chkBulten | CheckBox | Value = False |
| 6 | lblBaslik | Label | Dokunulmaz |
Form AlanlarıExcelDepo v1.0.0
2. Çalışma zamanında denetim ekleme
Üç aylık bir giriş formu için etiket ve metin kutusu çiftlerini kodla oluşturmak istiyorsunuz. Kodu standart modüle yapıştırın ve UserForm_Initialize olayından AylikAlanlariEkle Me biçiminde çağırın. Kod ay adlarını Array("Ocak", "Şubat", "Mart") ile kendi içinde sabit olarak tanımlar; ay sayısı bu dizinin eleman sayısıyla belirlenir. Tablo yalnızca başvuru içindir: aylık hedef satış değerlerini gösterir, ancak kod tablodaki hücreleri okumaz ve bu değerleri kullanmaz.
VBA
29 satır
Option Explicit
' UserForm modülünden çağrılır:
' Private Sub UserForm_Initialize()
' AylikAlanlariEkle Me
' End Sub
Sub AylikAlanlariEkle(frm As Object)
Dim aylar As Variant
Dim i As Long
Dim lbl As Object
Dim txt As Object
aylar = Array("Ocak", "Şubat", "Mart")
For i = 0 To UBound(aylar)
' Ay adını gösteren etiket
Set lbl = frm.Controls.Add("Forms.Label.1", "lblAy" & i, True)
lbl.Caption = aylar(i)
lbl.Left = 12
lbl.Top = 12 + i * 24
lbl.Width = 60
' Tutar girişi için metin kutusu
Set txt = frm.Controls.Add("Forms.TextBox.1", "txtAy" & i, True)
txt.Left = 80
txt.Top = 10 + i * 24
txt.Width = 90
Next i
End Sub
Controls
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Ay | Hedef Satış (TL) |
| 2 | Ocak | 150.000,00 |
| 3 | Şubat | 135.000,00 |
| 4 | Mart | 170.000,00 |
Dinamik DenetimExcelDepo v1.0.0
3. Ada göre denetim türünü belirleme
Denetimlere önek içeren adlar vermek (txt, cmb, lbl gibi) Controls döngülerinde ayıklama yapmayı kolaylaştırır. Bu örnek, A sütunundaki denetim adlarının ilk üç harfinden türü bulup sayfaya yazar. Kodu standart modüle yapıştırıp çalıştırın.
VBA
31 satır
Option Explicit
Sub DenetimTurleriniYaz()
Dim ws As Worksheet
Dim i As Long
Dim sonSatir As Long
Dim onek As String
Dim tur As String
Set ws = ActiveSheet
sonSatir = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To sonSatir
' Adın ilk üç harfi önektir
onek = Left(ws.Cells(i, 1).Value, 3)
Select Case onek
Case "txt": tur = "TextBox"
Case "cmb": tur = "ComboBox"
Case "lbl": tur = "Label"
Case "cmd": tur = "CommandButton"
Case "chk": tur = "CheckBox"
Case "lst": tur = "ListBox"
Case "opt": tur = "OptionButton"
Case Else: tur = "Bilinmiyor"
End Select
ws.Cells(i, 2).Value = onek
ws.Cells(i, 3).Value = tur
Next i
End Sub
Controls
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Denetim Adı | Önek | Tür |
| 2 | txtAd | txt | TextBox |
| 3 | cmbSehir | cmb | ComboBox |
| 4 | lblBaslik | lbl | Label |
| 5 | cmdKaydet | cmd | CommandButton |
| 6 | chkOnay | chk | CheckBox |
| 7 | lstUrun | lst | ListBox |
| 8 | optErkek | opt | OptionButton |
| 9 | grdListe | grd | Bilinmiyor |
Denetim TürleriExcelDepo v1.0.0
Kullanırken dikkat edin
- Dizin 0'dan başlar: Controls(0) ilk denetimdir, son denetim Controls(Controls.Count - 1) ile alınır. Dizinle dönen sıra, denetimlerin ekran konumunu değil oluşturulma sırasını izler; sıraya güvenmek yerine ada göre erişmek daha güvenlidir.
- Olmayan ada erişim hata verir: Controls("txtYok") gibi formda bulunmayan bir ada başvurursanız çalışma zamanı hatası oluşur. Ad dışarıdan geliyorsa On Error Resume Next ile denetleyip sonucu Is Nothing ile sınayın ya da For Each döngüsüyle ada bakın.
- Remove yalnızca eklenen denetimleri siler: Tasarım zamanında formu çizerken yerleştirdiğiniz denetimler kodla kaldırılamaz. Remove ve Clear, çalışma zamanında Add ile eklediğiniz denetimler için kullanılmalıdır. Tasarım zamanındaki bir denetimi gizlemek için Visible = False yeterlidir.
- Eklenen denetimin olayları yoktur: Add ile oluşturulan denetim için Click ya da Change olay yordamını formun koduna yazamazsınız, çünkü denetim kod yazılırken henüz mevcut değildir. Olayları yakalamak için WithEvents ile tanımlı değişken içeren bir sınıf modülü kullanın.
- Sayfadaki denetimler Controls değildir: Çalışma sayfasına yerleştirilen ActiveX denetimlerine OLEObjects, Form denetimlerine Shapes koleksiyonuyla ulaşılır. Controls koleksiyonu yalnız UserForm, Frame ve MultiPage sayfaları içindir.
- Tür ayırmak için TypeName: Döngüde farklı türlerdeki denetimlere ortak olmayan bir özellik yazarsanız hata alırsınız; örneğin Label denetiminin Value özelliği yoktur. Önce TypeName ile türü sınayın.
- İlgili konular: UserForm, Frame, MultiPage, Me, UserForm_Initialize olayı, TypeName işlevi, For Each...Next döngüsü, Select Case deyimi, OLEObjects koleksiyonu, Shapes koleksiyonu, Name özelliği, Visible özelliği.