Genel Bakış
Unload deyimi, belleğe yüklenmiş bir UserForm'u kapatır ve bellekten boşaltır. Form ekrandan kalkar, denetimlerin değerleri ve form düzeyindeki değişkenler silinir. Bir forma işi bittiğinde temiz biçimde veda etmek ve bir sonraki gösterimde formu sıfırdan başlatmak için kullanılır.
CloseMode bağımsız değişkeni formun neden kapandığını bildirir:
Bu örnek form gerektirdiği için burada çalıştırılmaz. Makro çalıştığında form açılır, kullanıcı ad ve şehri yazıp Tamam'a basar; değerler listenin altındaki ilk boş satıra eklenir. Unload satırı sayesinde formu bir sonraki açışınızda metin kutuları boş gelir. Unload satırını silerseniz form gizli olarak bellekte kalır ve eski değerlerle açılır.
Makro çalışınca vbFormControlMenu için 0, vbFormCode için 1, vbAppWindows için 2 ve vbAppTaskManager için 3 değeri yazılır. QueryClose olayında Unload deyimiyle kapanmayı ayırt etmek için CloseMode değerini bu sabitlerle karşılaştırın; sayıları doğrudan yazmak yerine sabit adlarını kullanmak kodu okunaklı kılar.
Makro çalışmadan önce bellekte 0 form yüklüydü; döngü her birine Unload uyguladıktan sonra sayı 0 oldu. Döngünün sondan başa gitmesi önemlidir, çünkü her Unload koleksiyondaki eleman sayısını azaltır ve baştan sona giden bir döngü bazı formları atlayabilir.
Söz dizimi
Deyimin söz dizimi çok basittir; tek bir bağımsız değişkeni vardır:
VBA
7 satır
Unload nesne
' Form kendi kod modülünün içindeyse:
Unload Me
' Başka bir modülden:
Unload UserForm1
- nesne: zorunlu; boşaltılacak UserForm'un adı ya da formun kendi kod modülü içinde kendisini temsil eden Me anahtar sözcüğü. Varsayılan değeri yoktur.
Unload ve Hide arasındaki fark
Bu iki deyim sık karıştırılır:- Hide: formu yalnızca görünmez yapar. Form bellekte kalır, metin kutularındaki değerler ve form düzeyindeki değişkenler korunur. Kullanıcının girdiği verileri formun kapanmasından sonra okumak istiyorsanız önce Hide kullanılır.
- Unload: formu bellekten kaldırır. Tüm denetimler ilk haline döner. Aynı forma tekrar Show derseniz form yeniden yüklenir ve Initialize olayı yeniden çalışır.
Unload sırasında çalışan olaylar ve QueryClose
Unload çalıştığında form sırasıyla QueryClose ve Terminate olaylarını tetikler. QueryClose olayı formun kapanmasını iptal etme şansı verir:
VBA
5 satır
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
Cancel = True ' Çarpı düğmesiyle kapatmayı engelle
End If
End Sub
- vbFormControlMenu (0): kullanıcı form başlığındaki Kapat (X) düğmesine ya da denetim menüsüne tıkladı.
- vbFormCode (1): kapatma, koddaki bir Unload deyiminden geldi.
- vbAppWindows (2): Windows oturumu kapanıyor.
- vbAppTaskManager (3): uygulama Görev Yöneticisi tarafından kapatılıyor.
1. Formu Hide ile okuyup Unload ile boşaltma
Visual Basic Düzenleyicisi'nde (Visual Basic Editor, Alt+F11) UserForm1 adlı bir form hazırladığınızı varsayın. Formda txtAd ve txtSehir metin kutuları ile Tamam düğmesi bulunur; Tamam düğmesinin Click olayında yalnızca Me.Hide yazılıdır. Aşağıdaki kodu standart bir modüle yapıştırın. Makro formu gösterir, kullanıcı Tamam deyince değerleri sayfaya ekler ve formu bellekten boşaltır.
VBA
18 satır
Option Explicit
Sub PersonelKaydiEkle()
Dim son As Long
' Form gösterilir; Tamam düğmesi formu Hide ile gizleyince kod devam eder
UserForm1.Show
' Form gizli ama bellekte olduğu için denetim değerleri hala okunabilir
If UserForm1.txtAd.Value <> "" Then
son = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row + 1
ActiveSheet.Cells(son, 1).Value = UserForm1.txtAd.Value
ActiveSheet.Cells(son, 2).Value = UserForm1.txtSehir.Value
End If
' İş bitti: formu bellekten boşalt, bir sonraki Show formu sıfırdan başlatsın
Unload UserForm1
End Sub
Unload
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ad Soyad | Şehir | Bölüm |
| 2 | Ayşe Yılmaz | Ankara | Muhasebe |
| 3 | Mehmet Demir | İzmir | Satış |
| 4 | Fatma Kaya | Bursa | Üretim |
Personel ListesiExcelDepo v1.0.0
2. QueryClose CloseMode sabitlerinin değerleri
Formun neden kapandığını anlamak için kullanılan CloseMode sabitlerinin sayısal değerlerini görmek isteyebilirsiniz. Aşağıdaki kodu standart bir modüle yapıştırın; makro dört sabitin değerini B sütununa yazar.
VBA
11 satır
Option Explicit
Sub KapatmaKodlariniYaz()
' QueryClose olayındaki CloseMode sabitlerinin sayısal değerleri
With ActiveSheet
.Cells(2, 2).Value = vbFormControlMenu
.Cells(3, 2).Value = vbFormCode
.Cells(4, 2).Value = vbAppWindows
.Cells(5, 2).Value = vbAppTaskManager
End With
End Sub
Unload
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Sabit | Değer | Kapanma nedeni |
| 2 | vbFormControlMenu | 0 | Kullanıcı X düğmesine bastı |
| 3 | vbFormCode | 1 | Kodda Unload çalıştı |
| 4 | vbAppWindows | 2 | Windows kapanıyor |
| 5 | vbAppTaskManager | 3 | Görev Yöneticisi uygulamayı kapatıyor |
Kapatma KodlarıExcelDepo v1.0.0
3. Yüklü tüm formları boşaltma
Excel, bellekte yüklü olan tüm UserForm'ları UserForms koleksiyonunda tutar. Çok formlu bir uygulamayı kapatırken ya da hata sonrası temizlik yaparken bu koleksiyon üzerinden hepsini boşaltabilirsiniz. Aşağıdaki kodu standart bir modüle yapıştırın; makro boşaltmadan önceki ve sonraki yüklü form sayısını yazar.
VBA
16 satır
Option Explicit
Sub TumFormlariBosalt()
Dim i As Long
' Temizlikten önceki yüklü form sayısı
ActiveSheet.Cells(2, 2).Value = UserForms.Count
' Koleksiyon küçüldüğü için döngü sondan başa doğru ilerler
For i = UserForms.Count - 1 To 0 Step -1
Unload UserForms(i)
Next i
' Temizlikten sonraki yüklü form sayısı
ActiveSheet.Cells(3, 2).Value = UserForms.Count
End Sub
Unload
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Aşama | Yüklü form sayısı |
| 2 | Temizlikten önce | 0 |
| 3 | Temizlikten sonra | 0 |
Açık FormlarExcelDepo v1.0.0
Kullanırken dikkat edin
- Unload Me sonrasında denetime başvurmayın: Form kodunda Unload Me yazdıktan sonra aynı yordamda formun bir denetimine ya da özelliğine başvurursanız form belleğe sessizce yeniden yüklenebilir. Bu, formun hayalet gibi bellekte kalmasına yol açar. Unload Me satırını yordamın son satırı yapın.
- Değerleri okumadan önce Unload etmeyin: Unload ile form sıfırlandığı için metin kutularındaki girdiler kaybolur. Çağıran makro değerleri okuyacaksa formu önce Hide ile gizleyin, değerleri okuyun, en sonda Unload uygulayın. Alternatif olarak değerleri form kodundan genel bir değişkene ya da hücrelere aktarın.
- Yüklü olmayan forma Unload hata vermez: Bellekte olmayan bir formu boşaltmak çoğunlukla hata üretmez, ancak formun adına başvurmak (örneğin özelliğini okumak) formu otomatik olarak yükler. Gereksiz yüklemeleri önlemek için formun adına yalnızca gerektiğinde başvurun.
- Çarpı düğmesi ve QueryClose: Kullanıcı formu sağ üstteki X ile kapatırsa kodunuzdaki Unload çalışmaz, ama QueryClose ve Terminate olayları tetiklenir. Kapanışta temizlik yapmanız gerekiyorsa bu kodu düğme yordamına değil QueryClose içine yazın. Cancel değerini True yaparak kapanmayı engelleyebilirsiniz.
- New ile oluşturulan örnekler: Set f = New UserForm1 ile oluşturduğunuz örneği Unload f ile boşalttıktan sonra Set f = Nothing ile değişkeni de serbest bırakın. Aksi halde nesne başvurusu bellekte kalabilir. Ayrıca Unload yalnızca UserForm için geçerlidir; çalışma kitabını kapatmak için Workbook.Close kullanılır.
- İlgili konular:
- Load: formu göstermeden belleğe yükler.
- Show: formu görüntüler, gerekirse önce yükler.
- Hide: formu bellekten kaldırmadan gizler.
- Me: kod modülünün ait olduğu nesneyi temsil eder.
- UserForms: bellekte yüklü formların koleksiyonudur.
- Initialize ve Terminate olayları: formun yüklenmesi ve boşaltılması sırasında çalışır.
- QueryClose olayı: formun kapanmasını izlemeyi ve iptal etmeyi sağlar.
- Set ... Nothing: nesne değişkenini serbest bırakır.