Genel Bakış
Workbook_Open (Workbook.Open event), bir çalışma kitabı açıldığında Excel tarafından kendiliğinden çalıştırılan olay yordamıdır. Açılışta kullanıcıya karşılama bilgisi göstermek, sayfaları hazırlamak, hesapları yenilemek ya da açılış kaydı tutmak gibi başlangıç işlerini otomatikleştirmek için kullanılır. Yordam yalnızca makro içeren bir çalışma kitabında ve makrolara izin verildiğinde çalışır.
Kod penceresinin üstündeki sol açılır listeden Workbook nesnesini, sağ listeden Open olayını seçerseniz Excel yordamın iskeletini sizin için yazar. Yordamı standart modüle yazarsanız Excel onu olay olarak tanımaz, yalnızca sıradan bir makro olarak kalır. Dosyayı da makro içerebilen Excel Çalışma Kitabı (Makro İçerir) (Excel Macro-Enabled Workbook) biçiminde, yani .xlsm olarak kaydetmeniz gerekir.
Aut
Eski sürümlerden kalan Aut
pen adlı standart modül yordamı da açılışta çalışabilir. Her iki yöntem birlikte varsa önce Workbook_Open, ardından Aut
pen çalışır. Aut
pen, dosya Workbooks.Open ile kodla açıldığında çalışmaz; yeni kodlarda Workbook_Open tercih edilmelidir, çünkü kitapla birlikte taşınır ve ThisWorkbook ile doğrudan çalışır.
Kalem satırında stok asgari düzeyin altında olduğu için D2 hücresi Sipariş ver sonucunu gösterir; Defter satırında ise D3 hücresi Yeterli olur. Zımba için D6 hücresine Sipariş ver yazılır. Gerçek kullanımda bu işlem dosyayı her açışınızda kendiliğinden yapılır, siz hiçbir düğmeye basmazsınız.
Bu örnekteki sayfada makro çalıştıktan sonra B2 hücresi ve B3 hücresi boş görünür; yani sayaç ve son açılış zamanı sayfada yer almaz. Sayaç değerinin bir sonraki açılışta da korunması için dosyayı kapatırken değişiklikleri kaydetmeniz gerekir; kaydetmezseniz yapılan güncelleme kaybolur.
Bu örnekteki sayfada makro çalıştıktan sonra İstanbul için E2 hücresi ve Antalya için E6 hücresi boş görünür; Toplam sütununda değer oluşmamıştır. Application.EnableEvents ayarını kapatıp mutlaka yeniden açmak önemlidir; açmayı unutursanız Excel oturumu boyunca hiçbir olay yordamı çalışmaz. Burada On Error satırı, bir hata oluşsa bile Cikis etiketine atlanıp olayların yeniden açılmasını sağlar.
Olay yordamı nereye yazılır
Bu olay yordamı standart modüle değil, çalışma kitabının kendi nesne modülüne yani ThisWorkbook modülüne yazılır. Visual Basic düzenleyicisini Geliştirici > Visual Basic (Developer > Visual Basic) ile ya da Alt+F11 tuşlarıyla açın. Sol taraftaki Proje Gezgini (Project Explorer) penceresinde ilgili projenin altındaki ThisWorkbook öğesine çift tıklayın.Kod penceresinin üstündeki sol açılır listeden Workbook nesnesini, sağ listeden Open olayını seçerseniz Excel yordamın iskeletini sizin için yazar. Yordamı standart modüle yazarsanız Excel onu olay olarak tanımaz, yalnızca sıradan bir makro olarak kalır. Dosyayı da makro içerebilen Excel Çalışma Kitabı (Makro İçerir) (Excel Macro-Enabled Workbook) biçiminde, yani .xlsm olarak kaydetmeniz gerekir.
Söz dizimi
Olay yordamının adı ve imzası Excel tarafından belirlenir; adı değiştirirseniz olay çalışmaz.
VBA
3 satır
Private Sub Workbook_Open()
' Açılışta yapılacak işlemler
End Sub
- Parametre: Workbook_Open yordamının parametresi yoktur; parantezler boş yazılır.
- Private: Excel'in oluşturduğu iskelette bulunur; olay yordamı dışarıdan doğrudan çağrılmaz. Aynı kodu başka yerden de çalıştırmak istiyorsanız işi Public Sub ile yazılmış ayrı bir yordama taşıyıp Workbook_Open içinden çağırın.
- Dönüş değeri: Olay yordamı bir değer döndürmez; iptal edilebilen BeforeClose gibi olaylardaki Cancel parametresi burada yoktur.
Ne zaman çalışır, ne zaman çalışmaz
Olay, kullanıcı dosyayı açtığında ya da başka bir makro Workbooks.Open yöntemiyle açtığında tetiklenir. Aşağıdaki durumlarda ise çalışmaz:- Makrolar kapalıysa: Dosya > Seçenekler > Güvenlik Merkezi > Güvenlik Merkezi Ayarları > Makro Ayarları (File > Options > Trust Center > Trust Center Settings > Macro Settings) bölümünde makrolar devre dışıysa ya da kullanıcı İçeriği Etkinleştir (Enable Content) düğmesine basmadıysa yordam çalışmaz.
- Korumalı Görünümde: İnternetten ya da e-postadan gelen dosya Korumalı Görünümde (Protected View) açılırsa düzenlemeyi etkinleştirene kadar olay tetiklenmez.
- Shift basılıysa: Dosya açılırken Shift tuşunu basılı tutan kullanıcı olayı atlatabilir.
- Olaylar kapalıysa: Başka bir makro Application.EnableEvents = False ayarını yapmışsa ve dosyayı o sırada açıyorsa olay çalışmaz.
Aut
pen ile farkı
Eski sürümlerden kalan Aut1. Açılışta stok durumunu denetleme
Bir kırtasiye stok listesinde mevcut stok, asgari stoktan düşükse Durum sütununa sipariş uyarısı yazılmasını istiyoruz. Aşağıdaki kodu ThisWorkbook modülüne yapıştırın. İşi yapan AcilisKontrol yordamı Workbook_Open içinden çağrılır; böylece dosya her açıldığında liste yenilenir.
VBA
23 satır
Option Explicit
' Dosya açıldığında Excel bu yordamı kendiliğinden çalıştırır
Private Sub Workbook_Open()
AcilisKontrol
End Sub
' Asıl işi yapan ortak yordam
Public Sub AcilisKontrol()
Dim ws As Worksheet
Dim i As Long
Set ws = ThisWorkbook.Worksheets(1)
' 2. satırdan 7. satıra kadar sonlu döngü
For i = 2 To 7
If ws.Cells(i, 2).Value < ws.Cells(i, 3).Value Then
ws.Cells(i, 4).Value = "Sipariş ver"
Else
ws.Cells(i, 4).Value = "Yeterli"
End If
Next i
End Sub
Workbook_Open
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Stok | Asgari Stok | Durum | |
| 2 | Kalem | 41 | 50 | Sipariş ver | 91 |
| 3 | Defter | 27.10.2026 13:40 | 80 | Yeterli | 46402,56948 |
| 4 | Silgi | 15 | 30 | Sipariş ver | 45 |
| 5 | Kağıt | 300 | 200 | Yeterli | 500 |
| 6 | Zımba | 8 | 10 | Sipariş ver | 18 |
| 7 | Marker | 60 | 40 | Yeterli |
Stok TakipExcelDepo v1.0.0
2. Açılış sayacı ve son açılış zamanı
Bir çalışma kitabının kaç kez açıldığını ve en son ne zaman açıldığını sayfada tutmak istiyoruz. Kodu ThisWorkbook modülüne yapıştırın. B2 hücresi sayaç, B3 hücresi son açılış zamanıdır; başlangıçta boş olan sayaç hücresine her açılışta 1 eklenir.
VBA
18 satır
Option Explicit
Private Sub Workbook_Open()
AcilisKaydet
End Sub
Public Sub AcilisKaydet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
' Boş hücre sayı işleminde 0 kabul edilir; sayaç 1 artar
ws.Range("B2").Value = ws.Range("B2").Value + 1
' Şimdiki tarih ve saati yazıp biçimlendir
ws.Range("B3").Value = Now
ws.Range("B3").NumberFormat = "dd.mm.yyyy hh:mm"
End Sub
Workbook_Open
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Kayıt | Değer |
| 2 | Açılış sayısı | |
| 3 | Son açılış |
Açılış KaydıExcelDepo v1.0.0
3. Açılışta toplamları yenileme ve olayları koruma
Bölgelere göre aylık satış tablosunda Toplam sütununu açılışta kodla hesaplatıyoruz. Kod, işlem sırasında başka olay yordamlarının araya girmemesi için olayları geçici olarak kapatır ve hata olsa bile yeniden açar. Kodu ThisWorkbook modülüne yapıştırın.
VBA
28 satır
Option Explicit
Private Sub Workbook_Open()
Hesapla
End Sub
Public Sub Hesapla()
Dim ws As Worksheet
Dim i As Long
Set ws = ThisWorkbook.Worksheets(1)
' Olayları geçici olarak kapat
Application.EnableEvents = False
On Error GoTo Cikis
' Her bölge için Ocak-Mart toplamını E sütununa yaz
For i = 2 To 6
ws.Cells(i, 5).Value = Application.WorksheetFunction.Sum(ws.Range(ws.Cells(i, 2), ws.Cells(i, 4)))
Next i
' Bu sayfayı açılışta öne getir
ws.Activate
Cikis:
' Hata olsa da olsa olayları yeniden aç
Application.EnableEvents = True
End Sub
Workbook_Open
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Bölge | Ocak | Şubat | Mart | Toplam |
| 2 | İstanbul | 125.000 | 98.000 | 143.000 | |
| 3 | Ankara | 76.000 | 81.000 | 69.000 | |
| 4 | İzmir | 64.000 | 72.000 | 58.000 | |
| 5 | Bursa | 41.000 | 39.000 | 47.000 | |
| 6 | Antalya | 52.000 | 60.000 | 71.000 |
Satış ÖzetiExcelDepo v1.0.0
Kullanırken dikkat edin
- Yanlış modüle yazmayın: Yordam standart modüle ya da bir sayfa modülüne yazılırsa açılışta çalışmaz. Doğru yer yalnızca ThisWorkbook modülüdür; sayfa modülündeki Worksheet_ olayları ayrı bir konudur.
- Dosya türü ve makro güvenliği: Makro içeren dosya .xlsx olarak kaydedilirse kod silinir. Dosyayı .xlsm olarak kaydedin. Kullanıcılarınızın makroları etkinleştirmesi ya da dosyayı güvenilen bir konuma koymanız gerekir; aksi halde Workbook_Open hiç çalışmaz ve hata mesajı da görünmez.
- Shift tuşuyla atlama: Kullanıcı dosyayı açarken Shift tuşunu basılı tutarsa olay yordamı çalışmaz. Bu yüzden açılış kodunu, güvenlik amacıyla kullanıcıyı zorlamak için tek başına yeterli bir önlem saymayın.
- Açılışı ağır işlerle yavaşlatmayın: Uzun süren döngüler, çok sayıda dosya açma ya da büyük veri yenileme işlemleri dosyanın açılmasını geciktirir. Açılış kodunu kısa tutun; ağır işlemler için Application.ScreenUpdating ayarını geçici kapatıp işlem bitince yeniden açın.
- Olayları kapatırsanız yeniden açın: Application.EnableEvents ayarını False yaptıktan sonra bir hata oluşursa ayar kapalı kalabilir. Üçüncü örnekteki gibi hata yakalama etiketi kullanıp ayarı her durumda True yapın.
- ThisWorkbook ve ActiveWorkbook farkı: Kodun yazıldığı dosyaya başvurmak için ThisWorkbook kullanın. ActiveWorkbook, o anda etkin olan dosyadır ve açılış sırasında başka bir dosya etkin olabilir; bu da kodun yanlış dosyada işlem yapmasına yol açar.
- Kaydetme gerektiren değişiklikler: Açılışta sayfaya yazdığınız değerler dosya kaydedilmedikçe kalıcı olmaz. Sadece okunur açılan ya da kaydı kapatılan dosyalarda yapılan güncellemeler kapanışta kaybolur.
- İlgili konular:
- Workbook_BeforeClose: Dosya kapanmadan önce çalışan olay.
- Workbook_Activate: Dosya etkin olduğunda çalışan olay.
- Workbook_SheetChange: Dosyadaki herhangi bir sayfada hücre değişince çalışan olay.
- Aut
pen: Standart modülde yazılan eski tür açılış yordamı. - Application.EnableEvents: Olayların çalışmasını açıp kapatan özellik.
- ThisWorkbook: Kodun bulunduğu çalışma kitabını gösteren nesne.
- Worksheet_Activate: Sayfa etkinleştiğinde çalışan olay.
- BUGÜN ve ŞİMDİ: Açılışta tarih ve saat bilgisi almak için kullanılabilecek işlevler.