Özellik ikonu

ListObject

İndirme izni yok

Genel Bakış

ListObject (ListObject object), Excel'deki tabloyu (Ekle > Tablo) temsil eden VBA nesnesidir. Tablonun adına, veri aralığına, başlık ve toplam satırına, sütun ve satırlarına, stiline ve filtre ile sıralama ayarlarına kod üzerinden erişmenizi sağlar. Veri büyüdükçe kendiliğinden genişleyen tablolarla çalışan makrolar yazmak için en doğru yoldur.

Nesneye erişim ve oluşturma​

Bir çalışma sayfasındaki tüm tablolar Worksheet.ListObjects koleksiyonunda tutulur. Tabloya sıra numarasıyla ya da adıyla erişebilirsiniz. Adla erişmek daha güvenlidir, çünkü tabloların sırası değişebilir.

VBA 3 satır
Set lo = ws.ListObjects("tblSatis")
Set lo = ws.ListObjects(1)
Set lo = ws.ListObjects.Add(SourceType, Source, LinkSource, XlListObjectHasHeaders, Destination, TableStyleName)

ListObjects.Add parametreleri (hepsi isteğe bağlıdır):
  • SourceType: Veri kaynağının türü; çoğunlukla xlSrcRange (hücre aralığı) kullanılır. Varsayılan xlSrcRange değeridir.
  • Source: Tabloya dönüştürülecek Range nesnesi. Verilmezse seçili aralık kullanılır.
  • LinkSource: Dış veri kaynağı için kullanılır; aralıktan tablo oluştururken boş bırakılır.
  • XlListObjectHasHeaders: İlk satırın başlık olup olmadığını belirtir: xlYes, xlNo ya da xlGuess. Varsayılan xlGuess değeridir. xlNo verilirse Excel üstüne Sütun1, Sütun2 gibi başlıklar ekler.
  • Destination: Tablonun sol üst hücresi; yalnızca kaynak aralık dışında bir yere tablo oluşturulacaksa kullanılır.
  • TableStyleName: Uygulanacak tablo stilinin adı, örneğin TableStyleMedium2.
Tablo başlıkları metin olmalı ve birbirinden farklı olmalıdır. Başlıklar boşsa ya da yinelenirse Excel bunları otomatik olarak düzeltir.

Önemli özellikler​

  • Name: Tablonun adı. Çalışma kitabında benzersiz olmalı, boşluk içermemeli ve harf ya da alt çizgiyle başlamalıdır.
  • DisplayName: Tablonun formüllerde ve Ad Yöneticisi'nde (Name Manager) görünen adı.
  • Range: Başlık ve toplam satırı dahil tablonun tüm aralığı.
  • DataBodyRange: Yalnızca veri satırları. Tabloda hiç veri satırı yoksa Nothing döner; kullanmadan önce denetleyin.
  • HeaderRowRange: Başlık satırının aralığı.
  • TotalsRowRange: Toplam satırının aralığı; ShowTotals kapalıysa Nothing döner.
  • InsertRowRange: Tablonun sonundaki yeni satır ekleme alanı.
  • ListColumns: Tablonun sütunları (ListColumn koleksiyonu). Sütuna ada ya da sıra numarasıyla erişilir.
  • ListRows: Tablonun veri satırları (ListRow koleksiyonu).
  • ShowTotals: Toplam satırını gösterir ya da gizler (True / False).
  • ShowHeaders: Başlık satırını gösterir ya da gizler.
  • ShowAutoFilter: Başlıklardaki filtre düğmelerini gösterir ya da gizler.
  • TableStyle: Tablo stili; stil adı metin olarak atanır.
  • ShowTableStyleRowStripes: Şeritli satırları açar ya da kapatır.
  • Sort: Tablonun sıralama ayarlarını yöneten Sort nesnesi.
  • AutoFilter: Tablonun filtre ayarlarını tutan nesne.

Önemli yöntemler ve olaylar​

  • Resize: Tablonun aralığını yeniden boyutlandırır; yeni aralık başlık satırını aynı satırda tutmalıdır.
  • Unlist: Tabloyu normal hücre aralığına çevirir; veriler ve biçimler kalır, tablo özellikleri kalkar.
  • Delete: Tabloyu ve içindeki verileri siler.
  • ListRows.Add: Yeni satır ekler. Position parametresiyle konumu, AlwaysInsert ile alttaki hücrelerin kaydırılmasını belirlersiniz.
  • ListColumns.Add: Yeni sütun ekler.
  • Refresh: Dış veri kaynağına bağlı tabloyu yeniler.
  • ExportToVisio ve Publish: Tabloyu Visio'ya aktarır ya da SharePoint'e yayımlar.
ListObject nesnesinin kendine ait olayı yoktur. Tablodaki değişiklikleri yakalamak için sayfa modülündeki Worksheet_Change olayını kullanın ve değişen hücrenin tabloyla kesişip kesişmediğini Intersect ile denetleyin.

1. Aralıktan tablo oluşturma​

