Genel Bakış
Workbook_BeforeClose (Workbook.BeforeClose), bir çalışma kitabı kapatılmadan hemen önce Excel tarafından tetiklenen olaydır. Kapanışta kayıt tutmak, geçici verileri temizlemek, eksik girişleri denetlemek ya da Cancel parametresiyle kapatma işlemini tümüyle durdurmak için kullanılır.
Olay yordamı çalıştığında E2 hücresi şu metni alır: Toplam tutar: 44.850,00. Gerçek kullanımda aynı kod, kitap kapatılırken kendiliğinden çalışır; yardımcı yordam yalnızca kapatmadan deneme içindir.
Olay yordamı çalıştırılmadan önce D2 hücresi boştur: . Durum sütununda boş hücreler olduğu için olay çalıştığında Cancel değeri True yapılır ve D2 hücresine kodda tanımlı uyarı metni yazılır. Kullanıcı kitabı kapatmaya çalıştığında Excel kapatmayı durdurur; boş durumlar doldurulduktan sonra kapatma normal şekilde gerçekleşir.
Olay çalıştırılmadan önce C2 hücresi boştur: . Olay çalıştıktan sonra satırlar Satış sütununa göre büyükten küçüğe dizilir; en yüksek satışlı şehir ilk veri satırında yer alır ve C2 hücresine kodda belirtilen kapanış notu yazılır. Başlık satırı yerinde kalır, çünkü .Header = xlYes ayarı ilk satırı veri olarak saymaz.
Olay yordamı nereye yazılır
Bu olay yordamı yalnızca ThisWorkbook modülünde çalışır; standart modüle ya da sayfa modülüne yazılırsa hiçbir zaman tetiklenmez. Kurmak için şu adımları izleyin:- Alt+F11 tuşlarıyla Visual Basic Düzenleyicisi'ni (VBA Editor) açın.
- Proje Gezgini'nde (Project Explorer) ilgili kitabın altındaki ThisWorkbook öğesine çift tıklayın.
- Kod penceresinin sol üstündeki listeden Workbook, sağ üstündeki listeden BeforeClose seçin; Excel yordamın iskeletini kendisi yazar.
- Dosyayı makro içerebilen biçimde, yani .xlsm olarak kaydedin.
Söz dizimi
Olayın tanımı şöyledir:
VBA
3 satır
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' Kapanıştan önce yapılacak işlemler
End Sub
- Cancel: Boolean türünde, referansla geçen bir parametredir. Olay başladığında False değerindedir. Yordam içinde True yaparsanız kitap kapanmaz ve kullanıcı çalışmaya devam eder. Değeri değiştirmezseniz kapatma sürer.
Ne zaman ve hangi sırayla çalışır
Olay, kitap kullanıcı tarafından kapatıldığında, VBA'dan Close yöntemiyle kapatıldığında ya da Excel kapatılırken o kitap için tetiklenir. Kaydedilmemiş değişiklik varsa Excel'in "Kaydetmek istiyor musunuz?" sorusu olay yordamı bittikten sonra sorulur. Bu nedenle yordam içinde kitabı kaydedebilir ya da Saved özelliğini True yaparak soruyu bastırabilirsiniz.- Kullanıcı soruda İptal derse: Kapatma durur, ama olay yordamı o ana kadar zaten çalışmış olur. Yordamdaki işlemler bu yüzden tekrarlanabilir olmalıdır.
- EnableEvents False ise: Application.EnableEvents özelliği False iken olay tetiklenmez.
- Makrolar kapalıysa: Kullanıcı makroları etkinleştirmediyse yordam hiç çalışmaz; kapanış kontrolüne tek başına güvenmeyin.
1. Kapanışta özet bilgiyi sayfaya yazma
Kitap kapanırken toplam tutarı sayfadaki not hücresine yazan bir olay kuruyoruz. Kodu ThisWorkbook modülüne yapıştırın. Kapatmadan denemek için olayı doğrudan çağıran küçük bir yardımcı KapanisDene yordamı da aynı modüle eklenmiştir.
VBA
15 satır
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' Kapanıştan önce toplam tutarı not hücresine yazar
With Me.Worksheets("Kapanış Kaydı")
.Range("E2").Value = "Toplam tutar: " & _
Format(Application.WorksheetFunction.Sum(.Range("D2:D5")), "#,##0.00")
End With
End Sub
' Kitabı kapatmadan olayı denemek için yardımcı yordam
Public Sub KapanisDene()
Dim iptal As Boolean
Workbook_BeforeClose iptal
End Sub
Workbook_BeforeClose
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Adet | Birim Fiyat | Tutar | Kapanış Notu |
| 2 | Klavye | 12 | 450,00 | 5.400,00 | Toplam tutar: 44.850,00 |
| 3 | Fare | 25 | 180,00 | 4.500,00 | |
| 4 | Monitör | 6 | 4.200,00 | 25.200,00 | |
| 5 | Kulaklık | 15 | 650,00 | 9.750,00 |
Kapanış KaydıExcelDepo v1.0.0
2. Eksik girişte kapatmayı iptal etme
Görev listesinde Durum sütunu boş bırakılmış satır varsa kitabın kapanmasını engelleyen bir olay kuruyoruz. Kod ThisWorkbook modülüne yazılır. Sonuç, deneme sırasında görünsün diye bir hücreye yazılır; gerçek kullanımda aynı yere MsgBox ile uyarı da verebilirsiniz.
VBA
23 satır
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ws As Worksheet
Dim bos As Long
Set ws = Me.Worksheets("Onay Kontrolü")
' Durum sütunundaki boş hücreleri say
bos = Application.WorksheetFunction.CountBlank(ws.Range("C2:C7"))
If bos > 0 Then
Cancel = True ' Kapatma iptal edilir
ws.Range("D2").Value = bos & " görevin durumu boş; kapatma iptal edildi."
Else
ws.Range("D2").Value = "Tüm durumlar dolu; kapatmaya izin verildi."
End If
End Sub
' Kitabı kapatmadan olayı denemek için yardımcı yordam
Public Sub KapanisDene()
Dim iptal As Boolean
Workbook_BeforeClose iptal
End Sub
Workbook_BeforeClose
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Görev | Sorumlu | Durum | Kontrol Sonucu |
| 2 | Rapor hazırlama | Ayşe | Tamamlandı | |
| 3 | Fatura kontrolü | Mehmet | ||
| 4 | Stok sayımı | Fatma | Devam ediyor | |
| 5 | Sipariş onayı | Ali | ||
| 6 | Bütçe güncelleme | Zeynep | Tamamlandı | |
| 7 | Tedarikçi görüşmesi | Can | Tamamlandı |
Onay KontrolüExcelDepo v1.0.0
3. Kapanışta verileri sıralı bırakma
Kitap her kapanışında şehir satışlarını en yüksekten en düşüğe doğru sıralı bırakan bir olay kuruyoruz. Kodu ThisWorkbook modülüne yapıştırın. Sıralama sayfada etkin seçime ihtiyaç duymadan, doğrudan aralık üzerinden yapılır.
VBA
23 satır
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ws As Worksheet
Set ws = Me.Worksheets("Şehir Satışları")
' Satış sütununa göre büyükten küçüğe sırala
With ws.Sort
.SortFields.Clear
.SortFields.Add Key:=ws.Range("B2:B8"), Order:=xlDescending
.SetRange ws.Range("A1:B8")
.Header = xlYes
.Apply
End With
ws.Range("C2").Value = "Veriler satışa göre sıralandı"
End Sub
' Kitabı kapatmadan olayı denemek için yardımcı yordam
Public Sub KapanisDene()
Dim iptal As Boolean
Workbook_BeforeClose iptal
End Sub
Workbook_BeforeClose
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Şehir | Satış | Kapanış Notu |
| 2 | İstanbul | 185.000 | |
| 3 | Ankara | 92.000 | |
| 4 | İzmir | 134.000 | |
| 5 | Bursa | 76.000 | |
| 6 | Antalya | 118.000 | |
| 7 | Adana | 64.000 | |
| 8 | Konya | 58.000 |
Şehir SatışlarıExcelDepo v1.0.0
Kullanırken dikkat edin
- Yalnızca ThisWorkbook modülünde çalışır: Olay yordamını standart modüle ya da sayfa modülüne yazarsanız hata vermez ama hiç tetiklenmez. Yordamın ThisWorkbook modülünde ve tam adıyla Workbook_BeforeClose olarak durduğunu kontrol edin.
- Cancel yalnızca bu kapatma girişimini durdurur: Cancel = True kullanıcıyı kitapta tutar; ancak kullanıcı sorunu çözmeden yeniden kapatmayı denerse olay tekrar çalışır. Kapatmayı iptal ederken kullanıcıya nedenini mutlaka bildirin (MsgBox ya da hücre notu); aksi halde kitabın neden kapanmadığını anlayamaz.
- Kaydetme sorusu olaydan sonra gelir: Excel'in kaydetme sorusu olay bittikten sonra sorulur. Olay içinde Me.Saved = True yazarsanız soru hiç sorulmaz ve kaydedilmemiş değişiklikler sessizce kaybolur. Bunu yalnızca geçici ya da şablon niteliğindeki dosyalarda kullanın.
- Olay içindeki değişiklikler kitabı değiştirilmiş yapar: Olay yordamı bir hücreye yazarsa kitap yeniden "değiştirilmiş" sayılır ve kaydetme sorusu çıkabilir. Kapanışta not yazmak, sıralamak gibi işlemlerden sonra kaydetmek ya da Saved değerini bilinçli olarak yönetmek gerekir.
- Hata yönetimi ekleyin: Olay içinde oluşan işlenmemiş bir hata kapanış sırasında kullanıcıya hata penceresi gösterir ve kapatmayı karmaşıklaştırır. Hata olasılığı olan işlemlerde On Error GoTo ile hata yakalayıp kapanışın sürmesini sağlayın.
- Birden çok kitap ve Application.Quit: Excel kapatılırken açık her kitap için olay ayrı ayrı tetiklenir. Bir kitap Cancel = True yaparsa Excel'in kapanması da durur. Kod ile Application.Quit çağırdığınızda da aynı olay işler.
- İlgili konular:
- Workbook_Open: Kitap açıldığında çalışan olay; kapanış olayının tamamlayıcısıdır.
- Workbook_BeforeSave: Kitap kaydedilmeden önce tetiklenen olay.
- Workbook_SheetChange: Herhangi bir sayfada hücre değiştiğinde çalışan olay.
- Workbook.Close yöntemi: Kitabı kodla kapatır ve bu olayı tetikler.
- Workbook.Saved özelliği: Kitabın değişiklik durumunu tutar.
- Application.EnableEvents: Olayların çalışmasını açıp kapatan özellik.
- Application.DisplayAlerts: Excel uyarı pencerelerini bastırır.
- TOPLA: Örneklerdeki toplama işleminin sayfa işlevi karşılığı.