Genel Bakış
ListView (ListView denetimi), UserForm üzerinde verileri başlıklı sütunlar ve satırlar halinde gösteren, ActiveX tabanlı bir liste denetimidir. Ayrıntılı görünümde (Report) bir tabloya benzer; satır seçme, onay kutusu, sütuna göre sıralama ve satır içi düzenleme gibi özellikler sunar. ListBox denetiminin sınırlı kaldığı çok sütunlu ve etkileşimli listelerde tercih edilir.
Denetim MSCOMCTL.OCX dosyasına dayanır. Kodda MSComctlLib.ListView türünü kullanmak için Araçlar > Başvurular (Tools > References) altında Microsoft Windows Common Controls 6.0 başvurusunun işaretli olması gerekir. Başvuru kullanmak istemezseniz denetimi Object türüyle geç bağlanmış olarak da kullanabilirsiniz; bu sayfadaki örnekler bu yöntemi kullanır.
Sütun eklemenin söz dizimi şöyledir:
Bu örnek form gerektirdiği için burada çalıştırılmaz. Form açıldığında ListView'da dört sütunlu tablo görünür; ilk sütunda ad soyad, diğer sütunlarda departman, şehir ve biçimlendirilmiş maaş yer alır. Maaş sütunu sağa yaslıdır. Sayfaya yeni satır eklerseniz kod son dolu satırı kendisi bulduğu için değişiklik gerekmez.
Bu örnek form olmadan çalıştırılamaz. İlk tıklamada liste seçilen sütuna göre artan sıralanır. Aynı başlığa yeniden tıkladığınızda yön azalana döner. Başka bir sütun başlığına tıklarsanız sıralama o sütunda artan düzenle yeniden başlar. Tutar sütunu boşlukla tamamlandığı için 850 değeri 112.000 değerinden önce gelir; düz metin olarak yazılsaydı sıra yanlış olurdu.
Bu örnek form ve MsgBox içerdiği için burada çalıştırılmaz. Liste yüklendiğinde her ürünün solunda bir onay kutusu görünür. Kullanıcı stoğu azalan ürünleri işaretleyip düğmeye bastığında işaretli satırların Sipariş sütununa Sipariş verilecek yazılır. Satır numarası Tag özelliğinde tutulduğu için liste sıralansa bile doğru satır güncellenir. UrunuBul yordamı, ürün adının bir parçasıyla eşleşen ilk satırı seçer ve görünür alana kaydırır; bulunamazsa bir ileti gösterir.
Denetimi UserForm'a ekleme
ListView, varsayılan Araç Kutusu'nda yoktur; önce eklemeniz gerekir. Visual Basic Düzenleyicisi'nde bir UserForm açın, Araç Kutusu'na sağ tıklayıp Ek Denetimler (Additional Controls) seçeneğini seçin ve listeden Microsoft ListView Control, version 6.0 kutusunu işaretleyin. Ardından araç kutusuna eklenen simgeyi forma sürükleyin; denetim varsayılan olarak ListView1 adını alır.Denetim MSCOMCTL.OCX dosyasına dayanır. Kodda MSComctlLib.ListView türünü kullanmak için Araçlar > Başvurular (Tools > References) altında Microsoft Windows Common Controls 6.0 başvurusunun işaretli olması gerekir. Başvuru kullanmak istemezseniz denetimi Object türüyle geç bağlanmış olarak da kullanabilirsiniz; bu sayfadaki örnekler bu yöntemi kullanır.
Sütun eklemenin söz dizimi şöyledir:
VBA
2 satır
ListView1.ColumnHeaders.Add Index, Key, Text, Width, Alignment, Icon
ListView1.ListItems.Add Index, Key, Text, Icon, SmallIcon
- Index: öğenin sıra konumu; isteğe bağlıdır, boş bırakılırsa sona eklenir.
- Key: öğeye metinle erişmek için benzersiz anahtar; isteğe bağlıdır.
- Text: sütun başlığı ya da satırın ilk sütunundaki metin.
- Width: sütun genişliği; isteğe bağlıdır, boşsa varsayılan genişlik kullanılır.
- Alignment: hizalama; 0 sola, 1 sağa, 2 ortaya (lvwColumnLeft, lvwColumnRight, lvwColumnCenter). Varsayılan sola hizalamadır.
- Icon, SmallIcon: ImageList içindeki simge numarası ya da anahtarı; isteğe bağlıdır.
Önemli özellikler
- View: görünüm biçimi; 0 lvwIcon (büyük simge, varsayılan), 1 lvwSmallIcon, 2 lvwList, 3 lvwReport (başlıklı sütunlar). Tablo görünümü için 3 değerini verin.
- ColumnHeaders: sütun başlıkları koleksiyonudur; yalnız Report görünümünde görünür.
- ListItems: satırların koleksiyonudur; Count, Add, Remove ve Clear üyelerini kullanırsınız.
- FullRowSelect: True olursa tıklanınca satırın tamamı seçilir; yalnız Report görünümünde etkilidir.
- Gridlines: True olursa satır ve sütun ızgara çizgileri görünür.
- Checkboxes: True olursa her satırın başına onay kutusu eklenir; durumu ListItem nesnesinin Checked özelliğinden okursunuz.
- MultiSelect: True olursa Ctrl ve Shift ile birden çok satır seçilebilir; seçili satırları Selected özelliğiyle ayırt edersiniz.
- SelectedItem: seçili satırı döndürür; hiçbir satır seçili değilse Nothing olur.
- Sorted, SortKey, SortOrder: sıralamayı denetler. SortKey sütun numarasından bir eksiktir (0 ilk sütundur); SortOrder 0 artan, 1 azalandır.
- LabelEdit: 0 lvwAutomatic ise ilk sütundaki metin tıklanarak düzenlenebilir, 1 lvwManual ise düzenleme kapalıdır ve yalnız kodla başlatılır.
- HideColumnHeaders: True olursa başlık satırı gizlenir.
- HideSelection: denetim odağını kaybettiğinde seçimin gösterilip gösterilmeyeceğini belirler.
Önemli yöntemler ve olaylar
- FindItem: metne göre satır arar; bulamazsa Nothing döndürür. Aranan metin, arama yeri (0 ilk sütun metni, 1 alt öğeler, 2 Tag), başlangıç dizini ve eşleşme türü (0 tam sözcük, 1 kısmi) verilir.
- HitTest: fare koordinatına karşılık gelen satırı döndürür; MouseDown olayında yararlıdır.
- StartLabelEdit: seçili satırın metnini düzenleme kipine alır.
- ListItem.EnsureVisible: satırı görünür alana kaydırır.
- ItemClick: bir satıra tıklandığında çalışır; tıklanan ListItem nesnesi parametre olarak gelir.
- ColumnClick: bir sütun başlığına tıklandığında çalışır; tıklanan ColumnHeader nesnesi gelir ve sıralama için kullanılır.
- DblClick: çift tıklamada çalışır; seçili satırı işlemek için kullanılır.
- ItemCheck: onay kutusunun durumu değiştiğinde çalışır.
- BeforeLabelEdit, AfterLabelEdit: satır içi düzenleme öncesinde ve sonrasında çalışır; Cancel parametresiyle düzenleme iptal edilebilir.
VBA
3 satır
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
' Sıralama yordamını burada çağırın
End Sub
1. Sayfa verisini ListView'a aktarma
Aşağıdaki sayfada dört sütunlu bir personel listesi var. ListView1 denetimi olan bir UserForm hazırlayın ve kodu standart modüle yapıştırın. Ardından UserForm'un UserForm_Initialize olayında bu yordamı denetimi göndererek çağırın. Yordam Report görünümünü açar, başlıkları sayfanın ilk satırından alır ve her sayfa satırını bir ListItem olarak ekler.
VBA
32 satır
Option Explicit
' UserForm_Initialize içinde şöyle çağrılır:
' PersonelListesiniDoldur Me.ListView1
Sub PersonelListesiniDoldur(lv As Object)
Dim ws As Worksheet
Dim son As Long, i As Long, j As Long
Dim li As Object
Set ws = ThisWorkbook.Worksheets("Personel")
son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lv.ListItems.Clear
lv.ColumnHeaders.Clear
lv.View = 3 ' lvwReport: başlıklı sütun görünümü
lv.FullRowSelect = True
lv.Gridlines = True
' Başlıkları sayfanın ilk satırından oluşturur
For j = 1 To 4
lv.ColumnHeaders.Add , , ws.Cells(1, j).Value, 80
Next j
lv.ColumnHeaders(4).Alignment = 1 ' lvwColumnRight: Maaş sağa yaslı
' Her sayfa satırı için bir ListItem ve üç alt öğe ekler
For i = 2 To son
Set li = lv.ListItems.Add(, , ws.Cells(i, 1).Value)
li.SubItems(1) = ws.Cells(i, 2).Value
li.SubItems(2) = ws.Cells(i, 3).Value
li.SubItems(3) = Format(ws.Cells(i, 4).Value, "#,##0.00")
Next i
End Sub
ListView
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ad Soyad | Departman | Şehir | Maaş |
| 2 | Ayşe Yılmaz | Muhasebe | Ankara | 28.500,00 |
| 3 | Mehmet Kaya | Satış | İstanbul | 31.200,00 |
| 4 | Zeynep Demir | İnsan Kaynakları | İzmir | 27.800,00 |
| 5 | Can Öztürk | Bilgi İşlem | Bursa | 35.400,00 |
| 6 | Elif Şahin | Satış | Antalya | 29.900,00 |
| 7 | Burak Çelik | Üretim | Konya | 26.300,00 |
PersonelExcelDepo v1.0.0
2. Sütun başlığına tıklayınca sıralama
Satış verilerini ListView'a yükleyen ve sütun başlığına tıklandığında artan ile azalan sıralama arasında geçiş yapan iki yordam yazıyoruz. ListView sıralamayı metin olarak yaptığından Tutar değeri, boşlukla eşit uzunluğa tamamlanarak yazılır; böylece sayısal sıra doğru çıkar. Kodu standart modüle yapıştırın ve UserForm modülündeki ColumnClick olayından SutunaGoreSirala yordamını çağırın.
VBA
46 satır
Option Explicit
' UserForm_Initialize içinde: SatislariYukle Me.ListView1
' UserForm modülünde sütun tıklaması:
' Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
' SutunaGoreSirala Me.ListView1, ColumnHeader.Index
' End Sub
Sub SatislariYukle(lv As Object)
Dim ws As Worksheet
Dim son As Long, i As Long, j As Long
Dim li As Object
Set ws = ThisWorkbook.Worksheets("Satışlar")
son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lv.ListItems.Clear
lv.ColumnHeaders.Clear
lv.View = 3
lv.FullRowSelect = True
For j = 1 To 4
lv.ColumnHeaders.Add , , ws.Cells(1, j).Value, 85
Next j
lv.ColumnHeaders(4).Alignment = 1
For i = 2 To son
Set li = lv.ListItems.Add(, , ws.Cells(i, 1).Value)
li.SubItems(1) = ws.Cells(i, 2).Value
li.SubItems(2) = ws.Cells(i, 3).Value
' Metin olarak sıralanacağı için sol tarafı boşlukla doldurur
li.SubItems(3) = Right(Space(12) & Format(ws.Cells(i, 4).Value, "#,##0.00"), 12)
Next i
End Sub
Sub SutunaGoreSirala(lv As Object, ByVal sutunNo As Long)
' SortKey sıfırdan başlar: 1. sütun için 0 verilir
If lv.Sorted And lv.SortKey = sutunNo - 1 Then
' Aynı sütuna yeniden tıklandı: yönü değiştir (0 artan, 1 azalan)
lv.SortOrder = 1 - lv.SortOrder
Else
lv.SortKey = sutunNo - 1
lv.SortOrder = 0
End If
lv.Sorted = True
End Sub
ListView
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Temsilci | Bölge | Ürün | Tutar |
| 2 | Selin Arslan | Marmara | Dizüstü Bilgisayar | 48.500,00 |
| 3 | Oğuz Tekin | Ege | Yazıcı | 6.200,00 |
| 4 | Merve Aydın | İç Anadolu | Monitör | 9.750,00 |
| 5 | Kemal Yıldız | Akdeniz | Tablet | 15.300,00 |
| 6 | Hülya Koç | Karadeniz | Klavye | 850,00 |
| 7 | Tolga Erdem | Marmara | Sunucu | 112.000,00 |
SatışlarExcelDepo v1.0.0
3. Onay kutulu liste, arama ve sayfaya geri yazma
Stok listesinde, onay kutusuyla işaretlenen ürünleri sayfadaki Sipariş sütununa işleyen bir çözüm kuruyoruz. Her ListItem'ın Tag özelliğine kaynak satır numarası saklanır; böylece listede sıralama değişse bile doğru satıra yazılır. Ayrıca FindItem ile ürün adına göre arama yapılır. Kodu standart modüle yapıştırın; yordamları UserForm'daki düğme ve açılış olaylarından denetimi göndererek çağırın.
VBA
55 satır
Option Explicit
Sub StokListesiniYukle(lv As Object)
Dim ws As Worksheet
Dim son As Long, i As Long, j As Long
Dim li As Object
Set ws = ThisWorkbook.Worksheets("Stok")
son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lv.ListItems.Clear
lv.ColumnHeaders.Clear
lv.View = 3
lv.FullRowSelect = True
lv.Checkboxes = True ' Her satıra onay kutusu ekler
For j = 1 To 4
lv.ColumnHeaders.Add , , ws.Cells(1, j).Value, 85
Next j
For i = 2 To son
Set li = lv.ListItems.Add(, , ws.Cells(i, 1).Value)
li.SubItems(1) = ws.Cells(i, 2).Value
li.SubItems(2) = ws.Cells(i, 3).Value
li.SubItems(3) = Format(ws.Cells(i, 4).Value, "#,##0.00")
li.Tag = CStr(i) ' Kaynak sayfa satırını saklar
Next i
End Sub
' İşaretli ürünleri sayfadaki Sipariş sütununa (E) yazar
Sub IsaretlileriSiparisYaz(lv As Object)
Dim ws As Worksheet
Dim li As Object
Set ws = ThisWorkbook.Worksheets("Stok")
For Each li In lv.ListItems
If li.Checked Then
ws.Cells(CLng(li.Tag), 5).Value = "Sipariş verilecek"
End If
Next li
End Sub
' Ürün adının bir bölümüne göre arar ve satırı seçer
Sub UrunuBul(lv As Object, ByVal aranan As String)
Dim li As Object
' 0: ilk sütun metninde ara, 1: kısmi eşleşme
Set li = lv.FindItem(aranan, 0, , 1)
If li Is Nothing Then
MsgBox aranan & " bulunamadı.", vbInformation
Else
li.Selected = True
li.EnsureVisible
End If
End Sub
ListView
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Kategori | Stok Adedi | Birim Fiyat | Sipariş |
| 2 | Klavye | Çevre Birimi | 12 | 450,00 | |
| 3 | Fare | Çevre Birimi | 3 | 220,00 | |
| 4 | Monitör | Görüntü | 8 | 3.750,00 | |
| 5 | Yazıcı Kartuşu | Sarf Malzeme | 2 | 680,00 | |
| 6 | USB Bellek | Depolama | 40 | 160,00 | |
| 7 | Ağ Kablosu | Ağ | 5 | 95,00 |
StokExcelDepo v1.0.0
Kullanırken dikkat edin
- Denetim her bilgisayarda bulunmaz: ListView, MSCOMCTL.OCX dosyasına dayanır. Bu dosya 64 bit Office sürümlerinde bulunmaz ya da kayıtlı olmaz; bu durumda denetim Ek Denetimler listesinde çıkmaz ya da dosya başka bilgisayarda açılınca hata verir. Çözümü dağıtacaksanız hedef bilgisayarlarda denetimin çalıştığını önceden sınayın.
- Başvuru ve geç bağlanma: MSComctlLib türlerini kullanıyorsanız Windows Common Controls 6.0 başvurusu eksik olduğunda derleme hatası alırsınız. Yordamlarda ListView parametresini Object olarak tanımlamak, sabit adları yerine sayısal değerleri kullanmanız gerektirir; örnekler bu nedenle 3, 1 ve 0 gibi değerler kullanır.
- View özelliğini ayarlamayı unutmayın: Varsayılan görünüm simge görünümüdür; ColumnHeaders eklemiş olsanız bile sütunlar görünmez. Tablo görünümü için View özelliğine Report değerini (3) verin. FullRowSelect ve Gridlines de yalnız bu görünümde işe yarar.
- SubItems sırası ve numaralaması: İlk sütun ListItems.Add ile yazılır; diğer sütunlar SubItems(1), SubItems(2) şeklinde 1'den başlar. Sütun sayısından fazla SubItems numarası kullanırsanız hata oluşur. Boş sütun bırakacaksanız SubItems değerine yine de boş metin atayın.
- Sıralama metin olarak yapılır: Sorted özelliği değerleri metin olarak karşılaştırır; 100 değeri 20 değerinden önce gelir. Sayısal sıralama için sayıları eşit uzunlukta, başı boşluk ya da sıfırla doldurarak yazın. Tarihlerde yyyy-aa-gg biçimini kullanmak doğru sırayı sağlar.
- Çok sayıda satırda performans: On binlerce satırı döngüyle eklemek yavaştır. Yüklemeden önce Sorted özelliğini False yapın, yüklemeyi bitirince sıralamayı açın. Çok büyük veri kümelerinde tamamını göstermek yerine filtreleyip özet göstermek daha kullanışlıdır.
- Basit ihtiyaçlarda ListBox yeterli olabilir: Yalnız seçim yapılacak, sütun başlığı ve sıralama gerekmeyen listelerde yerleşik ListBox denetimi ek bileşen gerektirmez ve her sürümde çalışır. ListView'ı başlık, onay kutusu ya da sıralama gerektiğinde tercih edin.
- İlgili konular:
- UserForm: denetimin yerleştirildiği form nesnesi
- ListBox: yerleşik çok sütunlu liste denetimi
- ComboBox: açılır liste denetimi
- TreeView: hiyerarşik veri için ağaç denetimi
- ImageList: ListView simgelerini tutan denetim
- ListItems ve ColumnHeaders: ListView koleksiyonları
- Controls: formdaki denetimlere döngüyle erişme
- DÜŞEYARA: seçilen kaydın diğer değerlerini sayfadan getirmek için