Özellik ikonu

ListView

İndirme izni yok

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.

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.
Satırın ilk sütunu ListItems.Add ile yazılır; diğer sütunlar ListItem nesnesinin SubItems özelliğiyle doldurulur ve SubItems numaralaması 1'den başlar.

Ö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.
Olay yordamları, ListView denetiminin bulunduğu UserForm'un kod modülüne yazılır. Örneğin sütun tıklaması için gereken başlık şöyledir:
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.
ABCD
1Ad SoyadDepartmanŞehirMaaş
2Ayşe YılmazMuhasebeAnkara28.500,00
3Mehmet KayaSatışİstanbul31.200,00
4Zeynep Demirİnsan Kaynaklarıİzmir27.800,00
5Can ÖztürkBilgi İşlemBursa35.400,00
6Elif ŞahinSatışAntalya29.900,00
7Burak ÇelikÜretimKonya26.300,00
PersonelExcelDepo v1.0.0
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.

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.
ABCD
1TemsilciBölgeÜrünTutar
2Selin ArslanMarmaraDizüstü Bilgisayar48.500,00
3Oğuz TekinEgeYazıcı6.200,00
4Merve Aydınİç AnadoluMonitör9.750,00
5Kemal YıldızAkdenizTablet15.300,00
6Hülya KoçKaradenizKlavye850,00
7Tolga ErdemMarmaraSunucu112.000,00
SatışlarExcelDepo v1.0.0
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.

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.
ABCDE
1ÜrünKategoriStok AdediBirim FiyatSipariş
2KlavyeÇevre Birimi12450,00
3FareÇevre Birimi3220,00
4MonitörGörüntü83.750,00
5Yazıcı KartuşuSarf Malzeme2680,00
6USB BellekDepolama40160,00
7Ağ KablosuAğ595,00
StokExcelDepo v1.0.0
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.

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
Ö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
11
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst