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.
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).
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.
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.
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.
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.
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.
- 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.
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.| A | B | C | |
|---|---|---|---|
| 1 | Şehir | Plaka | Sonuç |
| 2 | İstanbul | 34 | Ankara |
| 3 | Ankara | 6 | 5 |
| 4 | İzmir | 35 | 1 |
| 5 | Bursa | 16 | |
| 6 | Antalya | 7 |
Şehir SeçimiExcelDepo v1.0.0
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.| A | B | C | |
|---|---|---|---|
| 1 | Ürün | Kod | Sonuç |
| 2 | Kalem | K-101 | K-103 |
| 3 | Defter | K-102 | Silgi |
| 4 | Silgi | K-103 | 4 |
| 5 | Dosya | K-104 |
Ürün KodlarıExcelDepo v1.0.0
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.| A | B | |
|---|---|---|
| 1 | Bölge | Satış Tutarı |
| 2 | Marmara | 125.000,00 |
| 3 | Ege | 87.500,00 |
| 4 | İç Anadolu | 64.200,00 |
Bölge SatışExcelDepo v1.0.0
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.