Özellik ikonu

Workbook_BeforeClose

İndirme izni yok

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ı 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.
Olay yordamının adını ve parametresini elle değiştirmeyin; ad Workbook_BeforeClose biçiminde kalmalıdır.

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.
Olayın başka bir parametresi yoktur; hangi kitabın kapandığı, yordamın bulunduğu kitaptan (ThisWorkbook ya da Me) bellidir.

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.
ABCDE
1ÜrünAdetBirim FiyatTutarKapanış Notu
2Klavye12450,005.400,00Toplam tutar: 44.850,00
3Fare25180,004.500,00
4Monitör64.200,0025.200,00
5Kulaklık15650,009.750,00
Kapanış KaydıExcelDepo v1.0.0
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.

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.
ABCD
1GörevSorumluDurumKontrol Sonucu
2Rapor hazırlamaAyşeTamamlandı
3Fatura kontrolüMehmet
4Stok sayımıFatmaDevam ediyor
5Sipariş onayıAli
6Bütçe güncellemeZeynepTamamlandı
7Tedarikçi görüşmesiCanTamamlandı
Onay KontrolüExcelDepo v1.0.0
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.

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.
ABC
1ŞehirSatışKapanış Notu
2İstanbul185.000
3Ankara92.000
4İzmir134.000
5Bursa76.000
6Antalya118.000
7Adana64.000
8Konya58.000
Şehir SatışlarıExcelDepo v1.0.0
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.

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ığı.
Ö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
15
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst