Genel Bakış
RefreshAll (Workbook.RefreshAll), bir çalışma kitabındaki tüm dış veri aralıklarını, özet tabloları, Power Query sorgularını ve veri bağlantılarını tek seferde yenileyen bir Workbook yöntemidir. Veri sekmesindeki Tümünü Yenile düğmesinin VBA karşılığıdır. Kaynak veri değiştikten sonra raporların güncel sonucu göstermesini sağlamak için kullanılır.
Application.CalculateUntilAsyncQueriesDone yöntemi, bekleyen eşzamansız sorgular bitene kadar bekler. Aralık kaynaklı özet tablolar zaten eşzamanlı yenilenir; ancak aynı satırı her durumda kullanmak kodunuzu dış veri bağlantılarına karşı da güvenli kılar.
Tek bir bağlantıyı kesin olarak eşzamanlı yenilemek isterseniz o bağlantının BackgroundQuery özelliğini False yapabilirsiniz.
Makro B2 hücresine 200 yazar. C2 hücresi, kaynak değiştiği halde özet tablo henüz yenilenmediği için eski önbellekteki toplamı gösterir: . RefreshAll çalıştıktan sonra D2 hücresi özet tablonun güncel genel toplamını gösterir: . İki değer arasındaki fark, yenilemenin kaynak veriyi önbelleğe yeniden okuduğunu kanıtlar.
B sütunundaki her satış değeri 250 artırılır. RefreshAll özet tabloyu güncelledikten sonra makro, GetPivotData ile her şehrin toplamını okuyup C sütununa yazar. Örneğin İstanbul satırında C2 hücresi , Ankara satırında C3 hücresi değerini alır. C sütunundaki değerler B sütunundaki yeni değerlerle aynıdır; özet tablonun gerçekten yenilendiğini böyle doğrularsınız.
Makro B2 hücresine 500 yazar ve yalnız ptKalem3a tablosunun önbelleğini yeniler. C2 hücresi birinci tablonun güncel toplamını gösterir: . D2 hücresi, ikinci tablo kendi önbelleğini kullandığı için henüz eski toplamı taşır: . RefreshAll çalıştıktan sonra E2 hücresi ikinci tablonun da güncellendiğini gösterir: . Böylece RefreshAll'ın kitaptaki tüm önbellekleri yenilediğini, PivotCache.Refresh'in ise yalnız tek önbelleği yenilediğini görürsünüz.
Söz dizimi
Yöntem bir Workbook nesnesi üzerinde çağrılır ve parametre almaz:
VBA
3 satır
ThisWorkbook.RefreshAll
' ya da
ActiveWorkbook.RefreshAll
- expression: Bir Workbook nesnesini temsil eden ifade (ThisWorkbook, ActiveWorkbook ya da Workbooks("Kitap1.xlsx") gibi); zorunludur.
- Parametre: Yoktur. Yöntem bir değer döndürmez, bu nedenle bir değişkene atanmaz.
Nelerı yenilediği ve nelerı yenilemediği
RefreshAll, çalışma kitabındaki şu öğeleri yeniler:- Özet tablolar: Özet tablo önbelleklerini kaynak verisinden yeniden okur. Kaynak, aynı kitaptaki bir aralık ya da Excel tablosu olabilir.
- Dış veri aralıkları: QueryTable nesneleri, Web ve metin dosyası sorguları.
- Power Query sorguları ve bağlantılar: Kitaptaki WorkbookConnection nesneleri.
Eşzamanlı ve eşzamansız yenileme
Bir bağlantıda arka planda yenileme (BackgroundQuery) açıksa yenileme işlemi makro çalışmaya devam ederken arka planda sürer. Bu durumda RefreshAll satırından hemen sonra özet tablodan okuduğunuz değer eski olabilir. Sonucu okumadan önce şu satırı çağırın:
VBA
2 satır
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
Tek bir bağlantıyı kesin olarak eşzamanlı yenilemek isterseniz o bağlantının BackgroundQuery özelliğini False yapabilirsiniz.
Yalnız bir parçayı yenileme seçenekleri
Her şeyi yenilemek gerekmiyorsa daha dar kapsamlı yöntemler vardır:- PivotTable.RefreshTable: Yalnız belirtilen özet tabloyu yeniler.
- PivotCache.Refresh: Bir önbelleği yeniler; o önbelleği kullanan tüm özet tablolar güncellenir.
- QueryTable.Refresh: Tek bir dış veri aralığını yeniler.
- WorkbookConnection.Refresh: Tek bir bağlantıyı yeniler.
1. Eski ve yenilenmiş özet toplamı
Sayfada Ürün ve Adet sütunları ile ptAdet1 adlı bir özet tablo vardır (özet tablo H3 hücresinden başlar ve önbelleği yalnız bu tabloya aittir). Aşağıdaki kodu standart bir modüle yapıştırın. Makro B2 hücresindeki adedi 200 yapar, yenilemeden önce özet tablonun genel toplamını C2 hücresine, RefreshAll sonrasındaki genel toplamı D2 hücresine yazar.
VBA
22 satır
Option Explicit
Sub Yenile1()
Dim ws As Worksheet
Dim pt As PivotTable
Set ws = ThisWorkbook.Worksheets("Adet Özeti")
Set pt = ws.PivotTables("ptAdet1")
' Kaynak veriyi değiştir
ws.Range("B2").Value = 200
' Yenilemeden önce özet tablonun genel toplamı (eski önbellek)
ws.Range("C2").Value = pt.GetPivotData("Toplam Adet").Value
' Tüm özet tabloları ve bağlantıları yenile
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
' Yenilemeden sonra genel toplam
ws.Range("D2").Value = pt.GetPivotData("Toplam Adet").Value
End Sub
RefreshAll
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Adet | Yenileme Öncesi | Yenileme Sonrası |
| 2 | Kalem | 120 | ||
| 3 | Defter | 80 | ||
| 4 | Silgi | 60 | ||
| 5 | Dosya | 90 | ||
| 6 | Klasör | 40 | ||
| 7 | Zımba | 110 |
Adet ÖzetiExcelDepo v1.0.0
2. Yenilemeden sonra şehir bazında okuma
Sayfada Şehir ve Satış sütunları ile ptRapor2 adlı bir özet tablo bulunur (özet tablo H3 hücresinden başlar). Kodu standart bir modüle yapıştırın. Makro her şehrin satışını 250 artırır, RefreshAll ile özet tabloyu günceller ve her şehrin özet tablodaki güncel toplamını C sütununa yazar.
VBA
24 satır
Option Explicit
Sub Yenile2()
Dim ws As Worksheet
Dim pt As PivotTable
Dim r As Long
Set ws = ThisWorkbook.Worksheets("Satış Raporu")
Set pt = ws.PivotTables("ptRapor2")
' Kaynaktaki her satışı 250 artır
For r = 2 To 7
ws.Cells(r, 2).Value = ws.Cells(r, 2).Value + 250
Next r
' Özet tabloyu yenile ve bitmesini bekle
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
' Her şehrin güncel toplamını özet tablodan oku
For r = 2 To 7
ws.Cells(r, 3).Value = pt.GetPivotData("Toplam Satış", "Şehir", ws.Cells(r, 1).Value).Value
Next r
End Sub
RefreshAll
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Şehir | Satış | Yenilenen Satış |
| 2 | İstanbul | 1.250,00 | |
| 3 | Ankara | 980,00 | |
| 4 | İzmir | 870,00 | |
| 5 | Bursa | 640,00 | |
| 6 | Adana | 720,00 | |
| 7 | Konya | 510,00 |
Satış RaporuExcelDepo v1.0.0
3. RefreshAll ile tek önbellek yenilemesi
Sayfada aynı kaynaktan iki ayrı özet tablo vardır: ptKalem3a ve ptKalem3b. Her biri kendi önbelleğini kullanır (H3 ve L3 hücrelerinden başlarlar). Kodu standart bir modüle yapıştırın. Makro B2 değerini 500 yapar, yalnız ilk tablonun önbelleğini yeniler ve iki tabloyu karşılaştırır; ardından RefreshAll ile ikinci tabloyu da günceller.
VBA
27 satır
Option Explicit
Sub Yenile3()
Dim ws As Worksheet
Dim pta As PivotTable
Dim ptb As PivotTable
Set ws = ThisWorkbook.Worksheets("Stok Takibi")
Set pta = ws.PivotTables("ptKalem3a")
Set ptb = ws.PivotTables("ptKalem3b")
' Kaynak veriyi değiştir
ws.Range("B2").Value = 500
' Yalnız birinci tablonun önbelleğini yenile
pta.PivotCache.Refresh
Application.CalculateUntilAsyncQueriesDone
ws.Range("C2").Value = pta.GetPivotData("Toplam Stok").Value
ws.Range("D2").Value = ptb.GetPivotData("Toplam Stok").Value
' Şimdi tüm özet tabloları yenile
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
ws.Range("E2").Value = ptb.GetPivotData("Toplam Stok").Value
End Sub
RefreshAll
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Adet | Birinci Tablo | İkinci Tablo Önce | İkinci Tablo Sonra |
| 2 | Vida | 300 | |||
| 3 | Somun | 250 | |||
| 4 | Cıvata | 180 | |||
| 5 | Pul | 400 | |||
| 6 | Dübel | 150 | |||
| 7 | Matkap Ucu | 90 |
Stok TakibiExcelDepo v1.0.0
Kullanırken dikkat edin
- Kaynak aralığı sabittir: RefreshAll, özet tablonun kaynak aralığını genişletmez. Kaynağa sonradan satır ekliyorsanız verileri bir Excel tablosuna (Ekle > Tablo) dönüştürüp özet tabloyu o tablodan kurun; böylece yeni satırlar yenilemede otomatik olarak dahil olur.
- Eşzamansız sorgular: Arka planda yenilemesi açık bağlantılarda RefreshAll hemen döner ve veriler sonradan gelir. Sonucu okumadan ya da kaydetmeden önce Application.CalculateUntilAsyncQueriesDone çağırın; gerekirse ilgili bağlantının BackgroundQuery özelliğini False yapın.
- Korumalı sayfalar ve özet tablo alanları: Özet tablonun bulunduğu sayfa korumalıysa yenileme hata verebilir. Ayrıca kaynakta bir sütun başlığının adını değiştirirseniz yenilemeden sonra o alan özet tablodan kaybolur ve PivotFields("...") çağrıları hata verir; kodda alan adlarını kaynak başlıklarıyla birebir aynı tutun.
- Gereksiz yere her şeyi yenilemeyin: Büyük kitaplarda RefreshAll tüm bağlantıları ve önbellekleri yeniler, bu da uzun sürebilir. Yalnız tek bir özet tabloyu güncellemek istiyorsanız PivotTable.RefreshTable ya da PivotCache.Refresh kullanın. Yenileme sırasında Application.ScreenUpdating değerini geçici olarak False yapmak ekran titremesini azaltır.
- ThisWorkbook ile ActiveWorkbook farkı: ThisWorkbook makronun bulunduğu kitabı, ActiveWorkbook ise o anda etkin olan kitabı gösterir. Başka bir kitap etkin olduğunda ActiveWorkbook.RefreshAll beklenmeyen bir kitabı yenileyebilir; hedef kitabı açıkça belirtmek daha güvenlidir.
- İlgili konular:
- PivotTable.RefreshTable: Tek bir özet tabloyu yeniler.
- PivotCache.Refresh: Bir özet tablo önbelleğini yeniler.
- QueryTable.Refresh: Tek bir dış veri aralığını yeniler.
- WorkbookConnection.Refresh: Tek bir bağlantıyı yeniler.
- Application.CalculateUntilAsyncQueriesDone: Eşzamansız sorguların bitmesini bekler.
- Application.Calculate: Formülleri yeniden hesaplar.
- PivotTable.GetPivotData: Özet tablodan belirli bir değeri okur; çalışma sayfası karşılığı ÖZETVERİAL işlevidir.