Özellik ikonu

PivotCache

İndirme izni yok

Genel Bakış

PivotCache (PivotCache object), bir veya birden çok PivotTable'ın kullandığı kaynak veriyi bellekte ve dosya içinde saklayan önbellek nesnesidir. PivotTable kaynak aralığa her işlemde yeniden gitmez, bu önbellekten çalışır. VBA'da önbelleği oluşturmak, kaynağını değiştirmek, yenilemek ve dosya açılışında otomatik yenilemeyi ayarlamak için kullanılır.

PivotCache nedir, nasıl çalışır​

Bir PivotTable oluşturduğunuzda Excel kaynak veriyi önce bir önbelleğe kopyalar; tablo bu kopya üzerinden hesaplanır. Bu nedenle kaynak hücreleri değiştirseniz bile PivotTable, siz yenileyene kadar eski değerleri göstermeye devam eder. Yenileme işlemi aslında önbelleği kaynaktan yeniden okumaktır.

Aynı önbelleği kullanan birden çok PivotTable, dosya boyutunu ve belleği azaltır. Excel'de bir PivotTable'ı kopyalarsanız ya da aynı kaynaktan yeni tablo eklerken önerilen önbelleği paylaşırsanız bu paylaşım kendiliğinden olur. VBA'da paylaşım için aynı PivotCache nesnesinden birden çok kez CreatePivotTable yöntemini çağırırsınız.

Önbelleğe VBA'da iki yoldan ulaşılır: ThisWorkbook.PivotCaches koleksiyonu (tüm önbellekler) ya da belirli bir PivotTable'ın PivotCache yöntemi. Yeni önbellek her zaman PivotCaches.Create ile üretilir.

Elle yenilemek için PivotTable Çözümle > Veri > Yenile (PivotTable Analyze > Data > Refresh) komutunu kullanırsınız. Dosya açılırken yenileme seçeneği ise PivotTable Seçenekleri iletişim kutusunun Veri (Data) sekmesindeki Dosya açılırken verileri yenile (Refresh data when opening the file) kutusudur; VBA karşılığı RefreshOnFileOpen özelliğidir.

Söz dizimi​

Önbellek oluşturma ve ondan PivotTable üretme şu kalıpla yapılır:
VBA 2 satır
Set pc = ThisWorkbook.PivotCaches.Create(SourceType, SourceData, Version)
Set pt = pc.CreatePivotTable(TableDestination, TableName, ReadData, DefaultVersion)
PivotCaches.Create parametreleri:
  • SourceType: verinin türü; xlDatabase (Excel aralığı ya da tablo), xlExternal (dış veri kaynağı) ve xlConsolidation (birden çok aralık) değerlerinden biri. Zorunludur.
  • SourceData: kaynak; bir Range nesnesi, bir tablo adı ya da R1C1 biçiminde aralık metni. xlExternal için bu parametre kullanılmaz, bağlantı sonradan kurulur. İsteğe bağlıdır.
  • Version: PivotTable sürüm sabiti (xlPivotTableVersion12, xlPivotTableVersion14, xlPivotTableVersion15 gibi). İsteğe bağlıdır; verilmezse Excel'in geçerli sürümü kullanılır.
CreatePivotTable parametreleri:
  • TableDestination: PivotTable'ın sol üst hücresi (Range). Zorunludur. Hedef aralıkta başka bir PivotTable bulunmamalıdır.
  • TableName: PivotTable'ın adı. İsteğe bağlıdır; verilmezse Excel kendisi ad verir (PivotTable1 gibi).
  • ReadData: True ise dış kaynaktaki veri önbelleğe hemen okunur. İsteğe bağlıdır; varsayılan True.
  • DefaultVersion: PivotTable'ın varsayılan sürümü. İsteğe bağlıdır.
PivotTable oluşturulduktan sonra alanlar PivotFields ile satır, sütun ve veri alanı olarak yerleştirilir; önbellek ise bu tablonun arkasında çalışmaya devam eder.