Sayfada A1:E6 aralığında satış verileri vardır; Tutar sütunu boştur. Aşağıdaki kodu standart bir modüle yapıştırın. Makro aralığı tabloya dönüştürür, adlandırır, stil verir ve Tutar sütununu yapılandırılmış başvuruyla doldurur.
VBA 21 satır
Option Explicit

Sub TabloOlustur()
    Dim ws As Worksheet
    Dim lo As ListObject

    Set ws = ActiveSheet

    ' Veri aralığını tabloya dönüştür (ilk satır başlık)
    Set lo = ws.ListObjects.Add(SourceType:=xlSrcRange, Source:=ws.Range("A1:E6"), XlListObjectHasHeaders:=xlYes)

    ' Tabloya ad ve stil ver
    lo.Name = "tblSatis"
    lo.TableStyle = "TableStyleMedium2"

    ' Tutar sütununu tüm veri satırları için doldur
    With lo.ListColumns("Tutar").DataBodyRange
        .Formula = "=[@Adet]*[@[Birim Fiyat]]"
        .NumberFormat = "#,##0.00"
    End With
End Sub
ListObject
Formülünü incelemek için bir hücre seçin.
ABCDE
1ÜrünŞehirAdetBirim FiyatTutar
2Klavyeİstanbul12450,00*[@[Birim Fiyat]]]5.400,00
3FareAnkara25180,00*[@[Birim Fiyat]]]4.500,00
4Monitörİzmir83.200,00*[@[Birim Fiyat]]]25.600,00
5KulaklıkBursa15650,00*[@[Birim Fiyat]]]9.750,00
6WebcamAdana10900,00*[@[Birim Fiyat]]]9.000,00
SatışlarExcelDepo v1.0.0
Makro çalıştıktan sonra A1:E6 aralığı tblSatis adlı bir tablo olur. Tutar sütunundaki her hücre aynı yapılandırılmış başvuruyu taşır; örneğin ilk satırın tutarı 5.400,00, ikinci satırınki 4.500,00 olarak hesaplanır. Tabloya yeni satır eklendiğinde bu formül kendiliğinden yeni satıra da yayılır.

2. Satırları dolaşma ve tabloyu sıralama​

Sayfada A1:E7 aralığında personel, maaş ve zam oranı bulunur; Yeni Maaş sütunu boştur. Kodu standart bir modüle yapıştırın. Makro tabloyu oluşturur, ListRows koleksiyonunda satır satır dolaşarak yeni maaşı yazar, ardından tabloyu Yeni Maaş sütununa göre büyükten küçüğe sıralar.
VBA 27 satır
Option Explicit

Sub ZamUygulaVeSirala()
    Dim ws As Worksheet
    Dim lo As ListObject
    Dim satir As ListRow

    Set ws = ActiveSheet

    ' Aralığı tabloya dönüştür
    Set lo = ws.ListObjects.Add(SourceType:=xlSrcRange, Source:=ws.Range("A1:E7"), XlListObjectHasHeaders:=xlYes)
    lo.Name = "tblPersonel"

    ' Her veri satırı için yeni maaşı hesapla (3. sütun maaş, 4. sütun zam, 5. sütun yeni maaş)
    For Each satir In lo.ListRows
        satir.Range.Cells(1, 5).Value = satir.Range.Cells(1, 3).Value * (1 + satir.Range.Cells(1, 4).Value)
    Next satir
    lo.ListColumns("Yeni Maaş").DataBodyRange.NumberFormat = "#,##0.00"

    ' Yeni Maaş sütununa göre büyükten küçüğe sırala
    With lo.Sort
        .SortFields.Clear
        .SortFields.Add Key:=lo.ListColumns("Yeni Maaş").DataBodyRange, SortOn:=xlSortOnValues, Order:=xlDescending
        .Header = xlYes
        .Apply
    End With
End Sub
ListObject
Formülünü incelemek için bir hücre seçin.
ABCDE
1Ad SoyadDepartmanMaaşZam OranıYeni Maaş
2Elif ArslanSatış35.000,007%37.450,00
3Ayşe YılmazMuhasebe32.000,0010%35.200,00
4Zeynep Demirİnsan Kaynakları30.000,0012%33.600,00
5Mehmet KayaSatış28.000,008%30.240,00
6Burak ŞahinMuhasebe27.500,009%29.975,00
7Ali ÇelikÜretim26.000,0015%29.900,00
Personel ZamExcelDepo v1.0.0
Makro önce her satırın Yeni Maaş değerini hesaplar, sonra tabloyu bu sütuna göre azalan sırada dizer. Bu nedenle en yüksek yeni maaş tablonun ilk veri satırına çıkar ve E2 hücresinde 37.450,00 görünür. Sıralama tablonun kendi Sort nesnesiyle yapıldığı için yalnızca tablo satırları yer değiştirir, tablonun dışındaki hücreler etkilenmez.

3. Tablo bilgilerini okuma ve koşula göre durum yazma​

Sayfada A1:D7 aralığında stok verileri vardır; Durum sütunu ve F sütunundaki özet alanı boştur. Kodu standart bir modüle yapıştırın. Makro tabloyu oluşturur, stok asgari düzeyin altındaysa Durum sütununa uyarı yazar ve tablonun adını, satır sayısını ve veri aralığının adresini F sütununa aktarır.
VBA 27 satır
Option Explicit

Sub TabloBilgisiYaz()
    Dim ws As Worksheet
    Dim lo As ListObject
    Dim satir As ListRow

    Set ws = ActiveSheet

    ' Tabloyu oluştur (E sütunu bilerek boş bırakıldı)
    Set lo = ws.ListObjects.Add(SourceType:=xlSrcRange, Source:=ws.Range("A1:D7"), XlListObjectHasHeaders:=xlYes)
    lo.Name = "tblStok"

    ' Stok asgari düzeyin altındaysa uyarı yaz
    For Each satir In lo.ListRows
        If satir.Range.Cells(1, 2).Value < satir.Range.Cells(1, 3).Value Then
            satir.Range.Cells(1, 4).Value = "Sipariş ver"
        Else
            satir.Range.Cells(1, 4).Value = "Yeterli"
        End If
    Next satir

    ' Tablo bilgilerini F sütununa yaz
    ws.Range("F2").Value = lo.ListRows.Count
    ws.Range("F3").Value = lo.DataBodyRange.Address(False, False)
    ws.Range("F4").Value = lo.Name
End Sub
ListObject
Formülünü incelemek için bir hücre seçin.
ABCDEF
1ÜrünStokAsgari StokDurumÖzet
2Kalem120100Yeterli6
3Defter4580Sipariş verA2:D7
4Silgi200150YeterlitblStok
5Zımba1220Sipariş ver
6Dosya6060Yeterli
7Kalemtraş3025Yeterli
Stok TakipExcelDepo v1.0.0
Makro, stoğu asgari düzeyin altında kalan ürünlerin Durum hücresine Sipariş ver, diğerlerine Yeterli yazar; örneğin ilk ürünün durumu Yeterli, ikinci ürünün durumu Sipariş ver olur. F2 hücresi veri satırı sayısını (6), F3 hücresi veri gövdesinin adresini (A2:D7), F4 hücresi de tablonun adını (tblStok) gösterir. DataBodyRange başlık satırını içermediği için adres 2. satırdan başlar.

Kullanırken dikkat edin​

  • Tablo adı kurallarına uyun: Tablo adında boşluk bulunamaz, ad harf ya da alt çizgiyle başlamalı ve çalışma kitabında benzersiz olmalıdır. Ayrıca ad bir hücre adresine (örneğin A1) benzememelidir. Kural dışı bir ad atarsanız çalışma zamanı hatası alırsınız.
  • DataBodyRange boş olabilir: Veri satırı olmayan bir tabloda DataBodyRange değeri Nothing döner ve üzerinde işlem yapmak hata verir. Önce If Not lo.DataBodyRange Is Nothing Then ile denetleyin. Aynı durum toplam satırı kapalıyken TotalsRowRange için de geçerlidir.
  • Aynı aralıkta ikinci tablo oluşturulamaz: Zaten tablo olan bir aralıkta ListObjects.Add çalıştırırsanız hata oluşur. Makroyu iki kez çalıştırmak istiyorsanız önce ws.ListObjects.Count ile tablo olup olmadığını denetleyin ya da mevcut tabloyu adıyla çağırın. Birleştirilmiş hücreler içeren aralıklar da tabloya dönüştürülemez.
  • Satır silerken sondan başa gidin: Koşula göre satır silerken For Each yerine sondan başa doğru For i = lo.ListRows.Count To 1 Step -1 döngüsü kullanın ve lo.ListRows(i).Delete çağırın. Böylece silinen satır sıra numaralarını kaydırmaz.
  • Korumalı sayfalarda kısıtlamalar: Sayfa korumalıyken tabloya satır ya da sütun eklenemez, tablo genişletilemez. Makroda gerekiyorsa korumayı kaldırıp işlem sonunda yeniden koruyun. Tabloların bir kısmı çalışma kitabı paylaşımı açıkken de oluşturulamaz.
  • Yapılandırılmış başvurular: Formula özelliğine tablo başvurusu yazarken İngilizce söz dizimini ve virgül ayırıcıyı kullanın, örneğin "=[@Adet]*[@[Birim Fiyat]]". Bölgesel ayarlara bağlı yerel söz dizimi için FormulaLocal gerekir; Formula dil bağımsız çalışır.
  • İlgili konular:
    • Worksheet.ListObjects koleksiyonu ve ListRow, ListColumn nesneleri
    • Range nesnesi ve Range.CurrentRegion özelliği
    • Sort nesnesi ve AutoFilter yöntemi
    • Worksheet_Change olayı
    • Ekle > Tablo (Insert > Table) ve Tablo Tasarımı sekmesi
    • Formüller > Tanımlı Adlar > Ad Yöneticisi (Formulas > Defined Names > Name Manager)
    • Yapılandırılmış başvurular ile TOPLA, ALTTOPLAM, DÜŞEYARA ve ÇOKETOPLA işlevleri
Ö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