Genel Bakış
Workbook_Activate (Workbook.Activate event), bir çalışma kitabı etkin kitap durumuna geçtiğinde Excel tarafından otomatik olarak çalıştırılan olaydır. Kitap her öne alındığında bir işlemin yapılmasını sağlar; örneğin özet hücrelerini yenilemek, durum bilgisi yazmak ya da belirli bir denetimi çalıştırmak için kullanılır.
Yordamın adı ve yazımı sabittir. Adı değiştirirseniz ya da yordamı başka bir modüle taşırsanız Excel olayı tanımaz ve yordam kendiliğinden çalışmaz.
Kitap yeniden etkinleştirildiğinde olay yordamı çalıştı. B2 hücresine Kitap etkin, B3 hücresine Olay çalıştı yazıldı. Bu hücreler olay çalışmadan önce boştu.
Olay çalıştığında C2 hücresine B2:B6 aralığının toplamı yazıldı: 63.550. Satış rakamlarını değiştirip başka bir kitaba geçerek geri döndüğünüzde toplam güncel değeriyle yeniden yazılır.
Olay çalışınca her ürünün durumu D sütununa yazıldı; örneğin Defter satırı için D3 hücresi Kritik, Kalem satırı için D2 hücresi Yeterli oldu. Stoku asgari değerin altında kalan ürünlerin sayısı E2 hücresinde: 2.
Olay yordamı nereye yazılır
Bu olay yordamı standart modüle değil, ilgili kitabın ThisWorkbook modülüne yazılır. Visual Basic Düzenleyicisi'nde (Alt+F11) Proje Gezgini'nde ThisWorkbook öğesine çift tıklayın. Kod penceresinin üstündeki sol listeden Workbook, sağ listeden Activate seçildiğinde Excel boş yordam iskeletini sizin için oluşturur.Yordamın adı ve yazımı sabittir. Adı değiştirirseniz ya da yordamı başka bir modüle taşırsanız Excel olayı tanımaz ve yordam kendiliğinden çalışmaz.
Söz dizimi
Olay yordamının genel biçimi şöyledir:
VBA
3 satır
Private Sub Workbook_Activate()
' Kitap etkin olduğunda yapılacak işlemler
End Sub
- Parametre: Bu olayın parametresi yoktur. Yordam parantezleri boş yazılır.
- Me: ThisWorkbook modülünün içinde Me ifadesi, olayın ait olduğu çalışma kitabını gösterir.
- Dönüş değeri: Olay yordamı değer döndürmez; bir Sub olarak çalışır.
Ne zaman tetiklenir
Olay, aynı Excel oturumunda açık olan bir kitap etkin kitap olduğunda çalışır. Başka bir kitaptan bu kitaba geçtiğinizde ya da kodla Workbook.Activate yöntemini çağırdığınızda tetiklenir.- Tetiklenmez: Aynı kitabın farklı pencereleri arasında geçişte bu olay çalışmaz; bunun için Workbook_WindowActivate kullanılır.
- Tetiklenmez: Excel'den başka bir programa geçip geri döndüğünüzde kitap zaten etkin kitap olduğu için olay çalışmaz.
- Karşıt olay: Kitap etkinliğini kaybederken Workbook_Deactivate olayı çalışır.
- Olay kapalıysa: Application.EnableEvents özelliği False iken olay çalışmaz.
1. Kitap etkinleşince durum bilgisi yazmak
Örnek sayfanın adı Durum olsun. Aşağıdaki kodu ThisWorkbook modülüne yapıştırın. Başka bir kitap açılıp bu kitap yeniden etkinleştirildiğinde olay çalışır ve B2 ile B3 hücrelerine bilgi yazar. Bu sınama için bir yardımcı makro yeni bir geçici kitap açar, bu kitabı etkinleştirir ve geçici kitabı kaydetmeden kapatır.
VBA
9 satır
Option Explicit
' ThisWorkbook modülüne yazılır
Private Sub Workbook_Activate()
With Me.Worksheets("Durum")
.Range("B2").Value = "Kitap etkin"
.Range("B3").Value = "Olay çalıştı"
End With
End Sub
Workbook_Activate
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Alan | Sonuç |
| 2 | Kitap durumu | Kitap etkin |
| 3 | Olay bilgisi | Olay çalıştı |
DurumExcelDepo v1.0.0
2. Toplamı kitap etkinleşince yenilemek
Örnek sayfanın adı Satış Özeti olsun. Aylık satışlar B2:B6 aralığındadır. Kodu ThisWorkbook modülüne yapıştırın. Kitap her etkinleştiğinde C2 hücresindeki toplam yeniden hesaplanıp yazılır. Sınama için aynı yardımcı makro kullanılır.
VBA
10 satır
Option Explicit
' ThisWorkbook modülüne yazılır
Private Sub Workbook_Activate()
Dim ws As Worksheet
Set ws = Me.Worksheets("Satış Özeti")
' B2:B6 aralığındaki satışların toplamını C2 hücresine yaz
ws.Range("C2").Value = Application.WorksheetFunction.Sum(ws.Range("B2:B6"))
End Sub
Workbook_Activate
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ay | Satış (TL) | Toplam Satış |
| 2 | Ocak | 12.500 | 63.550 |
| 3 | Şubat | 9.800 | |
| 4 | Mart | 14.300 | |
| 5 | Nisan | 11.200 | |
| 6 | Mayıs | 15.750 |
Satış ÖzetiExcelDepo v1.0.0
3. Stok durumunu kitap açılınca denetlemek
Örnek sayfanın adı Stok Kontrol olsun. Stok miktarı B sütununda, asgari stok C sütunundadır. Kodu ThisWorkbook modülüne yapıştırın. Olay, her ürünün durumunu D sütununa yazar ve kritik ürün sayısını E2 hücresine koyar. Sınama için aynı yardımcı makro kullanılır.
VBA
23 satır
Option Explicit
' ThisWorkbook modülüne yazılır
Private Sub Workbook_Activate()
Dim ws As Worksheet
Dim i As Long
Dim kritik As Long
Set ws = Me.Worksheets("Stok Kontrol")
' 2. satırdan 7. satıra kadar her ürünü denetle
For i = 2 To 7
If ws.Cells(i, 2).Value < ws.Cells(i, 3).Value Then
ws.Cells(i, 4).Value = "Kritik"
kritik = kritik + 1
Else
ws.Cells(i, 4).Value = "Yeterli"
End If
Next i
' Kritik ürün sayısını yaz
ws.Range("E2").Value = kritik
End Sub
Workbook_Activate
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Stok | Asgari Stok | Durum | Kritik Adet |
| 2 | Kalem | 120 | 100 | Yeterli | 2 |
| 3 | Defter | 40 | 60 | Kritik | |
| 4 | Dosya | 75 | 50 | Yeterli | |
| 5 | Zımba | 12 | 20 | Kritik | |
| 6 | Klasör | 90 | 80 | Yeterli | |
| 7 | A4 Kağıt Kolisi | 30 | 25 | Yeterli |
Stok KontrolExcelDepo v1.0.0
Kullanırken dikkat edin
- Olayın yeri: Kod ThisWorkbook modülünde olmalıdır. Standart modüle ya da sayfa modülüne yazılan Workbook_Activate yordamı olay olarak çalışmaz; yalnızca sıradan bir yordam gibi kalır.
- Kitap açılırken tetiklenme: Kitap açılırken Open olayının ardından Activate olayının da çalışabileceğini göz önünde bulundurun. Bu nedenle aynı işlemi hem Workbook_Open hem Workbook_Activate içine yazarsanız işlem iki kez yapılabilir. Yalnızca bir kez çalışması gereken işlemleri Workbook_Open içine koyun.
- Pencere geçişleri: Aynı kitabın ikinci penceresine geçmek Workbook_Activate olayını tetiklemez. Pencere geçişlerine tepki vermek istiyorsanız Workbook_WindowActivate olayını kullanın.
- Uzun işlemlerden kaçının: Kitap her etkinleştiğinde çalıştığı için olay içine ağır hesaplamalar ya da çok sayıda hücreyi dolaşan döngüler koymayın. Kitaplar arasında geçiş yavaşlar ve kullanıcı gecikmeyi fark eder.
- Olayları kapatma: Application.EnableEvents özelliğini False yaptıysanız olay çalışmaz. Kodunuz hata verip yarıda kalırsa özellik False kalabilir; bu durumda olaylar çalışmaz. Anlık Pencere'ye Application.EnableEvents = True yazarak durumu düzeltebilirsiniz.
- Sonsuz döngü riski: Olay içinde kitabı yeniden etkinleştiren bir kod (örneğin başka bir kitaba geçip geri dönen komutlar) yazarsanız olay kendini tekrar tekrar çağırabilir. Böyle bir durumda olayı geçici olarak EnableEvents ile kapatın.
- Makro güvenliği: Kitap makro içerdiği için .xlsm biçiminde kaydedilmelidir. Makrolar devre dışıysa olay yordamı da çalışmaz.
- İlgili konular:
- Workbook_Open: Kitap açıldığında çalışan olay.
- Workbook_Deactivate: Kitap etkinliğini kaybettiğinde çalışan olay.
- Workbook_WindowActivate: Kitabın bir penceresi etkinleştiğinde çalışan olay.
- Workbook_SheetActivate: Kitaptaki bir sayfa etkinleştiğinde çalışan olay.
- Worksheet_Activate: Belirli bir sayfa etkinleştiğinde çalışan olay.
- Application.EnableEvents: Olayların çalışmasını açıp kapatan özellik.
- Workbook.Activate: Bir kitabı kodla etkinleştiren yöntem.