Önemli özellikler​

  • RecordCount: önbellekteki kayıt (veri satırı) sayısı. Salt okunurdur.
  • SourceData: kaynağı okur ya da değiştirir. Değiştirdikten sonra Refresh çağırmak gerekir.
  • RefreshOnFileOpen: True ise dosya her açıldığında önbellek yenilenir.
  • MissingItemsLimit: her alan için saklanacak, kaynakta artık bulunmayan öğe sayısı. xlMissingItemsDefault (-1) otomatik, xlMissingItemsNone (0) hiç saklama, xlMissingItemsMax en büyük sınır anlamına gelir. Eski öğelerin filtrede görünmesini önlemek için 0 yapılır.
  • RefreshDate: son yenileme tarihi; RefreshName: yenilemeyi yapan kullanıcı adı.
  • BackgroundQuery: dış veri yenilenirken arka planda çalışılıp çalışılmayacağı. EnableRefresh: yenilemeye izin verilip verilmediği.
  • IsConnected: önbelleğin dış veri kaynağına bağlı olup olmadığı. MemoryUsed: önbelleğin kullandığı bellek miktarı (bayt).
  • Index: önbelleğin koleksiyondaki sıra numarası; PivotTable'ın CacheIndex özelliği ile eşleşir.

Önemli yöntemler​

  • CreatePivotTable: önbellekten yeni bir PivotTable üretir.
  • Refresh: önbelleği kaynaktan yeniden okur; önbelleği kullanan tüm PivotTable'lar güncellenir.
  • MakeConnection: önbelleği, önceden tanımlı bir bağlantıya yeniden bağlar.
  • ResetTimer: otomatik yenileme zamanlayıcısını sıfırlar.
Bir PivotTable'ı yenilemek için PivotTable.RefreshTable yerine PivotCache.Refresh kullanırsanız aynı önbelleği paylaşan bütün tablolar tek seferde güncellenir.

1. Önbellek oluşturma ve kayıt sayısını okuma​

Sayfada A1:C9 aralığında satış verisi vardır. Makro, bu aralıktan bir PivotCache oluşturur, geçici bir sayfada PivotTable üretir ve önbellekteki kayıt sayısı ile eksik öğe sınırını E sütununa yazar. Sonra geçici sayfayı siler. Kodu standart modüle yapıştırın.
VBA 29 satır
Option Explicit

Sub OnbellekOlustur()
    Dim ws As Worksheet, wsGecici As Worksheet
    Dim pc As PivotCache, pt As PivotTable

    Set ws = ThisWorkbook.Worksheets("Satış Verisi")

    ' Önbelleği kaynak aralıktan oluştur
    Set pc = ThisWorkbook.PivotCaches.Create( _
        SourceType:=xlDatabase, SourceData:=ws.Range("A1:C9"))

    ' Geçici sayfada PivotTable üret (önbellek bu sırada dolar)
    Set wsGecici = ThisWorkbook.Worksheets.Add(After:=ws)
    Set pt = pc.CreatePivotTable(TableDestination:=wsGecici.Range("A3"), _
        TableName:="GeciciPivot")

    ' Eski öğeler saklanmasın
    pc.MissingItemsLimit = xlMissingItemsNone

    ' Sonuçları yaz
    ws.Range("E2").Value = pc.RecordCount
    ws.Range("E3").Value = pc.MissingItemsLimit

    ' Geçici sayfayı sil
    Application.DisplayAlerts = False
    wsGecici.Delete
    Application.DisplayAlerts = True
End Sub
PivotCache
Formülünü incelemek için bir hücre seçin.
ABCDE
1ŞehirÜrünTutarAçıklamaSonuç
2AnkaraKalem1.250,00Kayıt sayısı8
3İzmirDefter980,00Eksik öğe sınırı0
4BursaKalem760,00
5AnkaraDefter1.430,00
6İzmirKalem640,00
7BursaDefter1.120,00
8AdanaKalem890,00
9AdanaDefter1.010,00
Satış VerisiExcelDepo v1.0.0
Makro, E2 hücresine önbellekteki kayıt sayısını (8) yazdı; bu sayı başlık satırı hariç veri satırlarına karşılık gelir. E3 hücresindeki 0 değeri, MissingItemsLimit özelliğinin xlMissingItemsNone sabitiyle ayarlandığını gösterir. Geçici sayfa silindiği için çalışma kitabınızda ek sayfa kalmaz.

2. İki PivotTable için ortak önbellek​

Sayfada A1:C9 aralığında aylık adet verisi vardır. Makro tek bir PivotCache oluşturur ve aynı önbellekten iki PivotTable üretir: biri ürüne, diğeri aya göre toplar. Ardından iki tablonun önbelleği paylaşıp paylaşmadığını, dosya açılışında yenilemeyi ve iki tablonun genel toplamını E sütununa yazar. Kodu standart modüle yapıştırın.
VBA 40 satır
Option Explicit

Sub PaylasilanOnbellek()
    Dim ws As Worksheet, wsG As Worksheet
    Dim pc As PivotCache
    Dim pt1 As PivotTable, pt2 As PivotTable

    Set ws = ThisWorkbook.Worksheets("Aylık Satış")

    ' Tek önbellek oluştur
    Set pc = ThisWorkbook.PivotCaches.Create( _
        SourceType:=xlDatabase, SourceData:=ws.Range("A1:C9"))

    ' Aynı önbellekten iki PivotTable üret
    Set wsG = ThisWorkbook.Worksheets.Add(After:=ws)
    Set pt1 = pc.CreatePivotTable(wsG.Range("A3"), "OzetUrun")
    Set pt2 = pc.CreatePivotTable(wsG.Range("F3"), "OzetAy")

    ' Ürüne göre toplam adet
    pt1.PivotFields("Ürün").Orientation = xlRowField
    pt1.AddDataField pt1.PivotFields("Adet"), "Toplam Adet", xlSum

    ' Aya göre toplam adet
    pt2.PivotFields("Ay").Orientation = xlRowField
    pt2.AddDataField pt2.PivotFields("Adet"), "Toplam Adet", xlSum

    ' Dosya her açıldığında önbellek yenilensin
    pc.RefreshOnFileOpen = True

    ' Sonuçları yaz
    ws.Range("E2").Value = (pt1.CacheIndex = pt2.CacheIndex)
    ws.Range("E3").Value = pc.RefreshOnFileOpen
    ws.Range("E4").Value = pt1.GetPivotData("Toplam Adet").Value
    ws.Range("E5").Value = pt2.GetPivotData("Toplam Adet").Value

    ' Geçici sayfayı sil
    Application.DisplayAlerts = False
    wsG.Delete
    Application.DisplayAlerts = True
End Sub
PivotCache
Formülünü incelemek için bir hücre seçin.
ABCDE
1AyÜrünAdetAçıklamaSonuç
2OcakKalem120Aynı önbellek mi?DOĞRU
3OcakDefter80Dosya açılışında yenilemeDOĞRU
4ŞubatKalem95Ürün özeti toplamı800
5ŞubatDefter110Ay özeti toplamı800
6MartKalem130
7MartDefter70
8NisanKalem105
9NisanDefter90
Aylık SatışExcelDepo v1.0.0
E2 hücresindeki DOĞRU sonucu, iki PivotTable'ın aynı önbelleği (aynı CacheIndex değerini) kullandığını gösterir. E3 hücresi RefreshOnFileOpen ayarının durumunu (DOĞRU) verir. İki özet tablonun genel toplamı (800 ve 800) aynıdır, çünkü ikisi de aynı kaynak veriden beslenir.

3. Tablo kaynaklı önbelleği yenileme​

Sayfada A1:C9 aralığında satış verisi ve E:F sütunlarında sonuç alanları vardır. Makro önce aralığı tabloya dönüştürür (tblSatis), tablo adıyla bir PivotCache ve geçici PivotTable üretir, toplamı okur. Sonra tabloya yeni bir satır ekler, önbelleği Refresh ile yeniler ve toplamı yeniden okur. Kodu standart modüle yapıştırın ve makroyu yalnızca bir kez çalıştırın.
VBA 42 satır
Option Explicit

Sub TabloKaynakliOnbellek()
    Dim ws As Worksheet, wsGecici As Worksheet
    Dim lo As ListObject, lr As ListRow
    Dim pc As PivotCache, pt As PivotTable

    Set ws = ThisWorkbook.Worksheets("Tablo Kaynak")

    ' Veri aralığını tabloya dönüştür
    Set lo = ws.ListObjects.Add(xlSrcRange, ws.Range("A1:C9"), , xlYes)
    lo.Name = "tblSatis"

    ' Kaynak olarak tablo adını kullan
    Set pc = ThisWorkbook.PivotCaches.Create( _
        SourceType:=xlDatabase, SourceData:="tblSatis")

    Set wsGecici = ThisWorkbook.Worksheets.Add(After:=ws)
    Set pt = pc.CreatePivotTable(wsGecici.Range("A3"), "GeciciPivot")
    pt.PivotFields("Şehir").Orientation = xlRowField
    pt.AddDataField pt.PivotFields("Tutar"), "Toplam Tutar", xlSum

    ' Yenilemeden önceki toplam
    ws.Range("F2").Value = pt.GetPivotData("Toplam Tutar").Value

    ' Tabloya yeni satır ekle
    Set lr = lo.ListRows.Add
    lr.Range.Cells(1, 1).Value = "Antalya"
    lr.Range.Cells(1, 2).Value = "Defter"
    lr.Range.Cells(1, 3).Value = 1500

    ' Önbelleği yenile
    pc.Refresh

    ' Yenilemeden sonraki toplam ve kayıt sayısı
    ws.Range("F3").Value = pt.GetPivotData("Toplam Tutar").Value
    ws.Range("F4").Value = pc.RecordCount

    Application.DisplayAlerts = False
    wsGecici.Delete
    Application.DisplayAlerts = True
End Sub
PivotCache
Formülünü incelemek için bir hücre seçin.
ABCDEF
1ŞehirÜrünTutarAçıklamaSonuç
2AnkaraKalem1.250,00Yenilemeden önce toplam8080
3İzmirDefter980,00Yenilemeden sonra toplam9580
4BursaKalem760,00Önbellek kayıt sayısı9
5AnkaraDefter1.430,00
6İzmirKalem640,00
7BursaDefter1.120,00
8AdanaKalem890,00
9AdanaDefter1.010,00
10AntalyaDefter1.500,00
Tablo KaynakExcelDepo v1.0.0
Makro tabloya 10. satırda yeni bir kayıt ekledi: Antalya, Defter, 1.500,00. Yenilemeden önceki toplam F2 hücresinde (8080), PivotCache.Refresh çağrısından sonraki toplam ise F3 hücresinde (9580) görünür; aradaki fark yeni satırın tutarıdır. F4 hücresindeki kayıt sayısı (9) önbelleğin yeni satırı da okuduğunu doğrular.

Kullanırken dikkat edin​

  • Yenilemeden değişiklik görünmez: Kaynak hücreleri değiştirdiğinizde PivotTable otomatik güncellenmez. Değişikliklerin yansıması için Refresh yöntemini çağırın ya da RefreshOnFileOpen özelliğini True yapın.
  • Sabit aralık yeni satırları kapsamaz: SourceData olarak A1:C9 gibi sabit bir aralık verirseniz sonradan eklenen satırlar önbelleğe girmez. Büyüyen veriler için kaynağı tablo (ListObject) ya da tablo adı olarak verin; ya da SourceData özelliğini yeni aralıkla güncelleyip Refresh çağırın.
  • PivotTable hedefi boş olmalıdır: CreatePivotTable ile verdiğiniz hedef hücrede ya da PivotTable'ın yayılacağı alanda başka bir PivotTable bulunmamalıdır; aksi durumda çalışma zamanı hatası alırsınız. Çıktının alt tarafındaki hücrelerde veri varsa da Excel üzerine yazma uyarısı verebilir.
  • Önbellek paylaşımı dosya boyutunu küçültür: Aynı kaynaktan birden çok PivotTable gerekiyorsa her seferinde yeni PivotCaches.Create çağırmak yerine aynı PivotCache nesnesinden CreatePivotTable yöntemini kullanın. Her yeni önbellek, kaynak verinin dosya içinde ayrı bir kopyası demektir.
  • Eski öğeler filtrede kalabilir: Kaynaktan silinen değerler, MissingItemsLimit varsayılan ayarındayken filtre listesinde görünmeye devam edebilir. MissingItemsLimit özelliğini xlMissingItemsNone yapıp önbelleği yenilediğinizde bu öğeler temizlenir.
  • Dış veri kaynaklarında yenileme: Dış bağlantılı önbelleklerde BackgroundQuery True ise Refresh arka planda çalışır ve sonraki kod satırı yenileme bitmeden işlenebilir. Sonucu hemen okumak istiyorsanız BackgroundQuery değerini False yapın.
  • Aynı makroyu tekrar çalıştırma: Örneklerdeki gibi tablo adı atayan makrolarda aynı ad ikinci çalıştırmada hata verir. Tekrar denemeden önce tabloyu ve gerekirse geçici sayfayı silin ya da koda önce var olup olmadığını denetleyen bir adım ekleyin.
  • İlgili konular:
    • PivotTable: önbellekten oluşturulan özet tablo nesnesi.
    • PivotTable.CacheIndex: tablonun kullandığı önbelleğin sıra numarası.
    • PivotTable.RefreshTable: yalnızca tek bir tabloyu yenileme yöntemi.
    • PivotField ve PivotFields: alanları satır, sütun ve veri alanı olarak yerleştirme.
    • ListObject: kaynak olarak kullanılabilen Excel tablosu.
    • Application.DisplayAlerts: sayfa silme gibi işlemlerde uyarıları kapatma.
    • PivotTable Çözümle > Veri > Yenile (PivotTable Analyze > Data > Refresh): elle yenileme komutu.
    • ÖZETVERİAL: PivotTable içinden değer okuyan işlev (GETPIVOTDATA).
Ö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
13
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst