Genel Bakış
ListBox (Liste Kutusu), bir UserForm üzerine ya da doğrudan çalışma sayfasına yerleştirilebilen ve birden çok öğeyi alt alta gösteren ActiveX denetimidir. Kullanıcı listeden bir ya da birden çok öğe seçebilir, VBA kodu da bu seçimi okuyup değiştirebilir. Seçenek sayısı çok olduğunda ve kullanıcının tüm seçenekleri aynı anda görmesi istendiğinde ComboBox yerine tercih edilir.
İlk yordam form açılırken listeyi doldurur, ikincisi çift tıklanan öğeyi bir hücreye yazar.
Makro çalışınca sayfada altı şehri içeren bir liste kutusu belirir ve birinci ile üçüncü öğe seçili olur. B sütununda İstanbul için Seçili, Ankara için Seçili değil, İzmir için Seçili yazar. Kalan şehirler için de B5, B6 ve B7 hücreleri aynı mantıkla doldurulur. Öğe sırası 0'dan, hücre satırı ise 2'den başladığı için kodda i + 2 kullanıldığına dikkat edin.
Liste kutusu iki sütunlu görünür ve üçüncü satır seçili gelir. C2 hücresine seçilen ürün adı olarak Monitör, D2 hücresine seçilen ürünün stoğu olarak 22 yazılır. Stok değeri liste içinde metin olarak durduğu için CLng ile sayıya çevrilip yazılmıştır. ListFillRange kullanıldığı için bu listede AddItem ya da Clear çalışmaz; kaynak aralığı değiştirirseniz liste kendiliğinden güncellenir.
Liste kutusuna her departman yalnızca bir kez eklenir. C sütununa sırayla Satış, Muhasebe, İnsan Kaynakları ve Lojistik yazılır; D2 hücresindeki 4 değeri de listedeki öğe sayısıdır. İç döngü ListCount sayısı kadar döner ve Exit For ile eşleşme bulunur bulunmaz çıkar. Karşılaştırma büyük/küçük harfe duyarlıdır; "satış" ile "Satış" farklı öğe sayılır.
Liste kutusu nedir ve nerede kullanılır
ListBox, Microsoft Forms 2.0 denetim kitaplığında yer alan bir denetimdir. İki yerde kullanılır:- UserForm üzerinde: VBA Düzenleyicisi'nde Araç Kutusu (Toolbox) içinden forma sürüklenir. Veri girişi, filtre seçimi ve kayıt arama formlarının temel parçasıdır.
- Çalışma sayfasında: Geliştirici > Ekle > ActiveX Denetimleri > Liste Kutusu (Developer > Insert > ActiveX Controls > List Box) yolu ile eklenir. Kod ile eklemek için OLEObjects.Add yöntemi kullanılır ve ListBox nesnesine OLEObject.Object özelliği ile ulaşılır.
Önemli özellikler
- List: Öğelerin tümüne erişir. List(satır, sütun) biçiminde okunur ve yazılır; indeksler 0'dan başlar. Bir diziyi ya da aralığın Value değerini atayarak listeyi toptan doldurabilirsiniz.
- ListCount: Listedeki öğe sayısıdır (salt okunur).
- ListIndex: Seçili öğenin 0 tabanlı sırasıdır. Seçim yoksa -1 döner. Atama yaparak bir öğeyi kodla seçebilirsiniz.
- Value ve Text: Tekli seçimde seçili öğenin değerini verir. Çoklu seçimde Value Null döner, bu yüzden Selected kullanılmalıdır.
- Selected(i): i. öğenin seçili olup olmadığını okur ya da ayarlar (True/False).
- MultiSelect: 0 (fmMultiSelectSingle) tekli seçim, 1 (fmMultiSelectMulti) tıklayarak çoklu seçim, 2 (fmMultiSelectExtended) Shift ve Ctrl ile çoklu seçim sağlar. Varsayılan 0'dır.
- ColumnCount: Sütun sayısı. ColumnWidths sütun genişliklerini noktalı virgülle ayrılmış biçimde belirler.
- RowSource: UserForm'daki ListBox için kaynak aralığı bağlar (ör. Sayfa1!A2:B10). Sayfadaki ActiveX ListBox'ta bunun karşılığı ListFillRange özelliğidir.
- LinkedCell: Sayfadaki ListBox'ta seçilen değerin yazılacağı hücreyi belirler.
- BoundColumn ve TextColumn: Çok sütunlu listede Value ve Text özelliklerinin hangi sütundan okunacağını belirler.
- ColumnHeads: RowSource ya da ListFillRange ile bağlı listede kaynağın üstündeki satırı sütun başlığı olarak gösterir.
Söz dizimi: yöntemler ve parametreler
Listeye kodla öğe eklemek, silmek ve temizlemek için şu yöntemler kullanılır:
VBA
3 satır
ListBox.AddItem [Item], [varIndex]
ListBox.RemoveItem Index
ListBox.Clear
- Item: Eklenecek metin. İsteğe bağlıdır; çok sütunlu listede ilk sütuna yazılır. Diğer sütunları List(satır, sütun) ile doldurursunuz.
- varIndex: Öğenin ekleneceği 0 tabanlı konum. İsteğe bağlıdır; verilmezse öğe listenin sonuna eklenir.
- Index: RemoveItem için silinecek öğenin 0 tabanlı sırası. Zorunludur.
- Clear: Parametre almaz ve tüm öğeleri siler.
Olaylar ve UserForm kullanımı
Sık kullanılan olaylar şunlardır:- Click: Kullanıcı bir öğeye tıkladığında oluşur.
- DblClick: Çift tıklamada oluşur; seçilen öğeyi işleme almak için sık kullanılır.
- Change: Seçim değiştiğinde (kodla değiştirildiğinde de) oluşur.
- Enter ve Exit: Denetim odağı aldığında ve kaybettiğinde oluşur.
VBA
11 satır
Private Sub UserForm_Initialize()
With Me.lstUrun
.ColumnCount = 2
.AddItem "Klavye"
.List(.ListCount - 1, 1) = 40
End With
End Sub
Private Sub lstUrun_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
ThisWorkbook.Worksheets(1).Range("F1").Value = Me.lstUrun.Value
End Sub
1. Sayfada ListBox oluşturma ve seçimleri okuma
Sayfada şehir adları A2:A7 hücrelerinde duruyor. Makro, sayfaya bir ActiveX ListBox ekler, şehirleri AddItem ile doldurur, çoklu seçimi açar ve iki öğeyi kodla seçer. Ardından Selected özelliğini tek tek kontrol edip sonucu B sütununa yazar. Kodu standart bir modüle yapıştırın ve çalıştırın.
VBA
42 satır
Option Explicit
Sub ListeKutusuOlustur()
Dim ws As Worksheet
Dim ole As OLEObject
Dim lb As Object
Dim i As Long
Set ws = ActiveSheet
' Önceki çalıştırmadan kalan liste kutusunu sil
On Error Resume Next
ws.OLEObjects("lstSehir").Delete
On Error GoTo 0
' Sayfaya ActiveX ListBox ekle
Set ole = ws.OLEObjects.Add(ClassType:="Forms.ListBox.1", _
Left:=150, Top:=20, Width:=110, Height:=100)
ole.Name = "lstSehir"
Set lb = ole.Object
' Çoklu seçimi aç (1 = fmMultiSelectMulti)
lb.MultiSelect = 1
' Şehirleri listeye ekle
For i = 2 To 7
lb.AddItem ws.Cells(i, 1).Value
Next i
' 1. ve 3. öğeyi seç (indeks 0 tabanlıdır)
lb.Selected(0) = True
lb.Selected(2) = True
' Seçim durumunu B sütununa yaz
For i = 0 To lb.ListCount - 1
If lb.Selected(i) Then
ws.Cells(i + 2, 2).Value = "Seçili"
Else
ws.Cells(i + 2, 2).Value = "Seçili değil"
End If
Next i
End Sub
ListBox
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Şehir | Seçim Durumu |
| 2 | İstanbul | Seçili |
| 3 | Ankara | Seçili değil |
| 4 | İzmir | Seçili |
| 5 | Bursa | Seçili değil |
| 6 | Antalya | Seçili değil |
| 7 | Adana | Seçili değil |
Şehir ListesiExcelDepo v1.0.0
2. Çok sütunlu liste ve ListFillRange
Ürün adları ve stok miktarları A2:B7 aralığında duruyor. Makro, ListBox'ı ListFillRange ile bu aralığa bağlar, ColumnCount değerini 2 yapar ve ListIndex ile üçüncü satırı seçer. Seçilen satırın iki sütununu List(satır, sütun) ile okuyup C2 ve D2 hücrelerine yazar. Kodu standart bir modüle yapıştırın.
VBA
29 satır
Option Explicit
Sub ListeyiAralikIleDoldur()
Dim ws As Worksheet
Dim ole As OLEObject
Dim lb As Object
Set ws = ActiveSheet
On Error Resume Next
ws.OLEObjects("lstUrun").Delete
On Error GoTo 0
Set ole = ws.OLEObjects.Add(ClassType:="Forms.ListBox.1", _
Left:=300, Top:=20, Width:=140, Height:=100)
ole.Name = "lstUrun"
' Listeyi hücre aralığına bağla (sayfa adı tırnak içinde)
ole.ListFillRange = "'" & ws.Name & "'!A2:B7"
Set lb = ole.Object
lb.ColumnCount = 2
' Üçüncü satırı seç (indeks 0 tabanlıdır)
lb.ListIndex = 2
' Seçili satırın sütunlarını oku
ws.Range("C2").Value = lb.List(lb.ListIndex, 0)
ws.Range("D2").Value = CLng(lb.List(lb.ListIndex, 1))
End Sub
ListBox
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Stok | Seçilen Ürün | Seçilen Stok |
| 2 | Klavye | 40 | Monitör | 22 |
| 3 | Fare | 85 | ||
| 4 | Monitör | 22 | ||
| 5 | Yazıcı | 15 | ||
| 6 | Kulaklık | 60 | ||
| 7 | Web Kamerası | 33 |
Ürün StokExcelDepo v1.0.0
3. Tekrarsız liste oluşturma
B sütununda personelin departmanları tekrar ederek yer alıyor. Makro, bu değerleri ListBox'a ekler ama listede zaten bulunan bir departmanı atlar. Böylece liste tekrarsız olur. Sonra List özelliği ile öğeleri C sütununa, ListCount değerini D2 hücresine yazar. Kodu standart bir modüle yapıştırın.
VBA
43 satır
Option Explicit
Sub TekilDepartmanListesi()
Dim ws As Worksheet
Dim ole As OLEObject
Dim lb As Object
Dim i As Long, j As Long
Dim varMi As Boolean
Set ws = ActiveSheet
On Error Resume Next
ws.OLEObjects("lstDepartman").Delete
On Error GoTo 0
Set ole = ws.OLEObjects.Add(ClassType:="Forms.ListBox.1", _
Left:=350, Top:=20, Width:=130, Height:=90)
ole.Name = "lstDepartman"
Set lb = ole.Object
For i = 2 To 9
varMi = False
' Değer listede zaten var mı?
For j = 0 To lb.ListCount - 1
If lb.List(j) = ws.Cells(i, 2).Value Then
varMi = True
Exit For
End If
Next j
' Yoksa listeye ekle
If Not varMi Then
lb.AddItem ws.Cells(i, 2).Value
End If
Next i
' Liste öğelerini C sütununa yaz
For i = 0 To lb.ListCount - 1
ws.Cells(i + 2, 3).Value = lb.List(i)
Next i
' Öğe sayısını D2 hücresine yaz
ws.Range("D2").Value = lb.ListCount
End Sub
ListBox
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Personel | Departman | Tekil Departman | Adet |
| 2 | Ayşe Yılmaz | Satış | Satış | 4 |
| 3 | Mehmet Kaya | Muhasebe | Muhasebe | |
| 4 | Fatma Demir | Satış | İnsan Kaynakları | |
| 5 | Ali Çelik | İnsan Kaynakları | Lojistik | |
| 6 | Zeynep Aydın | Muhasebe | ||
| 7 | Can Öztürk | Satış | ||
| 8 | Elif Şahin | Lojistik | ||
| 9 | Burak Arslan | İnsan Kaynakları |
DepartmanlarExcelDepo v1.0.0
Kullanırken dikkat edin
- İndeksler 0'dan başlar: List, Selected, ListIndex ve RemoveItem 0 tabanlıdır. Sayfadaki satır numarası ile liste sırası arasında fark vardır; bu yüzden döngülerde satır = i + 2 gibi dönüşüm gerekir.
- Çoklu seçimde Value kullanmayın: MultiSelect 0'dan farklıysa Value Null döner ve atama yaptığınızda hata alabilirsiniz. Seçili öğeleri bulmak için 0'dan ListCount - 1 değerine kadar dönüp Selected(i) özelliğini kontrol edin.
- RowSource ile AddItem birlikte kullanılmaz: Liste bir aralığa bağlıyken AddItem, RemoveItem ve Clear çalışmaz. Kodla düzenleme yapacaksanız RowSource (sayfada ListFillRange) özelliğini boşaltın ya da listeyi baştan yalnızca kodla doldurun.
- Column ve List dizinleri ters sıradadır: List(satır, sütun) önce satırı, Column(sütun, satır) önce sütunu alır. Karıştırırsanız yanlış hücre okunur ya da hata oluşur.
- Değerler metin olarak gelir: Aralıktan doldurulan listede sayılar ve tarihler List ile metin olarak okunabilir. Hesap yapmadan önce CLng, CDbl ya da CDate ile dönüştürün.
- Sayfadaki denetimin sınırları: ActiveX denetimleri Excel'in Mac sürümünde sınırlı desteklenir, korumalı sayfada kullanılamayabilir ve dosya Excel Online'da açıldığında çalışmaz. Tasarım Modu açıkken denetim seçilip düzenlenir, kapalıyken olaylar çalışır. Aynı adla ikinci denetim eklemek hata verir; örneklerdeki gibi önce eskisini silin.
- İlgili konular: UserForm, ComboBox (Birleşik Kutu), CheckBox, OLEObjects koleksiyonu, Range.Value, Geliştirici sekmesi ve Tasarım Modu, Veri Doğrulama (açılır liste), İNDİS ve KAÇINCI işlevleri ile EĞERSAY işlevi.