Özellik ikonu

Workbook_BeforeSave

İndirme izni yok

Genel Bakış

Workbook_BeforeSave (Workbook.BeforeSave event), çalışma kitabı kaydedilmeden hemen önce tetiklenen bir olaydır. Kayıt öncesinde zaman damgası yazmak, zorunlu alanları denetlemek, sayfaları korumaya almak ya da kaydı tamamen iptal etmek için kullanılır. Olay yordamı bir makroyu elle çalıştırmanıza gerek bırakmadan, kullanıcı kaydet dediği anda kendiliğinden devreye girer.

Olay yordamı nereye yazılır​

Olay yordamı standart modüle değil, ilgili kitabın ThisWorkbook modülüne yazılmalıdır. VBA düzenleyicisinde (Alt+F11) Proje Gezgini'nde ThisWorkbook öğesine çift tıklayın, kod penceresinin üstündeki sol listeden Workbook, sağ listeden BeforeSave seçin; Excel yordamın iskeletini sizin için oluşturur.

Standart modüle yazılan aynı adlı bir yordam olay olarak çalışmaz, yalnızca sıradan bir makro olur. Olayın çalışması için kitabın makro içerebilen bir biçimde (.xlsm) kaydedilmesi ve makroların etkin olması gerekir.

Söz dizimi​

Olayın söz dizimi şöyledir:

VBA 3 satır
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    ' Kayıt öncesi yapılacak işlemler
End Sub

  • SaveAsUI: Boolean değerdir; kayıt sırasında Farklı Kaydet (Save As) iletişim kutusu görüntülenecekse True olur. Kitap daha önce hiç kaydedilmemişse, Kaydet komutu da bu iletişim kutusunu açacağı için True gelir. Zorunlu parametredir; adını değiştirebilirsiniz ancak sırası ve türü sabittir.
  • Cancel: Boolean değerdir, başvuru ile (ByRef) iletilir. Varsayılan değeri False'tur; yordam içinde True yaparsanız kayıt işlemi iptal edilir ve dosya kaydedilmez.

Ne zaman tetiklenir ve ne yapabilirsiniz​

Olay şu durumlarda tetiklenir:

  • Kullanıcı eylemleri: Ctrl+S, Dosya > Kaydet (File > Save) ve Dosya > Farklı Kaydet (File > Save As) komutları.
  • Kod ile kayıt: Kodda Save, SaveAs ve SaveCopyAs yöntemlerinin çağrılması.

Yordam içinde hücrelere değer yazabilir, sayfaları koruyabilir, iletişim kutusu gösterebilir ve Cancel = True ile kaydı durdurabilirsiniz. Yordamda yaptığınız değişiklikler, kayıt gerçekleşmeden önce uygulandığı için dosyaya dahil edilir.

Kayıt işleminden hemen sonra çalışacak bir olay gerekiyorsa Excel 2010 ve sonrasındaki Workbook_AfterSave olayını kullanın.

1. Kayıt zamanını ve sayısını yazma​

Kitabın ThisWorkbook modülüne aşağıdaki kodu yapıştırın. Kitap her kaydedilişinde B2 hücresine o anın tarih ve saati yazılır, B3 hücresindeki kayıt sayısı bir artırılır. Kod, kayıt işlemi gerektirdiği için burada çalıştırılmaz; kitabı kaydederek deneyin.
VBA 13 satır
Option Explicit

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim ws As Worksheet
    Set ws = Me.Worksheets("Kayıt Günlüğü")

    ' Son kayıt zamanını yaz
    ws.Range("B2").Value = Now
    ws.Range("B2").NumberFormat = "dd.mm.yyyy hh:mm"

    ' Kayıt sayısını bir artır
    ws.Range("B3").Value = ws.Range("B3").Value + 1
End Sub
Workbook_BeforeSave
Formülünü incelemek için bir hücre seçin.
AB
1AlanDeğer
2Son kayıt zamanı
3Kayıt sayısı0
Kayıt GünlüğüExcelDepo v1.0.0
Kitabı her kaydettiğinizde B2 hücresi o anın tarih ve saatiyle, B3 hücresi ise bir fazla kayıt sayısıyla güncellenir. Değişiklikler kayıttan önce yapıldığı için dosyayla birlikte saklanır; kitabı yeniden açtığınızda son kayıt bilgisini görürsünüz.

2. Eksik veri varsa kaydı iptal etme​

Sipariş formunda B2:B6 aralığındaki miktar hücrelerinin tamamı dolu olmalıdır. Aşağıdaki kodu ThisWorkbook modülüne yapıştırın; boş miktar varsa kullanıcı uyarılır ve kayıt iptal edilir. Kod MsgBox ve kayıt içerdiği için burada çalıştırılmaz.
VBA 13 satır
Option Explicit

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim bos As Long

    ' Miktar sütunundaki boş hücreleri say
    bos = Application.WorksheetFunction.CountBlank(Me.Worksheets("Sipariş Formu").Range("B2:B6"))

    If bos > 0 Then
        MsgBox bos & " satırda miktar boş. Kayıt iptal edildi.", vbExclamation
        Cancel = True   ' Kaydı durdur
    End If
End Sub
Workbook_BeforeSave
Formülünü incelemek için bir hücre seçin.
AB
1ÜrünMiktar
2Kalem120
3Defter
4Silgi40
5Zımba
6Dosya60
Sipariş FormuExcelDepo v1.0.0
Bu tabloda Defter ve Zımba satırlarının miktarı boştur. Kaydetmeyi denediğinizde iki satırda miktarın boş olduğunu bildiren bir uyarı görürsünüz ve Cancel değeri True yapıldığı için dosya kaydedilmez. Boş hücreleri doldurduktan sonra kayıt normal biçimde tamamlanır.

3. Farklı Kaydet'i engelleme ve sayfayı koruma​

Kitabın başka bir adla kaydedilmesini engellemek ve normal kayıtlarda sayfayı korumaya almak için kodu ThisWorkbook modülüne yapıştırın. SaveAsUI değeri True ise kayıt iptal edilir. Kod iletişim kutusu ve kayıt içerdiği için burada çalıştırılmaz; sonucu kitabı kaydederek görebilirsiniz.
VBA 13 satır
Option Explicit

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    ' Farklı Kaydet penceresi açılacaksa işlemi durdur
    If SaveAsUI Then
        MsgBox "Bu kitap başka bir adla kaydedilemez.", vbInformation
        Cancel = True
        Exit Sub
    End If

    ' Normal kayıtta sayfayı korumaya al
    Me.Worksheets("Aylık Satış").Protect
End Sub
Workbook_BeforeSave
Formülünü incelemek için bir hücre seçin.
AB
1AySatış
2Ocak12.500,00
3Şubat13.800,00
4Mart15.250,00
Aylık SatışExcelDepo v1.0.0
Dosya > Farklı Kaydet komutunu kullandığınızda uyarı çıkar ve kayıt yapılmaz. Ctrl+S ile normal kayıt yaptığınızda ise Aylık Satış sayfası korumaya alınır ve ardından kayıt tamamlanır. Sayfa korumasını kaldırmak için Gözden Geçir sekmesindeki Sayfa Korumasını Kaldır komutunu kullanabilirsiniz.

Kullanırken dikkat edin​

  • Yordamı doğru modüle yazın: Olay yordamı yalnızca ThisWorkbook modülünde çalışır. Standart modüle ya da sayfa modülüne yazarsanız hiçbir hata vermez ancak kayıt sırasında tetiklenmez.
  • Kayıt işlemini yordamın içinde tekrar çağırmayın: Yordam içinde ThisWorkbook.Save çağırırsanız olay yeniden tetiklenir ve döngü oluşabilir. Kaydı kodla yapmanız gerekiyorsa önce Application.EnableEvents = False yazın, işlemden sonra mutlaka True değerine döndürün.
  • Cancel kaydı yalnızca o çağrı için durdurur: Cancel = True yapıldığında Excel kaydı sessizce iptal eder; kullanıcıya neden kaydedilmediğini siz bir uyarıyla bildirmelisiniz. Aksi halde kullanıcı dosyanın kaydedildiğini sanabilir.
  • SaveAsUI değerini kontrol edin: Hiç kaydedilmemiş yeni bir kitapta Ctrl+S bile SaveAsUI değerini True yapar. Bu nedenle SaveAsUI ile Farklı Kaydet'i engellerken ilk kaydı da engellemediğinizden emin olun.
  • Dosya biçimi ve makro güvenliği: Makro içeren kitap .xlsx olarak kaydedilirse kodlar silinir; .xlsm biçimini kullanın. Makrolar devre dışıysa olay hiç çalışmaz, bu yüzden kritik denetimleri yalnızca bu olaya bırakmayın.
  • İlgili konular:
    • Workbook_AfterSave: Kayıttan sonra çalışan olay.
    • Workbook_Open: Kitap açıldığında çalışan olay.
    • Workbook_BeforeClose: Kitap kapanmadan önce çalışan olay.
    • Application.EnableEvents: Olayları geçici olarak kapatıp açan özellik.
    • Workbook.Save, SaveAs ve SaveCopyAs: Kodla kayıt yöntemleri.
    • Worksheet.Protect: Sayfayı korumaya alan yöntem.
    • MsgBox: Kullanıcıya ileti gösteren işlev.
Ö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
17
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst