Genel Bakış
UserForm_Activate (Activate olayı), bir UserForm etkin pencere olduğunda çalışan olay yordamıdır. Formun her görüntülenişinde ya da başka bir pencereden geri dönüldüğünde yapılması gereken işlemler için kullanılır: alanları yenileme, imleci belirli bir denetime taşıma, başlığı güncelleme gibi. Karşılığı olan Deactivate olayı ise form etkin pencere olmaktan çıktığında çalışır.
Burada Me çalışan formun kendisini, txtMusteri ise formdaki örnek bir TextBox'ın adını gösterir.
Başka bir sayfa etkin olunca sayfa devre dışı kaldı ve Deactivate olayı B3 hücresine Sayfadan ayrılındı yazdı. Sayfaya dönüldüğünde Activate olayı B2 hücresine Sayfa etkinleştirildi yazdı.
Workbook_SheetActivate olayı, günlük sayfası dışındaki bir sayfa etkinleştiğinde o sayfanın adını B2 hücresine yazmak üzere kurulmuştur; bu çalışmada B2 hücresinde Satış Özeti görünür. Olayın Sh parametresi etkinleşen sayfayı verir; UserForm olaylarında böyle bir parametre yoktur, form kendi içinde Me ile anılır.
Sayfa yeniden etkinleştiğinde Activate olayı toplamı hesaplayıp C2 hücresine yazdı: 63.550,00. Veriler değişse bile sayfa her etkinleştiğinde toplam güncellenir; UserForm'da da aynı yöntemle etiketler ve listeler her açılışta tazelenir.
Olay yordamı nereye yazılır
UserForm olayları, ilgili formun kendi kod modülüne yazılır; standart modüle ya da ThisWorkbook modülüne yazılan UserForm_Activate yordamı çalışmaz.- Adım 1: Alt+F11 ile Visual Basic Düzenleyicisi'ni (VBE) açın.
- Adım 2: Proje Gezgini'nde (Project Explorer) formunuza çift tıklayın, ardından F7 tuşuyla kod penceresini açın.
- Adım 3: Sol üstteki nesne listesinden UserForm, sağ üstteki yordam listesinden Activate seçin. VBE yordamın iskeletini kendisi oluşturur.
VBA
4 satır
Private Sub UserForm_Activate()
Me.Caption = "Sipariş Girişi"
Me.txtMusteri.SetFocus
End Sub
Söz dizimi
Olay yordamının genel biçimi aşağıdadır:
VBA
7 satır
Private Sub UserForm_Activate()
' form etkin olduğunda çalışacak kod
End Sub
Private Sub UserForm_Deactivate()
' form etkin pencere olmaktan çıktığında çalışacak kod
End Sub
- Parametre: Activate ve Deactivate olaylarının parametresi yoktur.
- Activate: Form etkin pencere olduğunda tetiklenir.
- Deactivate: Form etkin pencere olmaktan çıktığında tetiklenir; örneğin odak başka bir forma ya da Excel penceresine geçtiğinde.
Activate ile Initialize farkı
Bu iki olayı karıştırmak en sık yapılan hatadır. Sıralama şöyledir:- Initialize: Form belleğe yüklendiğinde yalnızca bir kez çalışır. Bir kez yapılacak hazırlıklar için uygundur: ComboBox listesini doldurmak, başlangıç değerlerini atamak.
- Activate: Form Show ile görüntülendiğinde Initialize'dan sonra çalışır. Form Hide ile gizlenip yeniden Show edilirse Initialize çalışmaz, Activate yeniden çalışır.
- Yalnızca Load: Formu Load deyimiyle yüklemek Activate'i tetiklemez; olay form gerçekten görüntülendiğinde oluşur.
Aynı mantıktaki diğer Activate olayları
Excel'de aynı adı taşıyan başka olaylar da vardır ve çalışma biçimleri aynıdır: Worksheet_Activate ve Worksheet_Deactivate sayfa modülüne, Workbook_SheetActivate ise ThisWorkbook modülüne yazılır. UserForm gösterimi kullanıcı etkileşimi gerektirdiği için aşağıdaki örneklerde aynı kavramı sayfa ve çalışma kitabı düzeyindeki Activate olaylarıyla uygulamalı olarak görüyorsunuz.1. Sayfa Activate ve Deactivate olayları
Sayfanın sekmesine sağ tıklayıp Kod Görüntüle (View Code) deyin ve aşağıdaki kodu sayfa modülüne yapıştırın. Sayfa etkin olduğunda B2, sayfadan ayrılındığında B3 hücresine ileti yazılır; UserForm'daki Activate ve Deactivate çiftinin aynısıdır.
VBA
11 satır
Option Explicit
' Sayfa etkin olduğunda çalışır
Private Sub Worksheet_Activate()
Me.Range("B2").Value = "Sayfa etkinleştirildi"
End Sub
' Başka bir sayfaya geçildiğinde çalışır
Private Sub Worksheet_Deactivate()
Me.Range("B3").Value = "Sayfadan ayrılındı"
End Sub
UserForm_Activate
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Olay | Sonuç |
| 2 | Activate | Sayfa etkinleştirildi |
| 3 | Deactivate | Sayfadan ayrılındı |
Olay GünlüğüExcelDepo v1.0.0
2. Çalışma kitabı düzeyinde sayfa geçişini izleme
Aşağıdaki kodu ThisWorkbook modülüne yapıştırın. Kitaptaki herhangi bir sayfa etkinleştirildiğinde adı B2 hücresine kaydedilir. Günlük sayfasının kendisi etkin olduğunda kayıt yapılmaz.
VBA
8 satır
Option Explicit
' Kitapta herhangi bir sayfa etkin olduğunda çalışır
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Name <> "Geçiş Kaydı" Then
Me.Worksheets("Geçiş Kaydı").Range("B2").Value = Sh.Name
End If
End Sub
UserForm_Activate
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Alan | Değer |
| 2 | Son etkinleşen sayfa | Satış Özeti |
| 3 | Olay | Workbook_SheetActivate |
Geçiş KaydıExcelDepo v1.0.0
3. Etkinleşince verileri yenileme deseni
UserForm_Activate içinde sık kullanılan desen, her görüntülemede veriyi yeniden hesaplamaktır. Aynı deseni sayfa modülünde görüyorsunuz: sayfa her etkinleştiğinde B2:B6 aralığının toplamı C2 hücresine yazılır. Kodu bu sayfanın kod modülüne yapıştırın.
VBA
9 satır
Option Explicit
' Sayfa her etkin olduğunda toplamı yeniden hesaplar
Private Sub Worksheet_Activate()
Dim toplam As Double
toplam = Application.WorksheetFunction.Sum(Me.Range("B2:B6"))
Me.Range("C2").Value = toplam
Me.Range("C2").NumberFormat = "#,##0.00"
End Sub
UserForm_Activate
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ay | Satış | Toplam |
| 2 | Ocak | 12.500,00 | 63.550,00 |
| 3 | Şubat | 9.800,00 | |
| 4 | Mart | 14.250,00 | |
| 5 | Nisan | 11.300,00 | |
| 6 | Mayıs | 15.700,00 |
Satış ÖzetiExcelDepo v1.0.0
Kullanırken dikkat edin
- Yordam adı ve modül: Yordam adı tam olarak UserForm_Activate olmalı ve formun kendi kod modülünde bulunmalıdır. Adı elle yazarken harf hatası yaparsanız Excel hata vermez, yordam sadece hiç çalışmaz. Olay iskeletini üstteki listelerden seçmek en güvenli yoldur.
- Her gösterimde çalışır: Activate, form her görüntülendiğinde ve etkin pencere her yeniden formun üzerine geçtiğinde çalışır. Ağır işlemleri (büyük aralık okuma, döngüler) buraya koyarsanız form her açılışta yavaşlar. Yalnızca bir kez yapılacak işleri UserForm_Initialize olayına taşıyın.
- Modless formlarda tekrar tetiklenme: vbModeless olarak gösterilen formlarda kullanıcı Excel penceresiyle form arasında geçiş yaptıkça Activate ve Deactivate tekrar tekrar çalışır. Bu olaylarda MsgBox göstermek ya da formu yeniden Show etmek döngüye benzer istenmeyen sonuçlar doğurabilir.
- Activate içinde Show çağırmayın: Activate yordamı içinde aynı formun Show yöntemini çağırmak özyinelemeye ve hataya yol açar. Formu kapatma ya da gizleme kararlarını düğme olaylarında (Click) ve QueryClose olayında verin.
- Deactivate ve kapatma: Deactivate formu kapatma olayı değildir; formun Hide ya da Unload ile kapanışında çalışacağına güvenmeyin. Kapanışta yapılacak temizlik ve kayıt işlemleri için QueryClose ve Terminate olaylarını kullanın.
- İmleci yerleştirme: Odağı belirli bir denetime vermek için SetFocus yöntemini Initialize yerine Activate içinde kullanmak daha güvenilirdir; çünkü Initialize sırasında form henüz ekranda değildir ve odak atanamayabilir.
- Sayfa ve kitap olayları: Worksheet_Activate ve Workbook_SheetActivate gibi olaylar Application.EnableEvents özelliği False iken çalışmaz. Bir makro bu özelliği kapatıp geri açmayı unutursa olaylar sessizce devre dışı kalır.
- İlgili konular: UserForm_Initialize, UserForm_QueryClose, UserForm_Terminate, UserForm.Show ve Hide yöntemleri, Unload deyimi, SetFocus yöntemi, Worksheet_Activate, Worksheet_Deactivate, Workbook_SheetActivate, Workbook_Open, Application.EnableEvents, TextBox, ComboBox ve ListBox denetimleri.