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.
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.
Ç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.
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.
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.
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.
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
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.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Adet | Birim Fiyat | Tutar | Durum |
| 2 | Kalem | 100 | 8,50 | 850,00 | |
| 3 | Defter | 80 | 45,00 | 3.600,00 | |
| 4 | Dosya | 30 | 22,00 | 660,00 | |
| 5 | Klasör | 15 | 38,00 | 570,00 | |
| 6 | Zımba | 10 | 60,00 | 600,00 | |
| 7 | Toplam | 6.280,00 | Limit aşıldı |
Satış KontrolExcelDepo v1.0.0
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.| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Ürün | Stok | Asgari Stok | Durum | Kritik Sayısı | Not |
| 2 | Tablet | 12 | 10 | Yeterli | 3 | Kritik ürün sayısı değişti |
| 3 | Klavye | 4 | 8 | Sipariş ver | ||
| 4 | Mouse | 5 | 15 | Sipariş ver | ||
| 5 | Monitör | 6 | 5 | Yeterli | ||
| 6 | Kulaklık | 9 | 10 | Sipariş ver | ||
| 7 | Yazıcı | 3 | 2 | Yeterli | ||
| 8 | Hoparlör | 18 | 10 | Yeterli |
Stok TakipExcelDepo v1.0.0
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.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ay | Hedef | Gerçekleşen | Gerçekleşme | Durum |
| 2 | Ocak | 120.000,00 | 125.000,00 | 104% | Hedef tamam |
| 3 | Şubat | 110.000,00 | 115.000,00 | 105% | Hedef tamam |
| 4 | Mart | 125.000,00 | 134.000,00 | 107% | Hedef tamam |
| 5 | Nisan | 115.000,00 | 110.000,00 | 96% | Eksik |
| 6 | Mayıs | 120.000,00 | 87.000,00 | 73% | Eksik |
| 7 | Haziran | 130.000,00 | 142.000,00 | 109% | Hedef tamam |
Hedef TakipExcelDepo v1.0.0
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.