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.
ListObjects.Add parametreleri (hepsi isteğe bağlıdır):
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.
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.
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.
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.
Ö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.
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.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Şehir | Adet | Birim Fiyat | Tutar |
| 2 | Klavye | İstanbul | 12 | 450,00 | *[@[Birim Fiyat]]]5.400,00 |
| 3 | Fare | Ankara | 25 | 180,00 | *[@[Birim Fiyat]]]4.500,00 |
| 4 | Monitör | İzmir | 8 | 3.200,00 | *[@[Birim Fiyat]]]25.600,00 |
| 5 | Kulaklık | Bursa | 15 | 650,00 | *[@[Birim Fiyat]]]9.750,00 |
| 6 | Webcam | Adana | 10 | 900,00 | *[@[Birim Fiyat]]]9.000,00 |
SatışlarExcelDepo v1.0.0
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.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ad Soyad | Departman | Maaş | Zam Oranı | Yeni Maaş |
| 2 | Elif Arslan | Satış | 35.000,00 | 7% | 37.450,00 |
| 3 | Ayşe Yılmaz | Muhasebe | 32.000,00 | 10% | 35.200,00 |
| 4 | Zeynep Demir | İnsan Kaynakları | 30.000,00 | 12% | 33.600,00 |
| 5 | Mehmet Kaya | Satış | 28.000,00 | 8% | 30.240,00 |
| 6 | Burak Şahin | Muhasebe | 27.500,00 | 9% | 29.975,00 |
| 7 | Ali Çelik | Üretim | 26.000,00 | 15% | 29.900,00 |
Personel ZamExcelDepo v1.0.0
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.| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Ürün | Stok | Asgari Stok | Durum | Özet | |
| 2 | Kalem | 120 | 100 | Yeterli | 6 | |
| 3 | Defter | 45 | 80 | Sipariş ver | A2:D7 | |
| 4 | Silgi | 200 | 150 | Yeterli | tblStok | |
| 5 | Zımba | 12 | 20 | Sipariş ver | ||
| 6 | Dosya | 60 | 60 | Yeterli | ||
| 7 | Kalemtraş | 30 | 25 | Yeterli |
Stok TakipExcelDepo v1.0.0
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