Özellik ikonu

ListBox

İndirme izni yok

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.

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.
Form Denetimleri (Form Controls) altındaki Liste Kutusu farklı bir nesnedir. Bu sayfadaki özellikler ve olaylar ActiveX ListBox için geçerlidir. Sayfaya ActiveX denetimi eklerken denetimi düzenlemek için Geliştirici > Tasarım Modu (Developer > Design Mode) açık olmalıdı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.
Liste RowSource ya da ListFillRange ile bir aralığa bağlıysa AddItem, RemoveItem ve Clear hata verir. Önce bağlantıyı kaldırın ya da listeyi yalnızca kodla doldurun.

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.
Olay yordamı nereye yazılır: UserForm üzerindeki ListBox için olay yordamları UserForm kod modülüne, sayfadaki ActiveX ListBox için ise denetimin bulunduğu sayfanın kod modülüne yazılır. Örnek bir UserForm kodu:
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
İlk yordam form açılırken listeyi doldurur, ikincisi çift tıklanan öğeyi bir hücreye yazar.

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.
AB
1ŞehirSeçim Durumu
2İstanbulSeçili
3AnkaraSeçili değil
4İzmirSeçili
5BursaSeçili değil
6AntalyaSeçili değil
7AdanaSeçili değil
Şehir ListesiExcelDepo v1.0.0
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.

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.
ABCD
1ÜrünStokSeçilen ÜrünSeçilen Stok
2Klavye40Monitör22
3Fare85
4Monitör22
5Yazıcı15
6Kulaklık60
7Web Kamerası33
Ürün StokExcelDepo v1.0.0
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.

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.
ABCD
1PersonelDepartmanTekil DepartmanAdet
2Ayşe YılmazSatışSatış4
3Mehmet KayaMuhasebeMuhasebe
4Fatma DemirSatışİnsan Kaynakları
5Ali Çelikİnsan KaynaklarıLojistik
6Zeynep AydınMuhasebe
7Can ÖztürkSatış
8Elif ŞahinLojistik
9Burak Arslanİnsan Kaynakları
DepartmanlarExcelDepo v1.0.0
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.

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