Genel Bakış
UserForm_Resize (Resize olayı), bir UserForm'un genişliği ya da yüksekliği değiştiğinde Excel tarafından otomatik çalıştırılan olay yordamıdır. Formdaki liste, metin kutusu ve düğme gibi kontrolleri yeni form boyutuna göre yeniden konumlandırmak ve boyutlandırmak için kullanılır. Böylece form büyüdüğünde ya da küçüldüğünde arayüz dengeli kalır.
Bir formdaki kontrollere doğrudan adlarıyla (lstVeri, cmdKapat gibi) erişirsiniz; bu nedenle aynı kod başka bir modüle taşınırsa çalışmaz.
Varsayılan formda liste genişliği 376, liste yüksekliği 246, düğmenin üst konumu 258 olarak hesaplanır. Büyük ekran senaryosunda liste 1000 x 546 boyutuna ulaşır. Çok dar formda hesap asgari sınırın altına düşeceği için liste genişliği 100, yüksekliği 60 değerinde tutulur. Bu asgari değer denetimi, gerçek formda negatif boyut hatasını önleyen kısımdır.
Küçültme denemesinde boyut asgari değerlere çekilir: genişlik 200, yükseklik 150 ve durum Düzeltildi olur. Dar formda yalnız genişlik düzeltilirken yükseklik 300 olarak korunur. Varsayılan form asgari sınırların üzerinde olduğundan durumu Uygun çıkar. Gerçek formda atama yapıldığında Resize olayı yeniden çalışır; ancak koşul artık sağlanmadığı için ikinci çağrıda değişiklik yapılmaz ve döngü kendiliğinden sona erer.
Bu örnek güvenlik ayarlarına ve VBA proje erişimine bağlı olduğundan burada çalıştırılmaz; tablo, makronun kuracağı formun başlangıç planını gösterir. ResizeFormuKur çalışınca Proje Gezgini'nde frmRapor formu belirir ve kod modülünde UserForm_Resize yordamı bulunur. FormuGoster form açıkken Width ve Height değerlerini artırır; bu değişiklik Resize olayını tetikler, liste kutusu yeni iç alana göre genişler ve Kapat düğmesi sağ alt köşeye kayar. Form 200 x 150 iç alandan küçüldüğünde yordam hiçbir şey yapmadan çıkar.
Söz dizimi
Olay yordamı UserForm'un kod modülünde şu adla yer alır:
VBA
3 satır
Private Sub UserForm_Resize()
' Kontrolleri yeniden yerleştiren kodlar
End Sub
- Parametre: Olayın hiçbir parametresi yoktur; yeni boyutu Me.Width, Me.Height, Me.InsideWidth ve Me.InsideHeight özelliklerinden okursunuz.
- Me: Kodun bulunduğu UserForm'u temsil eder.
- Dönüş değeri: Olay bir değer döndürmez ve iptal edilemez.
Olay yordamı nereye yazılır
Yordam standart modüle ya da ThisWorkbook modülüne değil, ilgili UserForm'un kod modülüne yazılır. Geliştirici > Visual Basic (Developer > Visual Basic) ile Visual Basic Düzenleyicisi'ni açın, Proje Gezgini'nde formunuza çift tıklayın ve F7 tuşuyla kod penceresine geçin. Kod penceresinin üstündeki sol listeden UserForm, sağ listeden Resize seçtiğinizde boş yordam oluşur.Bir formdaki kontrollere doğrudan adlarıyla (lstVeri, cmdKapat gibi) erişirsiniz; bu nedenle aynı kod başka bir modüle taşınırsa çalışmaz.
Olay ne zaman tetiklenir
Olay, form boyutu değiştiğinde çalışır. Aşağıdaki durumlar tipik örneklerdir:- Kodla boyut değişikliği: Width ya da Height özelliğine yeni bir değer atandığında olay tetiklenir.
- Kullanıcı müdahalesi: Standart bir UserForm'un kenarları fare ile sürüklenemez. Kullanıcının boyutlandırabilmesi için forma ek düzenlemeler (örneğin pencere stilini değiştiren yöntemler) gerekir; bu düzenlemeler yapıldığında da Resize olayı çalışır.
- Form ilk gösterildiğinde: Form yüklenirken boyut ayarlarının uygulanması nedeniyle olay çalışabilir. Kodunuzu bu duruma dayanıklı yazın.
Önemli özellikler
- Width, Height: Formun dış boyutu (punto cinsinden).
- InsideWidth, InsideHeight: Başlık ve kenarlıklar hariç, kontrollerin yerleşeceği iç alan.
- Left, Top, Width, Height (kontrol): Her kontrolün konum ve boyutu; yeniden yerleştirmede bunlar değiştirilir.
- Controls: Formdaki tüm kontrollerin koleksiyonu; döngüyle ortak ayar yapmak için kullanılır.
1. Kontrol boyutlarını form boyutundan hesaplama
Resize olayında yapılan hesabı sayfa üzerinde görmek için bir standart modül kullanıyoruz. Her satırda formun iç genişliği ve yüksekliği verilmiştir; makro, ListBox için kenar boşluklarını düşerek genişlik ve yükseklik, düğme için de üst konum hesaplar. Kodu standart modüle yapıştırıp YerlesimHesapla makrosunu çalıştırın. Aynı hesap gerçek formda UserForm_Resize içinde Me.InsideWidth ve Me.InsideHeight değerleriyle yapılır.
VBA
30 satır
Option Explicit
Sub YerlesimHesapla()
Dim ws As Worksheet
Dim son As Long, i As Long
Dim kenar As Double, dugme As Double
Dim gen As Double, yuk As Double
Set ws = ActiveSheet
kenar = 12 ' Kenar boşluğu
dugme = 30 ' Alttaki düğme için ayrılan yükseklik
son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To son
' Liste genişliği: iç genişlik eksi iki kenar boşluğu
gen = ws.Cells(i, 2).Value - 2 * kenar
' Liste yüksekliği: iç yükseklik eksi kenarlar ve düğme alanı
yuk = ws.Cells(i, 3).Value - 2 * kenar - dugme
' Negatif ya da çok küçük değerleri engelle
If gen < 100 Then gen = 100
If yuk < 60 Then yuk = 60
ws.Cells(i, 4).Value = gen
ws.Cells(i, 5).Value = yuk
' Düğmenin üst konumu: iç yükseklik eksi düğme ve alt boşluk
ws.Cells(i, 6).Value = ws.Cells(i, 3).Value - dugme - kenar
Next i
End Sub
UserForm_Resize
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Senaryo | İç Genişlik | İç Yükseklik | Liste Genişliği | Liste Yüksekliği | Düğme Üst |
| 2 | Küçük form | 240 | 180 | 216 | 126 | 138 |
| 3 | Varsayılan form | 400 | 300 | 376 | 246 | 258 |
| 4 | Geniş form | 640 | 360 | 616 | 306 | 318 |
| 5 | Büyük ekran | 1024 | 600 | 1000 | 546 | 558 |
| 6 | Çok dar form | 120 | 90 | 100 | 60 | 48 |
Yerleşim HesabıExcelDepo v1.0.0
2. Asgari form boyutunu koruma mantığı
Resize içinde formun çok küçülmesini engellemek için boyut, asgari değere çekilir. Burada bu mantığı standart modülde sınıyoruz: her satırda istenen boyut yazılıdır, makro asgari genişlik ve yüksekliği uygular, değer değiştiyse Durum sütununa Düzeltildi yazar. Kodu standart modüle yapıştırıp MinimumBoyutKontrol makrosunu çalıştırın.
VBA
38 satır
Option Explicit
Sub MinimumBoyutKontrol()
Const MIN_GEN As Double = 200
Const MIN_YUK As Double = 150
Dim ws As Worksheet
Dim son As Long, i As Long
Dim gen As Double, yuk As Double
Dim degisti As Boolean
Set ws = ActiveSheet
son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To son
gen = ws.Cells(i, 2).Value
yuk = ws.Cells(i, 3).Value
degisti = False
' Gerçek formda: If Me.Width < MIN_GEN Then Me.Width = MIN_GEN
If gen < MIN_GEN Then
gen = MIN_GEN
degisti = True
End If
If yuk < MIN_YUK Then
yuk = MIN_YUK
degisti = True
End If
ws.Cells(i, 4).Value = gen
ws.Cells(i, 5).Value = yuk
If degisti Then
ws.Cells(i, 6).Value = "Düzeltildi"
Else
ws.Cells(i, 6).Value = "Uygun"
End If
Next i
End Sub
UserForm_Resize
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Deneme | İstenen Genişlik | İstenen Yükseklik | Düzeltilen Genişlik | Düzeltilen Yükseklik | Durum |
| 2 | Küçültme denemesi | 150 | 100 | 200 | 150 | Düzeltildi |
| 3 | Dar form | 180 | 300 | 200 | 300 | Düzeltildi |
| 4 | Alçak form | 500 | 120 | 500 | 150 | Düzeltildi |
| 5 | Varsayılan form | 400 | 300 | 400 | 300 | Uygun |
| 6 | Geniş form | 800 | 500 | 800 | 500 | Uygun |
Boyut SınırıExcelDepo v1.0.0
3. Resize olaylı UserForm'u kodla oluşturma
UserForm'un kod modülü doğrudan örnek sayfaya yazılamadığından, bu örnek Resize olay kodunu içeren bir formu kodla oluşturan makroyu gösterir. Makro frmRapor adlı formu, bir ListBox ve bir düğmeyi ekler, ardından UserForm_Resize yordamını forma yazar. Bunun çalışması için Dosya > Seçenekler > Güvenlik Merkezi > Güvenlik Merkezi Ayarları > Makro Ayarları (File > Options > Trust Center > Trust Center Settings > Macro Settings) altında VBA proje nesne modeline erişime güven (Trust access to the VBA project object model) seçeneği açık olmalı ve çalışma kitabı makro destekli biçimde kaydedilmelidir. Kodu standart modüle yapıştırın; önce ResizeFormuKur, sonra FormuGoster makrosunu çalıştırın.
VBA
45 satır
Option Explicit
Sub ResizeFormuKur()
Dim frm As Object, lst As Object, btn As Object
Dim kod As String
' 3 = vbext_ct_MSForm (UserForm bileşeni)
Set frm = ThisWorkbook.VBProject.VBComponents.Add(3)
frm.Name = "frmRapor"
frm.Properties("Caption") = "Rapor"
frm.Properties("Width") = 320
frm.Properties("Height") = 240
Set lst = frm.Designer.Controls.Add("Forms.ListBox.1", "lstVeri", True)
lst.Left = 12
lst.Top = 12
lst.Width = 280
lst.Height = 170
Set btn = frm.Designer.Controls.Add("Forms.CommandButton.1", "cmdKapat", True)
btn.Caption = "Kapat"
btn.Left = 220
btn.Top = 190
btn.Width = 72
btn.Height = 24
' Forma yazılacak olay yordamı
kod = "Private Sub UserForm_Resize()" & vbCrLf
kod = kod & " If Me.InsideWidth < 200 Or Me.InsideHeight < 150 Then Exit Sub" & vbCrLf
kod = kod & " lstVeri.Width = Me.InsideWidth - 24" & vbCrLf
kod = kod & " lstVeri.Height = Me.InsideHeight - 60" & vbCrLf
kod = kod & " cmdKapat.Top = Me.InsideHeight - 36" & vbCrLf
kod = kod & " cmdKapat.Left = Me.InsideWidth - cmdKapat.Width - 12" & vbCrLf
kod = kod & "End Sub"
frm.CodeModule.AddFromString kod
End Sub
Sub FormuGoster()
Dim f As Object
Set f = VBA.UserForms.Add("frmRapor")
f.Show vbModeless
' Boyut kodla değişince Resize olayı çalışır
f.Width = 420
f.Height = 320
End Sub
UserForm_Resize
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Kontrol | Tür | Sol | Üst | Genişlik | Yükseklik |
| 2 | frmRapor | UserForm | 0 | 0 | 320 | 240 |
| 3 | lstVeri | ListBox | 12 | 12 | 280 | 170 |
| 4 | cmdKapat | CommandButton | 220 | 190 | 72 | 24 |
Form PlanıExcelDepo v1.0.0
Kullanırken dikkat edin
- Sonsuz özyinelemeye dikkat edin: Resize içinde formun Width ya da Height değerini koşulsuz değiştirirseniz her atama olayı yeniden tetikler ve sonsuz özyineleme oluşur. Boyutu yalnızca gerekli olduğunda, örneğin asgari değerin altına düşüldüğünde değiştirin; böylece ikinci çağrıda koşul sağlanmaz ve olay durur.
- InsideWidth ve InsideHeight kullanın: Kontrolleri yerleştirirken Me.Width yerine Me.InsideWidth ve Me.InsideHeight değerlerini temel alın. Dış boyut başlık çubuğunu ve kenarlıkları içerdiğinden hesaplarınız kontrolleri taşırabilir.
- Negatif boyut hatası: Kontrolün Width ya da Height özelliğine negatif değer atanırsa çalışma zamanı hatası alırsınız. Form küçüldüğünde işlem sonucu sıfırın altına düşebileceği için asgari boyut denetimi ekleyin ya da yordamı Exit Sub ile erken bitirin.
- Kontroller kendiliğinden boyutlanmaz: UserForm'larda Çalışma Sayfası'ndaki gibi otomatik bağlama (anchor) özelliği yoktur. Form büyüdüğünde kontroller yerinde kalır; yeniden konumlandırmayı Resize olayında kodla yapmanız gerekir.
- Kullanıcı formu sürükleyerek boyutlandıramaz: Standart UserForm kenarlarından sürüklenerek büyütülemez. Kullanıcıya bu olanağı vermek istiyorsanız ek yöntemler gerekir; bu yöntemler pencere işlevlerine bağlı olduğundan sürümler arasında farklı davranabilir. Yalnız kodla boyut değişecekse Resize yine tam olarak çalışır.
- Kodu sade tutun: Resize, boyut değiştikçe tekrar tekrar çalışabilir. Yordamın içinde ağır hesaplamalar, sayfa okuma ya da liste doldurma işlemleri yapmayın; yalnız konum ve boyut ayarlarını bırakın. Veri yüklemeyi UserForm_Initialize olayına taşıyın.
- İlgili konular: UserForm_Initialize, UserForm_Activate, UserForm_Layout, UserForm_QueryClose, Width ve Height özellikleri, InsideWidth ve InsideHeight özellikleri, Controls koleksiyonu, Me anahtar sözcüğü, Show yöntemi, Left ve Top özellikleri, Visual Basic Düzenleyicisi (Geliştirici > Visual Basic).