Özellik ikonu

ComboBox

İndirme izni yok

Genel Bakış

ComboBox (Birleşik Giriş Kutusu), kullanıcının hazır bir listeden seçim yapmasını ya da isterseniz kutuya kendi metnini yazmasını sağlayan denetimdir. Excel'de hem çalışma sayfasına yerleştirilen ActiveX denetimi olarak hem de UserForm üzerinde kullanılır. Liste öğelerini, seçilen değeri ve seçim değiştiğinde çalışacak olayları VBA ile yönetebilirsiniz.

ComboBox nerede kullanılır​

ComboBox iki yerde karşınıza çıkar:
  • Çalışma sayfasında: Geliştirici > Denetimler > Ekle > ActiveX Denetimleri > Birleşik Giriş Kutusu (Developer > Controls > Insert > ActiveX Controls > Combo Box) yolu ile eklenir. Denetimi düzenlemek için Tasarım Modu (Design Mode) açık olmalıdır. Özelliklerini Özellikler (Properties) penceresinden değiştirebilirsiniz.
  • UserForm üzerinde: Visual Basic Düzenleyicisi'nde forma Araç Kutusu'ndan eklenir. Listeyi genellikle formun UserForm_Initialize olayında doldurursunuz.
Bir de Geliştirici > Ekle > Form Denetimleri altındaki Form Denetimi ComboBox'ı vardır. Bu, ActiveX sürümünden daha sınırlıdır; ListIndex, Style, Change olayı gibi özellikleri yoktur. Bu sayfa ActiveX ve UserForm ComboBox'ını anlatır.

VBA'da sayfadaki denetime iki yoldan ulaşılır: Sayfa.OLEObjects("ComboBox1") ile denetimin kapsayıcı nesnesine, .Object ile de gerçek ComboBox nesnesine erişirsiniz. Sayfanın kod modülünde denetimi doğrudan adıyla da kullanabilirsiniz (ör. ComboBox1.Value).

Önemli özellikler​

  • Value: Seçilen ya da yazılan değeri verir (BoundColumn sütunundaki değer). Varsayılan özelliktir.
  • Text: Kutuda görünen metni verir. Kullanıcı listede olmayan bir şey yazdıysa onu da döndürür.
  • ListIndex: Seçili öğenin sıra numarasıdır ve sıfırdan başlar. Hiçbir öğe seçili değilse -1 döner. Değer atayarak öğeyi koddan seçebilirsiniz.
  • ListCount: Listedeki öğe sayısıdır (salt okunur).
  • List: Listenin tamamına dizi gibi erişmenizi sağlar. Bir diziye ya da aralık değerlerine atanarak liste topluca doldurulabilir.
  • ListFillRange: Sayfadaki ActiveX ComboBox'ın listesini bir hücre aralığına bağlar (ör. "A2:B5"). UserForm'daki karşılığı RowSource özelliğidir.
  • LinkedCell: Sayfadaki ComboBox'ın seçimini yazacağı hücreyi belirler.
  • ColumnCount, ColumnWidths, ColumnHeads: Çok sütunlu liste, sütun genişlikleri ve sütun başlıkları için kullanılır.
  • BoundColumn: Value özelliğinin hangi sütundan değer döndüreceğini belirler (1 tabanlıdır; varsayılan 1). TextColumn ise kutuda görünen sütunu belirler.
  • Style: 0 (fmStyleDropDownCombo) ise kullanıcı yazabilir ve listeden seçebilir; 2 (fmStyleDropDownList) ise yalnız listeden seçebilir.
  • MatchEntry: Kullanıcı yazarken listede eşleşen öğenin nasıl bulunacağını belirler: 0 (fmMatchEntryFirstLetter), 1 (fmMatchEntryComplete), 2 (fmMatchEntryNone).
  • MatchRequired: True ise kullanıcı listede olmayan bir değerle denetimden çıkamaz.
  • ListRows: Açılan listede aynı anda görünen satır sayısıdır.
  • Enabled, Locked, Visible: Denetimin kullanılabilirliğini ve görünürlüğünü yönetir.

Önemli yöntemler ve olaylar​

Yöntemlerin söz dizimi şöyledir:
VBA 5 satır
ComboBox.AddItem [Item], [Index]
ComboBox.RemoveItem Index
ComboBox.Clear
Değer = ComboBox.Column(Sütun, [Satır])
ComboBox.DropDown
  • AddItem: Listeye yeni öğe ekler. Item isteğe bağlıdır; eklenecek metindir. Index isteğe bağlıdır; verilmezse öğe listenin sonuna eklenir, verilirse o sıraya eklenir (sıfırdan başlar).
  • RemoveItem: Verilen sıradaki öğeyi siler. Liste bir aralığa bağlıysa (ListFillRange ya da RowSource) çalışmaz.
  • Clear: Listedeki tüm öğeleri siler. Aynı şekilde aralığa bağlı listede hata verir; önce bağlantıyı kaldırın.
  • Column: Çok sütunlu listede belirli bir sütundaki değeri okur. Sütun sıfırdan başlar; Satır verilmezse seçili satır kullanılır.
  • DropDown: Listeyi koddan açar.
Önemli olaylar:
  • Change: Seçim ya da metin değiştiğinde oluşur. En sık kullanılan olaydır.
  • Click: Kullanıcı listeden bir öğe seçtiğinde oluşur.
  • DropButtonClick: Açılır liste açıldığında ya da kapandığında oluşur.
  • BeforeUpdate / AfterUpdate: Değer denetime işlenmeden önce ve sonra oluşur; doğrulama için uygundur.
  • Enter / Exit: Denetime girildiğinde ve çıkıldığında oluşur.
Olay yordamı nereye yazılır: Sayfadaki ActiveX ComboBox'ın olayları o sayfanın kod modülüne, UserForm üzerindeki ComboBox'ın olayları ise UserForm'un kod modülüne yazılır. Yordamın adı DenetimAdı_Olay biçimindedir (ör. ComboBox1_Change). Denetimin üzerine çift tıklayarak iskeleti Excel'e oluşturtabilirsiniz.

1. Sayfaya ComboBox ekleyip AddItem ile doldurma​

Sayfada A2:A6 aralığında şehirler, B sütununda plaka kodları var. Aşağıdaki makro sayfaya bir ActiveX ComboBox ekler, şehirleri AddItem ile listeye aktarır, Style özelliğini yalnız listeden seçilecek biçime getirir ve ikinci öğeyi seçer. Sonra seçilen değeri, öğe sayısını ve ListIndex değerini C sütununa yazar. Kodu standart bir modüle yapıştırın ve örnek sayfa etkin iken çalıştırın.
VBA 35 satır
Option Explicit

Sub SehirComboBoxOlustur()
    Dim ws As Worksheet
    Dim ole As OLEObject
    Dim cmb As Object
    Dim i As Long

    Set ws = ActiveSheet

    ' Daha önce eklenmiş aynı adlı denetim varsa sil
    For i = ws.OLEObjects.Count To 1 Step -1
        If ws.OLEObjects(i).Name = "cmbSehir" Then ws.OLEObjects(i).Delete
    Next i

    ' E2 hücresinin üzerine ComboBox ekle
    Set ole = ws.OLEObjects.Add(ClassType:="Forms.ComboBox.1", _
        Left:=ws.Range("E2").Left, Top:=ws.Range("E2").Top, _
        Width:=120, Height:=20)
    ole.Name = "cmbSehir"
    Set cmb = ole.Object

    ' Şehirleri A2:A6 aralığından listeye aktar
    For i = 2 To 6
        cmb.AddItem ws.Cells(i, 1).Value
    Next i

    cmb.Style = 2        ' fmStyleDropDownList: yalnız listeden seçim
    cmb.ListIndex = 1    ' ikinci öğeyi seç (sıra sıfırdan başlar)

    ' Sonuçları C sütununa yaz
    ws.Range("C2").Value = cmb.Value
    ws.Range("C3").Value = cmb.ListCount
    ws.Range("C4").Value = cmb.ListIndex
End Sub
ComboBox
Formülünü incelemek için bir hücre seçin.
ABC
1ŞehirPlakaSonuç
2İstanbul34Ankara
3Ankara65
4İzmir351
5Bursa16
6Antalya7
Şehir SeçimiExcelDepo v1.0.0
Makro çalıştıktan sonra C2 hücresinde seçilen şehir (Ankara), C3 hücresinde listedeki öğe sayısı (5) ve C4 hücresinde seçili öğenin ListIndex değeri (1) görünür. ListIndex sıfırdan başladığı için ikinci öğeyi seçmek 1 değerini gerektirir. Denetim E2 hücresinin üzerinde durur; Tasarım Modu kapalıyken açılır listeyi kullanabilirsiniz.

2. Çok sütunlu liste ve BoundColumn​

A2:B5 aralığında ürün adları ve ürün kodları var. Makro bu iki sütunu ListFillRange ile ComboBox'a bağlar, ColumnCount ile iki sütun gösterir ve BoundColumn özelliğini 2 yapar. Böylece Value özelliği ürün adı yerine kodu döndürür; Column(0) ise adı verir. Kodu standart bir modüle yapıştırın ve örnek sayfa etkin iken çalıştırın.
VBA 32 satır
Option Explicit

Sub UrunComboBoxOlustur()
    Dim ws As Worksheet
    Dim ole As OLEObject
    Dim cmb As Object
    Dim i As Long

    Set ws = ActiveSheet

    ' Eski denetimi temizle
    For i = ws.OLEObjects.Count To 1 Step -1
        If ws.OLEObjects(i).Name = "cmbUrun" Then ws.OLEObjects(i).Delete
    Next i

    Set ole = ws.OLEObjects.Add(ClassType:="Forms.ComboBox.1", _
        Left:=ws.Range("E2").Left, Top:=ws.Range("E2").Top, _
        Width:=150, Height:=20)
    ole.Name = "cmbUrun"
    Set cmb = ole.Object

    ' İki sütunlu listeyi aralığa bağla
    cmb.ColumnCount = 2
    ole.ListFillRange = "A2:B5"
    cmb.BoundColumn = 2   ' Value, ikinci sütundaki kodu döndürsün

    cmb.ListIndex = 2     ' üçüncü öğeyi seç

    ws.Range("C2").Value = cmb.Value        ' bağlı sütun: ürün kodu
    ws.Range("C3").Value = cmb.Column(0)    ' birinci sütun: ürün adı
    ws.Range("C4").Value = cmb.ListCount
End Sub
ComboBox
Formülünü incelemek için bir hücre seçin.
ABC
1ÜrünKodSonuç
2KalemK-101K-103
3DefterK-102Silgi
4SilgiK-1034
5DosyaK-104
Ürün KodlarıExcelDepo v1.0.0
BoundColumn 2 olduğu için C2 hücresine Value ile ürün kodu (K-103) yazılır. C3 hücresinde Column(0) ile okunan ürün adı (Silgi), C4 hücresinde ise listedeki satır sayısı (4) görünür. Bağlı sütunu değiştirerek aynı listeden ad ya da kod alabilirsiniz. Liste aralığa bağlı olduğu için bu denetimde AddItem, RemoveItem ve Clear kullanılamaz.

3. UserForm üzerinde ComboBox​

Bu örnek bir UserForm içindir ve UserForm gösterildiği için otomatik çalıştırılmaz. Visual Basic Düzenleyicisi'nde Ekle > UserForm (Insert > UserForm) ile bir form oluşturun. Forma cmbBolge adlı bir ComboBox, lblSonuc adlı bir Label ve btnKaydet adlı bir CommandButton ekleyin. Aşağıdaki kodu formun kod modülüne yapıştırın. Formu açmak için başka bir modülde UserForm1.Show komutunu kullanabilirsiniz.
VBA 36 satır
Option Explicit

' Form açılırken listeyi doldur
Private Sub UserForm_Initialize()
    With Me.cmbBolge
        .Style = fmStyleDropDownList   ' yalnız listeden seçim
        .AddItem "Marmara"
        .AddItem "Ege"
        .AddItem "İç Anadolu"
        .AddItem "Akdeniz"
        .ListIndex = -1                ' başlangıçta seçim yok
    End With
    Me.lblSonuc.Caption = "Bir bölge seçin"
End Sub

' Seçim değişince etiketi güncelle
Private Sub cmbBolge_Change()
    If Me.cmbBolge.ListIndex >= 0 Then
        Me.lblSonuc.Caption = Me.cmbBolge.Value & " seçildi"
    End If
End Sub

' Seçili bölgeyi sayfadaki tablonun altına ekle
Private Sub btnKaydet_Click()
    Dim ws As Worksheet
    Dim sonSatir As Long

    If Me.cmbBolge.ListIndex = -1 Then
        MsgBox "Lütfen bir bölge seçin.", vbExclamation
        Exit Sub
    End If

    Set ws = ActiveSheet
    sonSatir = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
    ws.Cells(sonSatir, 1).Value = Me.cmbBolge.Value
End Sub
ComboBox
Formülünü incelemek için bir hücre seçin.
AB
1BölgeSatış Tutarı
2Marmara125.000,00
3Ege87.500,00
4İç Anadolu64.200,00
Bölge SatışExcelDepo v1.0.0
Form açıldığında ComboBox'ta dört bölge listelenir ve hiçbiri seçili olmaz. Kullanıcı bir bölge seçtiğinde Change olayı etiketi günceller. Kaydet düğmesine basıldığında seçili bölge, A sütunundaki son dolu hücrenin altına yazılır; seçim yapılmamışsa uyarı mesajı gösterilir. Örnekte MsgBox ve Show kullanıldığı için bu kod otomatik çalıştırılmaz; sonucu formu kendiniz açarak görebilirsiniz.

Kullanırken dikkat edin​

  • ListIndex sıfırdan başlar: İlk öğenin ListIndex değeri 0, hiçbir şey seçili değilken -1'dir. Column ve AddItem içindeki Index parametreleri de sıfırdan başlar; ancak BoundColumn ve ColumnCount gibi sütun sayısı belirten özellikler 1 tabanlıdır.
  • Value ve Text farkı: Kullanıcı listede olmayan bir metin yazabiliyorsa (Style = 0) Text yazılan metni verir. Seçimin gerçekten listeden yapıldığını denetlemek için ListIndex değerinin -1 olup olmadığına bakın. Tüm yazımları listeyle sınırlamak için Style özelliğini 2 yapın ya da MatchRequired özelliğini kullanın.
  • Aralığa bağlı listede AddItem ve Clear kullanılamaz: ListFillRange ya da RowSource ile bağlanmış listeye AddItem, RemoveItem ve Clear uygulayamazsınız. Listeyi kodla yönetmek istiyorsanız önce bağlantıyı boş bir metne ayarlayın; ya da listeyi bağlamak yerine List özelliğine aralığın değerlerini atayın.
  • Sayfadaki ActiveX denetimi ve Tasarım Modu: Sayfadaki ComboBox'ı seçmek, taşımak ve özelliklerini düzenlemek için Tasarım Modu açık olmalıdır. Denetimi kullanmak için Tasarım Modu'nu kapatın. ActiveX denetimleri Excel'in Mac sürümünde desteklenmez; ayrıca bazı Windows güncellemelerinden sonra denetimlerin çalışmaması gibi sorunlar görülebilir. Çalışma kitabını başka kullanıcılarla paylaşacaksanız Veri Doğrulama listesi daha güvenli bir seçenektir.
  • Sayfa ComboBox'ı ile Veri Doğrulama listesi: Yalnızca bir hücreye listeden değer girilmesini istiyorsanız Veri > Veri Araçları > Veri Doğrulama (Data > Data Tools > Data Validation) ile Liste kuralı eklemek çoğu zaman yeterlidir ve VBA gerektirmez. ComboBox'ı; çok sütunlu liste, yazarken otomatik tamamlama, olay yönetimi ya da form tasarımı gibi daha gelişmiş ihtiyaçlarda tercih edin.
  • Olay döngülerine dikkat edin: Change olayı içinde ComboBox'ın değerini ya da listesini değiştirirseniz olay yeniden tetiklenir. Gerekirse Application.EnableEvents ya da kendi bayrak değişkeninizle döngüyü engelleyin. UserForm_Initialize içinde ListIndex atarken de Change olayının çalışacağını unutmayın.
  • İlgili konular:
    • UserForm: ComboBox'ın en yaygın kullanıldığı form nesnesi.
    • ListBox: Listeyi açılır değil, sürekli açık gösteren ve çoklu seçim sağlayabilen denetim.
    • TextBox ve CommandButton: Formlarda ComboBox ile birlikte kullanılan denetimler.
    • OLEObjects: Sayfadaki ActiveX denetimlerine VBA ile erişim koleksiyonu.
    • Veri Doğrulama (Data Validation): Hücrede açılır liste oluşturmanın kodsuz yolu.
    • Worksheet_Change olayı: Sayfadaki hücre değişikliklerini izleme.
    • DÜŞEYARA, İNDİS ve KAÇINCI: Seçilen değere göre sayfadan karşılık getiren işlevler.
Ö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
11
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst