Genel Bakış
ListCount (ListCount property), bir ListBox ya da ComboBox denetimindeki satır (öğe) sayısını döndüren özelliktir. Liste boşsa 0 verir. Döngü sınırını belirlemek, listenin boş olup olmadığını denetlemek ve son öğeye ulaşmak için kullanılır.
Liste boşsa döngü hiç çalışmaz, çünkü üst sınır -1 olur. Son öğeyi seçmek için ListIndex özelliğine ListCount - 1 değerini atayabilirsiniz. Hiçbir öğe seçili değilken ListIndex değeri -1'dir.
Bu örnekte liste boşsa Sil düğmesi devre dışı bırakılır. Düğme adı cmdSil olarak varsayılmıştır.
A2:A7 aralığındaki adlar yüklendiğinde ListCount 6 olur. AddItem ile bir öğe eklenince sayı 7 değerine çıkar. RemoveItem ile ilk öğe silinince sayı 6 olur. ListCount her işlemden sonra güncel öğe sayısını verir.
Stoğu 10'un altında kalan ürünler listeye eklendi ve ListCount kritik ürün sayısı olarak 4 değerini verdi. Son öğenin dizini ListCount - 1 olduğundan ListIndex ile seçilen ürün Cetvel oldu. Liste boş olsaydı ListCount 0 döneceği için If bloğu çalışmaz ve ListIndex hatası oluşmazdı.
ListedeVarMi işlevi, liste boşken ListCount 0 olduğu için döngüye girmez ve False döndürür. İlk kategori bu sayede eklenir. Tekrarlar elendikten sonra ComboBox'ta 5 farklı kategori kalır. İlk tekrarsız öğe B2 hücresinde Meyve olarak görünür; diğer öğeler altındaki hücrelere sırayla yazılır.
ListCount nedir ve nerede kullanılır
ListCount özelliği, UserForm üzerindeki ya da çalışma sayfasına yerleştirilmiş ActiveX ListBox ve ComboBox denetimlerinde bulunur. Listeye AddItem yöntemiyle, .List özelliğiyle ya da RowSource ile eklenen öğelerin toplamını verir. Özellik yalnızca okunur; değer atamaya çalışırsanız hata alırsınız. Listeyi değiştirmek için AddItem, RemoveItem ve Clear yöntemlerini kullanın.- ListBox ve ComboBox: ListCount her ikisinde de aynı mantıkla çalışır.
- Çok sütunlu liste: ListCount satır sayısını verir, sütun sayısını değil. Sütun sayısı için ColumnCount özelliği vardır.
- Sütun başlıkları: ColumnHeads ile gösterilen başlık satırı ListCount değerine dahil edilmez.
- RowSource kullanımı: Liste bir hücre aralığına bağlıysa ListCount o aralığın satır sayısını verir.
- Form Denetimleri: Geliştirici sekmesindeki Form Denetimleri (Form Controls) ActiveX değildir; onlarda sayıyı ControlFormat nesnesi üzerinden okursunuz.
Söz dizimi
Özellik parametre almaz; denetim adından sonra yazılır ve Long türünde bir sayı döndürür:
VBA
5 satır
nesne.ListCount
' UserForm içinden örnekler
Sayi = Me.ListBox1.ListCount
Sayi = UserForm1.ComboBox1.ListCount
- nesne: ListBox ya da ComboBox denetimi; zorunludur. ActiveX denetimi sayfadaysa önce OLEObjects koleksiyonundan alıp .Object özelliğiyle denetimin kendisine ulaşırsınız.
- Dönüş değeri: Listedeki öğe sayısı. Liste boşsa 0 döner.
Sıfır tabanlı dizin ve döngüler
Listedeki öğeler 0'dan başlayarak numaralanır. Bu yüzden ilk öğenin dizini 0, son öğenin dizini ListCount - 1 olur. Tüm öğeleri dolaşırken döngüyü şöyle kurun:
VBA
3 satır
For i = 0 To lst.ListCount - 1
' lst.List(i) ile öğeye ulaşın
Next i
Liste boşsa döngü hiç çalışmaz, çünkü üst sınır -1 olur. Son öğeyi seçmek için ListIndex özelliğine ListCount - 1 değerini atayabilirsiniz. Hiçbir öğe seçili değilken ListIndex değeri -1'dir.
- List(i): i. dizindeki öğenin metnini verir.
- ListIndex: Seçili öğenin dizinini verir ya da ayarlar.
- Selected(i): ListBox'ta i. öğenin seçili olup olmadığını verir.
- ListRows: ComboBox açıldığında görünen satır sayısıdır. ListCount ile karıştırmayın.
UserForm içinde kullanım
UserForm açılırken listeyi doldurup öğe sayısını denetlemek yaygın bir kullanımdır. Aşağıdaki kod UserForm kod modülündeki UserForm_Initialize olay yordamına yazılır:
VBA
6 satır
Private Sub UserForm_Initialize()
Me.ListBox1.RowSource = "Personel!A2:A20"
If Me.ListBox1.ListCount = 0 Then
Me.cmdSil.Enabled = False
End If
End Sub
Bu örnekte liste boşsa Sil düğmesi devre dışı bırakılır. Düğme adı cmdSil olarak varsayılmıştır.
1. Listeye eklenen ve silinen öğeleri saymak
Personel adları A sütunundadır. Makro sayfaya geçici bir ListBox ekler, adları listeye yükler ve her işlemden sonra ListCount değerini C sütununa yazar. Sonunda geçici denetimi siler. Kodu standart bir modüle yapıştırın.
VBA
31 satır
Option Explicit
Sub ListeSayisiniYaz()
Dim ws As Worksheet
Dim ole As OLEObject
Dim lst As Object
Set ws = Worksheets("Personel")
' Sayfaya geçici bir ListBox ekle
Set ole = ws.OLEObjects.Add(ClassType:="Forms.ListBox.1", Left:=300, Top:=10, Width:=120, Height:=80)
Set lst = ole.Object
' Adları aralıktan yükle
lst.List = ws.Range("A2:A7").Value
ws.Range("C2").Value = lst.ListCount
ws.Range("D2").Value = "Aralıktan yüklenen öğe sayısı"
' Bir öğe ekle
lst.AddItem "Zeynep Aydın"
ws.Range("C3").Value = lst.ListCount
ws.Range("D3").Value = "AddItem sonrası"
' İlk öğeyi sil
lst.RemoveItem 0
ws.Range("C4").Value = lst.ListCount
ws.Range("D4").Value = "RemoveItem sonrası"
' Geçici denetimi kaldır
ole.Delete
End Sub
ListCount
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ad Soyad | Departman | ListCount | Açıklama |
| 2 | Ayşe Yılmaz | Muhasebe | 6 | Aralıktan yüklenen öğe sayısı |
| 3 | Mehmet Kaya | Satış | 7 | AddItem sonrası |
| 4 | Fatma Demir | İnsan Kaynakları | 6 | RemoveItem sonrası |
| 5 | Ali Çelik | Satın Alma | ||
| 6 | Elif Şahin | Bilgi İşlem | ||
| 7 | Mustafa Arslan | Üretim |
PersonelExcelDepo v1.0.0
2. Koşula uyan öğeleri listeleyip son öğeyi seçmek
Stok sayfasında ürünler ve stok miktarları vardır. Makro stoğu 10'un altındaki ürünleri geçici bir ListBox'a ekler. ListCount ile kritik ürün sayısını, ListIndex ile de listenin son öğesini bulur. Kodu standart bir modüle yapıştırın.
VBA
30 satır
Option Explicit
Sub KritikStoklariListele()
Dim ws As Worksheet
Dim ole As OLEObject
Dim lst As Object
Dim i As Long
Set ws = Worksheets("Stok")
Set ole = ws.OLEObjects.Add(ClassType:="Forms.ListBox.1", Left:=400, Top:=10, Width:=120, Height:=80)
Set lst = ole.Object
' Stoğu 10'un altındaki ürünleri listeye ekle
For i = 2 To 9
If ws.Cells(i, 2).Value < 10 Then lst.AddItem ws.Cells(i, 1).Value
Next i
' Kritik ürün sayısı
ws.Range("C2").Value = lst.ListCount
ws.Range("D2").Value = "Kritik ürün sayısı"
' Liste boş değilse son öğeyi seç ve adını yaz
If lst.ListCount > 0 Then
lst.ListIndex = lst.ListCount - 1
ws.Range("C3").Value = lst.List(lst.ListIndex)
ws.Range("D3").Value = "Listenin son öğesi"
End If
ole.Delete
End Sub
ListCount
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Stok | Sonuç | Açıklama |
| 2 | Kalem | 120 | 4 | Kritik ürün sayısı |
| 3 | Defter | 8 | Cetvel | Listenin son öğesi |
| 4 | Silgi | 45 | ||
| 5 | Zımba | 4 | ||
| 6 | Dosya | 60 | ||
| 7 | A4 Kağıt | 7 | ||
| 8 | Makas | 30 | ||
| 9 | Cetvel | 9 |
StokExcelDepo v1.0.0
3. ComboBox'a yinelenen kayıt eklememek
A sütunundaki kategorilerde tekrarlar vardır. Makro her kategoriyi geçici bir ComboBox'a yalnızca listede yoksa ekler. Varlık denetimi için 0'dan ListCount - 1'e kadar döner. Sonuç B sütununa, öğe sayısı C2 hücresine yazılır. Kodu standart bir modüle yapıştırın.
VBA
40 satır
Option Explicit
' Aranan metin listede var mı?
Function ListedeVarMi(cbo As Object, ByVal aranan As String) As Boolean
Dim i As Long
For i = 0 To cbo.ListCount - 1
If cbo.List(i) = aranan Then
ListedeVarMi = True
Exit Function
End If
Next i
End Function
Sub TekrarsizListeOlustur()
Dim ws As Worksheet
Dim ole As OLEObject
Dim cbo As Object
Dim i As Long
Set ws = Worksheets("Kategoriler")
Set ole = ws.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=300, Top:=10, Width:=120, Height:=20)
Set cbo = ole.Object
' Her kategoriyi yalnızca listede yoksa ekle
For i = 2 To 11
If Not ListedeVarMi(cbo, ws.Cells(i, 1).Value) Then
cbo.AddItem ws.Cells(i, 1).Value
End If
Next i
' Tekrarsız öğeleri B sütununa yaz
For i = 0 To cbo.ListCount - 1
ws.Cells(i + 2, 2).Value = cbo.List(i)
Next i
' Toplam öğe sayısı
ws.Range("C2").Value = cbo.ListCount
ole.Delete
End Sub
ListCount
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Kategori | Tekrarsız Liste | Tekrarsız Sayı |
| 2 | Meyve | Meyve | 5 |
| 3 | Sebze | Sebze | |
| 4 | Meyve | Süt Ürünleri | |
| 5 | Süt Ürünleri | Bakliyat | |
| 6 | Sebze | Şarküteri | |
| 7 | Bakliyat | ||
| 8 | Meyve | ||
| 9 | Süt Ürünleri | ||
| 10 | Bakliyat | ||
| 11 | Şarküteri |
KategorilerExcelDepo v1.0.0
Kullanırken dikkat edin
- Son dizin ListCount değil, ListCount - 1'dir: Öğeler 0'dan başladığı için en sık yapılan hata döngüyü 0 To ListCount biçiminde yazmaktır. Bu, son turda var olmayan bir dizine erişmeye çalışır ve "Subscript out of range" benzeri bir hata verir. Döngüyü her zaman 0 To ListCount - 1 olarak kurun.
- Özellik salt okunurdur: ListCount değerine atama yapamazsınız. Öğe sayısını değiştirmek için AddItem, RemoveItem ya da Clear yöntemlerini kullanın. Silme döngüsünde ListCount azalacağından, öğeleri sondan başa doğru silmek daha güvenlidir.
- Boş liste ve ListIndex: Liste boşken ListCount 0'dır; hiçbir öğe seçili değilken de ListIndex -1'dir. Bir öğeye erişmeden önce ListCount > 0 koşulunu denetleyin. Seçili öğeyi okumadan önce de ListIndex değerinin -1 olmadığından emin olun.
- ListCount satır sayısıdır: Çok sütunlu bir listede ListCount sütun sayısını değil satır sayısını verir. ComboBox'taki ListRows ise açılır listede aynı anda görünen satır sayısını belirler. Bu iki özellik birbirinden bağımsızdır.
- ActiveX denetimlerine .Object ile ulaşın: Sayfadaki bir ActiveX ListBox ya da ComboBox için ListCount'u doğrudan OLEObject üzerinden okuyamazsınız. Önce OLEObject.Object ile denetimin kendisine ulaşın. Sayfada tasarım modundaki denetimler için makro içinde denetim adını kullanmak da mümkündür; sayfa modülünde bu ad doğrudan nesne gibi çalışır.
- İlgili konular:
- ListBox ve ComboBox: ListCount'un bulunduğu denetimler.
- AddItem, RemoveItem, Clear: Listeyi değiştiren yöntemler.
- List, ListIndex, Selected: Öğelere ve seçime erişen özellikler.
- RowSource ve ColumnCount: Listeyi hücre aralığına bağlayan ve sütun sayısını belirleyen özellikler.
- ListRows: ComboBox'ta görünen satır sayısı.
- UserForm_Initialize: Listenin doldurulduğu olay.
- BAĞ_DEĞ_DOLU_SAY ve EĞERSAY: Hücre aralığındaki öğeleri sayan çalışma sayfası işlevleri.