Özellik ikonu

Controls

İndirme izni yok

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.

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.
Dönüş değeri: Controls koleksiyonun kendisini, Controls(Dizin) ya da Controls("Ad") ise tek bir denetim nesnesini döndürür. Add yöntemi de yeni eklenen denetimi döndürür.

Ö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.
Koleksiyonun döndürdüğü her öğe, ortak özellikleri (Name, Left, Top, Width, Height, Visible, Enabled, Tag) taşıyan bir denetim nesnesidir. Value, Caption, ListIndex gibi özellikler denetimin türüne bağlıdır.

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

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
Eklenen denetimin konumunu ve boyutunu Left, Top, Width ve Height özellikleriyle siz belirlersiniz.

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.
ABC
1Denetim AdıTürYapılan İşlem
2txtAdTextBoxValue = boş metin
3txtSoyadTextBoxValue = boş metin
4cmbSehirComboBoxListIndex = -1
5chkBultenCheckBoxValue = False
6lblBaslikLabelDokunulmaz
Form AlanlarıExcelDepo v1.0.0
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.

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.
AB
1AyHedef Satış (TL)
2Ocak150.000,00
3Şubat135.000,00
4Mart170.000,00
Dinamik DenetimExcelDepo v1.0.0
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.

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.
ABC
1Denetim AdıÖnekTür
2txtAdtxtTextBox
3cmbSehircmbComboBox
4lblBasliklblLabel
5cmdKaydetcmdCommandButton
6chkOnaychkCheckBox
7lstUrunlstListBox
8optErkekoptOptionButton
9grdListegrdBilinmiyor
Denetim TürleriExcelDepo v1.0.0
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.

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.
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
10
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst