Özellik ikonu

Worksheet_Calculate

İndirme izni yok

Genel Bakış

Worksheet_Calculate (Worksheet.Calculate event), bir çalışma sayfası yeniden hesaplandıktan sonra Excel tarafından kendiliğinden çalıştırılan olay yordamıdır. Formül sonuçlarının değişmesine tepki vermek için kullanılır; örneğin toplam bir limiti aştığında uyarı yazdırabilir, durum hücrelerini güncelleyebilir ya da başka bir işlemi başlatabilirsiniz. Olay, hangi hücrenin değiştiğini bildirmez; yalnızca sayfanın hesaplandığını haber verir.

Olay yordamı nereye yazılır​

Bu olay yordamı standart modüle değil, ilgili çalışma sayfasının kod modülüne yazılır. Adımlar şöyledir:
  • 1. Adım: Alt+F11 tuşlarıyla Visual Basic Düzenleyicisi'ni (VBE) açın.
  • 2. Adım: Proje Gezgini'nde (Project Explorer) ilgili sayfaya (ör. Sayfa1) çift tıklayın.
  • 3. Adım: Kod penceresinin sol üstündeki listeden Worksheet, sağ üstteki listeden Calculate seçeneğini seçin. VBE boş yordam iskeletini kendisi oluşturur.
Tüm sayfalar için tek yerden çalışan karşılığı, ThisWorkbook modülündeki Workbook_SheetCalculate olayıdır. Sayfa modülündeki yordam yalnızca o sayfa hesaplandığında çalışır.

Söz dizimi​

Olayın yordam iskeleti şöyledir:
VBA 3 satır
Private Sub Worksheet_Calculate()
    ' Hesaplama sonrası yapılacak işlemler
End Sub
  • Parametre: Bu olayın bağımsız değişkeni yoktur. Worksheet_Change olayındaki Target gibi bir değişen hücre bilgisi gelmez.
  • Me: Sayfa modülünde Me, olayın bağlı olduğu çalışma sayfasını temsil eder; hücrelere Me.Range ile başvurmak kodu güvenli kılar.
  • Dönüş değeri: Yoktur; olay yordamı bir Sub olarak yazılır ve adı değiştirilmemelidir.

Olay ne zaman tetiklenir​

Olay, sayfadaki formüller hesaplandığında tetiklenir. Bu; otomatik hesaplamada bir formülün dayanağı olan hücreye değer girildiğinde, F9 tuşuna basıldığında ya da Formüller > Hesaplama > Şimdi Hesapla (Formulas > Calculation > Calculate Now) komutu kullanıldığında olabilir. Koddan Calculate yöntemi çağrıldığında da olay oluşur.
  • Change olayından farkı: Worksheet_Change hücreye sabit değer girildiğinde, Worksheet_Calculate ise formüller yeniden hesaplandığında çalışır. Girdiğiniz değer hiçbir formülü etkilemiyorsa Calculate tetiklenmeyebilir.
  • Uçucu işlevler: ŞİMDİ, RASTGELEARALIK, DOLAYLI ve KAYDIR gibi uçucu işlevler her hesaplamada yeniden çalıştığı için olayı çok sık tetikleyebilir.
  • Manuel hesaplama: Hesaplama modu elle ise olay, siz hesaplamayı başlatana kadar çalışmaz.
  • Application.EnableEvents: Bu özellik False iken olaylar çalışmaz.

Sonsuz döngüden kaçınma​

Olay yordamı içinde, sayfadaki bir formülü etkileyen bir hücreye yazarsanız yeni bir hesaplama oluşur ve olay yeniden tetiklenir. Bu durum yığın taşmasına ya da Excel'in donmasına yol açabilir. Önlem olarak yalnızca formül dayanağı olmayan hücrelere yazın ya da olayları geçici olarak kapatın:
VBA 5 satır
Private Sub Worksheet_Calculate()
    Application.EnableEvents = False
    ' Formülleri etkileyebilecek yazma işlemleri
    Application.EnableEvents = True
End Sub
Kod bir hatayla yarıda kalırsa EnableEvents kapalı kalabilir; bu yüzden hata yakalama ile açma satırının mutlaka çalışmasını sağlayın.

1. Toplam limitini aşınca uyarı yazdırma​

Sayfada her ürünün tutarı adet ile birim fiyatın çarpımıdır ve D7 hücresi toplamı verir. Aşağıdaki kodu Satış Kontrol sayfasının kod modülüne yapıştırın. Toplam 5000'i aştığında E7 hücresine uyarı yazılır.
VBA 11 satır
Option Explicit

' Bu kod Satış Kontrol sayfasının kod modülüne yazılır
Private Sub Worksheet_Calculate()
    ' Toplam hücresi hesaplandıktan sonra limit kontrolü yapılır
    If Me.Range("D7").Value > 5000 Then
        Me.Range("E7").Value = "Limit aşıldı"
    Else
        Me.Range("E7").Value = "Normal"
    End If
End Sub
Worksheet_Calculate
Formülünü incelemek için bir hücre seçin.
ABCDE
1ÜrünAdetBirim FiyatTutarDurum
2Kalem1008,50850,00
3Defter8045,003.600,00
4Dosya3022,00660,00
5Klasör1538,00570,00
6Zımba1060,00600,00
7Toplam6.280,00Limit aşıldı
Satış KontrolExcelDepo v1.0.0
Çalıştırılan makro Defter satırındaki adedi 80 yapar. Bu değişiklik Tutar formüllerini ve toplamı yeniden hesaplatır, hesaplama bitince de Worksheet_Calculate olayı çalışır. Toplam 6.280,00 olarak hesaplandığı için olay, E7 hücresine Limit aşıldı yazar. Yordamı elle çağırmanıza gerek yoktur; Excel olayı kendisi tetikler.

2. Önceki değerle karşılaştırıp yalnızca değişimde işlem yapma​

Stok sayfasında Durum sütunu, stok asgari düzeyin altına düştüğünde Sipariş ver sonucunu verir. Olay her hesaplamada çalıştığı için kodda Static bir değişken kullanılır; kritik ürün sayısı yalnızca değiştiğinde sonuç hücrelerine yazılır. Kodu Stok Takip sayfasının kod modülüne yapıştırın.
VBA 18 satır
Option Explicit

' Bu kod Stok Takip sayfasının kod modülüne yazılır
Private Sub Worksheet_Calculate()
    ' Static değişken, yordam bittikten sonra da değerini korur
    Static oncekiKritik As Long
    Dim kritik As Long

    ' Durum sütununda Sipariş ver yazan satırlar sayılır
    kritik = Application.WorksheetFunction.CountIf(Me.Range("D2:D8"), "Sipariş ver")

    ' Yalnızca sayı değiştiyse sonuç yazılır
    If kritik <> oncekiKritik Then
        Me.Range("E2").Value = kritik
        Me.Range("F2").Value = "Kritik ürün sayısı değişti"
        oncekiKritik = kritik
    End If
End Sub
Worksheet_Calculate
Formülünü incelemek için bir hücre seçin.
ABCDEF
1ÜrünStokAsgari StokDurumKritik SayısıNot
2Tablet1210Yeterli3Kritik ürün sayısı değişti
3Klavye48Sipariş ver
4Mouse515Sipariş ver
5Monitör65Yeterli
6Kulaklık910Sipariş ver
7Yazıcı32Yeterli
8Hoparlör1810Yeterli
Stok TakipExcelDepo v1.0.0
Makro Mouse ürününün stoğunu asgari düzeyin altına indirir. Durum formülü bu satır için yeni sonuç üretir ve sayfa hesaplanınca olay çalışır. Kritik ürün sayısı önceki değerden farklı olduğundan E2 hücresine 3, F2 hücresine Kritik ürün sayısı değişti yazılır. Static değişken sayesinde sayı değişmedikçe bu hücrelere yeniden yazılmaz.

3. Hedef gerçekleşmesine göre durum yazma ve renklendirme​

Aylık hedef ve gerçekleşen satış tablosunda D sütunu gerçekleşme oranını hesaplar. Olay, her ay için E sütununa durum metnini yazar ve hücreyi renklendirir; hatalı bir hesap varsa bunu da yakalar. Kodu Hedef Takip sayfasının kod modülüne yapıştırın.
VBA 20 satır
Option Explicit

' Bu kod Hedef Takip sayfasının kod modülüne yazılır
Private Sub Worksheet_Calculate()
    Dim hucre As Range

    ' Gerçekleşme oranı sütunundaki her hücre sırayla denetlenir
    For Each hucre In Me.Range("D2:D7")
        If IsError(hucre.Value) Then
            ' Formül hata veriyorsa karşılaştırma yapılmaz
            hucre.Offset(0, 1).Value = "Hata"
        ElseIf hucre.Value >= 1 Then
            hucre.Offset(0, 1).Value = "Hedef tamam"
            hucre.Offset(0, 1).Interior.Color = RGB(198, 239, 206)
        Else
            hucre.Offset(0, 1).Value = "Eksik"
            hucre.Offset(0, 1).Interior.Color = RGB(255, 199, 206)
        End If
    Next hucre
End Sub
Worksheet_Calculate
Formülünü incelemek için bir hücre seçin.
ABCDE
1AyHedefGerçekleşenGerçekleşmeDurum
2Ocak120.000,00125.000,00104%Hedef tamam
3Şubat110.000,00115.000,00105%Hedef tamam
4Mart125.000,00134.000,00107%Hedef tamam
5Nisan115.000,00110.000,0096%Eksik
6Mayıs120.000,0087.000,0073%Eksik
7Haziran130.000,00142.000,00109%Hedef tamam
Hedef TakipExcelDepo v1.0.0
Makro Şubat ayının gerçekleşen tutarını değiştirir. Gerçekleşme oranı yeniden hesaplanınca olay, D2:D7 aralığındaki her hücreyi döngüyle gözden geçirir. Şubat için oran 105% olduğundan E3 hücresine Hedef tamam yazılır; Mayıs için E6 hücresinde Eksik görünür. Döngü yalnızca altı hücre üzerinde döndüğü için sonludur ve olayı yavaşlatmaz.

Kullanırken dikkat edin​

  • Hangi hücrenin değiştiği bilinmez: Worksheet_Calculate olayı parametre almaz. Hangi hücrenin değiştiğini öğrenmeniz gerekiyorsa bu değişimi kendiniz izlemelisiniz; örneğin önceki değerleri Static değişkenlerde ya da gizli bir alanda saklayıp yeni değerlerle karşılaştırın.
  • Olayın çok sık çalışabileceğini unutmayın: Sayfada uçucu işlevler (ŞİMDİ, BUGÜN, RASTGELEARALIK, DOLAYLI, KAYDIR) varsa olay her hesaplamada tetiklenir. Ağır işlemleri olay içine yazmayın; önce bir koşul denetimi yapın ve yalnızca gerektiğinde işlem yürütün.
  • Hücreye yazarken sonsuz döngüye dikkat edin: Olay içinde formül dayanağı olan bir hücreye yazarsanız yeni bir hesaplama doğar ve olay tekrar çalışır. Yalnızca sabit sonuç hücrelerine yazın ya da Application.EnableEvents özelliğini geçici olarak False yapın; işiniz bitince mutlaka True değerine döndürün.
  • Hata değerlerini denetleyin: Başvurduğunuz hücre #BÖL/0! gibi bir hata değeri taşıyorsa karşılaştırma satırı çalışma zamanı hatası verir. Bu nedenle değeri okumadan önce IsError işleviyle denetleyin.
  • Kodun yeri ve makro güvenliği: Yordam standart modüle yazılırsa hiçbir zaman otomatik çalışmaz; ilgili sayfanın kod modülünde olmalıdır. Dosyayı Excel Makro Etkin Çalışma Kitabı (*.xlsm) olarak kaydedin ve makroların etkinleştirildiğinden emin olun; aksi halde olay tetiklenmez.
  • Excel Online ve diğer ortamlar: VBA olayları yalnızca masaüstü Excel'de çalışır. Excel Online gibi ortamlarda makrolar ve bu olay çalışmaz.
  • İlgili konular:
    • Worksheet_Change: Hücreye sabit değer girildiğinde çalışan olay.
    • Worksheet_SelectionChange: Seçim değiştiğinde çalışan olay.
    • Workbook_SheetCalculate: Çalışma kitabındaki tüm sayfalar için hesaplama olayı.
    • Application.EnableEvents: Olayların çalışmasını açıp kapatan özellik.
    • Application.Calculation: Hesaplama modunu (otomatik ya da elle) belirleyen özellik.
    • Calculate yöntemi: Koddan hesaplamayı başlatır ve olayı tetikler.
    • Static deyimi: Değişkenin değerini yordamlar arasında korur.
    • EĞER, EĞERSAY, TOPLA: Örneklerdeki durum ve sayım hesaplarında kullanılan işlevler.
    • ŞİMDİ ve RASTGELEARALIK: Olayı sık tetikleyen uçucu işlevler.
Ö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
12
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst