Özellik ikonu

UserForm_Resize

İndirme izni yok

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.

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.
Yordamın adı form nesnesinin adına değil, her zaman UserForm_Resize biçimine bağlıdır. Kod penceresinin üstündeki nesne listesinden UserForm, olay listesinden Resize seçilirse Excel iskeleti kendisi oluşturur.

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.
Width ve Height başlık çubuğu ile kenarlıkları da içerir. Kontrolleri yerleştirirken kullanılabilir iç alanı veren InsideWidth ve InsideHeight özelliklerini tercih edin.

Ö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.
Kontrol boyutu negatif olamaz. Form çok küçüldüğünde InsideWidth - 24 gibi bir işlem eksiye düşebilir ve çalışma zamanı hatası verir; bu yüzden asgari değer denetimi ekleyin.

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.
ABCDEF
1Senaryoİç Genişlikİç YükseklikListe GenişliğiListe YüksekliğiDüğme Üst
2Küçük form240180216126138
3Varsayılan form400300376246258
4Geniş form640360616306318
5Büyük ekran10246001000546558
6Çok dar form120901006048
Yerleşim HesabıExcelDepo v1.0.0
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.

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.
ABCDEF
1Denemeİstenen Genişlikİstenen YükseklikDüzeltilen GenişlikDüzeltilen YükseklikDurum
2Küçültme denemesi150100200150Düzeltildi
3Dar form180300200300Düzeltildi
4Alçak form500120500150Düzeltildi
5Varsayılan form400300400300Uygun
6Geniş form800500800500Uygun
Boyut SınırıExcelDepo v1.0.0
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.

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.
ABCDEF
1KontrolTürSolÜstGenişlikYükseklik
2frmRaporUserForm00320240
3lstVeriListBox1212280170
4cmdKapatCommandButton2201907224
Form PlanıExcelDepo v1.0.0
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.

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).
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
9
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst