Özellik ikonu

With - End With

İndirme izni yok

Genel Bakış

With - End With (With...End With), bir nesne ya da kullanıcı tanımlı tür üzerinde art arda birçok işlem yaparken nesne başvurusunu her satırda yinelemeden, yalnız bir kez yazmanızı sağlayan VBA deyimidir. Kodu kısaltır, okunabilirliği artırır ve nesne ifadesi bir kez çözümlendiği için uzun başvuru zincirlerinde kodun daha hızlı çalışmasına yardımcı olur.

Söz dizimi​

Deyim, With satırıyla açılır, End With satırıyla kapatılır. Aradaki satırlarda nesneye ait üyelere, nesne adı yazılmadan yalnız başına bir nokta ile başvurulur:
VBA 4 satır
With nesne
    .Özellik = değer
    .Yöntem
End With
  • nesne: Zorunlu. Bir nesne, nesne değişkeni ya da kullanıcı tanımlı tür (Type) değişkeni; örneğin bir Range, Worksheet, Font nesnesi ya da Set ile atanmış bir değişken.
  • deyimler: İsteğe bağlı. Noktayla başlayan özellik atamaları, yöntem çağrıları ve nesneyle ilgisiz herhangi bir VBA deyimi (If, For, Select Case vb.). Varsayılan bir değeri yoktur.
  • End With: Zorunlu. Her With için bir End With yazılmalıdır; eksik olursa kod derlenmez.

Nasıl çalışır​

With satırındaki nesne ifadesi yalnız bir kez değerlendirilir ve blok bitene kadar bellekte tutulur. Bu nedenle With ActiveSheet.Range("A1:D1") gibi uzun bir başvuru, blok içinde her satırda yeniden hesaplanmaz.

Blok içinde noktayla başlayan her üye, bu nesneye aittir. Noktayı unutursanız VBA o adı ayrı bir değişken ya da genel bir nesne olarak yorumlar; bu da hataya ya da istenmeyen sonuca yol açar.

With bloğu başladıktan sonra, blok içinde nesne değişkenine başka bir nesne atamanız bloğun hedefini değiştirmez; blok ilk çözümlenen nesneyle çalışmayı sürdürür. Hedefi değiştirmek için bloğu kapatıp yeni bir With açın.

İç içe With ve sınırlar​

With blokları iç içe yazılabilir. Örneğin dıştaki blokta bir Range, içteki blokta o Range'in .Font ya da .Borders nesnesi kullanılabilir. İçteki blokta noktayla yazılan üyeler her zaman en içteki nesneye aittir; dıştaki nesnenin üyelerine erişmek için ona bir nesne değişkeni atayıp o değişkenin adıyla başvurmanız gerekir.

  • Giriş ve çıkış: GoTo ile bir With bloğunun içine atlanamaz; bloğu başından başlatmak gerekir.
  • Diğer yapılarla birlikte: With içinde If, For, For Each gibi yapılar kullanılabilir; yeter ki her yapı kendi bloğunu kapatsın ve End With bu yapıların dışında, doğru yerde yer alsın.
  • Kullanıcı tanımlı türler: Type ile tanımlanan değişkenlerin alanları da With ile doldurulabilir.

1. Başlık satırını biçimlendirme ve değer yazma​

Aşağıdaki kodu bir standart modüle yapıştırın (Alt+F11 ile VBA düzenleyicisini açın, Ekle > Modül). Makro, başlık satırını tek bir With bloğuyla biçimlendirir; ardından sayfa nesnesi üzerinde açılan ikinci bir With bloğuyla tutarı 1000 ve üzeri olan satırlara Sonuç sütununda etiket yazar.
VBA 27 satır
Option Explicit

Sub BaslikBicimle()
    Dim ws As Worksheet
    Dim i As Long

    Set ws = ActiveSheet

    ' Başlık satırı: tek başvuru, birden çok özellik
    With ws.Range("A1:D1")
        .Font.Bold = True
        .Font.Color = RGB(255, 255, 255)
        .Interior.Color = RGB(31, 78, 121)
        .HorizontalAlignment = xlCenter
    End With

    ' Sayfa nesnesiyle döngü: her satır için Sonuç sütununa etiket yaz
    With ws
        For i = 2 To 5
            If .Cells(i, 3).Value >= 1000 Then
                .Cells(i, 4).Value = "Yüksek"
            Else
                .Cells(i, 4).Value = "Normal"
            End If
        Next i
    End With
End Sub
With - End With
Formülünü incelemek için bir hücre seçin.
ABCD
1ÜrünBölgeTutarSonuç
2Klavyeİstanbul850,00Normal
3MonitörAnkara4.200,00Yüksek
4Fareİzmir320,00Normal
5YazıcıBursa2.750,00Yüksek
Satış RaporuExcelDepo v1.0.0
Makro çalıştıktan sonra A1:D1 başlık aralığı kalın, beyaz yazılı, koyu mavi dolgulu ve ortalanmış olur. Sonuç sütunundaki etiketler tutara göre yazılır: D2 hücresinde Normal, D3 hücresinde Yüksek, D4 hücresinde Normal, D5 hücresinde Yüksek görünür. Dört özellik ataması için aralık başvurusu yalnız bir kez yazılmıştır.

2. İç içe With ile aralığa formül ve biçim uygulama​

Kodu bir standart modüle yapıştırın. Makro, Yeni Maaş sütununun tamamına tek bir With bloğu içinde formül ve sayı biçimi uygular; yazı tipi ayarlarını ise iç içe ikinci bir With bloğuyla verir.
VBA 15 satır
Option Explicit

Sub YeniMaasHesapla()
    ' Dış blok: Yeni Maaş sütunu (E2:E6)
    With ActiveSheet.Range("E2:E6")
        .Formula = "=C2*(1+D2)"
        .NumberFormat = "#,##0.00"

        ' İç blok: aynı aralığın yazı tipi nesnesi
        With .Font
            .Bold = True
            .Color = RGB(0, 102, 0)
        End With
    End With
End Sub
With - End With
Formülünü incelemek için bir hücre seçin.
ABCDE
1PersonelDepartmanMaaşZam OranıYeni Maaş
2Ayşe YılmazMuhasebe18.500,006%19.610,00
3Mehmet DemirSatış21.000,008%22.680,00
4Zeynep Kayaİnsan Kaynakları19.250,005%20.212,50
5Can ÖztürkBilgi İşlem27.500,0010%30.250,00
6Elif ŞahinSatış20.400,007%21.828,00
Zam HesabıExcelDepo v1.0.0
Formül E2:E6 aralığına tek atamayla yazılır ve satırlara göre uyarlanır; E2 hücresinde 19.610,00, E3 hücresinde 22.680,00, E6 hücresinde 21.828,00 değeri görünür. İçteki With bloğunda noktayla yazılan Bold ve Color özellikleri, dıştaki Range'e değil onun Font nesnesine uygulanır.

3. Kullanıcı tanımlı türle With kullanımı​

Kodu bir standart modüle yapıştırın. Makro, Type ile tanımlanmış bir sipariş kaydının alanlarını With bloğuyla doldurur, ardından sonuçları sayfadaki Değer sütununa yazar. Type tanımı modülün en üstünde, yordamların dışında yer almalıdır.
VBA 27 satır
Option Explicit

' Kullanıcı tanımlı tür: modülün başında, yordamların dışında
Private Type Siparis
    Urun As String
    Adet As Long
    BirimFiyat As Double
End Type

Sub SiparisOzetiYaz()
    Dim s As Siparis

    ' Tür değişkeninin alanlarını With ile doldur
    With s
        .Urun = "Tablet"
        .Adet = 12
        .BirimFiyat = 3450.5
    End With

    ' Sonuçları sayfaya yaz
    With ActiveSheet
        .Range("B2").Value = s.Urun
        .Range("B3").Value = s.Adet
        .Range("B4").Value = s.BirimFiyat
        .Range("B5").Value = s.Adet * s.BirimFiyat
    End With
End Sub
With - End With
Formülünü incelemek için bir hücre seçin.
AB
1AlanDeğer
2ÜrünTablet
3Adet12
4Birim Fiyat3.450,50
5Tutar41.406,00
Sipariş ÖzetiExcelDepo v1.0.0
With bloğu, tür değişkeninin alanlarına s adını yinelemeden atama yapmayı sağlar. Makro sonunda B2 hücresinde Tablet, B3 hücresinde 12, B4 hücresinde 3.450,50 ve adet ile birim fiyatın çarpımı olan B5 hücresinde 41.406,00 görünür.

Kullanırken dikkat edin​

  • Noktayı unutmayın: Blok içinde üye adının başındaki nokta zorunludur. Noktayı yazmazsanız VBA o adı nesnenin üyesi olarak değil, ayrı bir değişken ya da genel bir nesne olarak ele alır; sonuçta hata alırsınız ya da kod başka bir nesneyi etkiler.
  • End With'i eksik bırakmayın: Her With için bir End With gerekir. Eksik ya da fazla End With, kodun derlenmesini engeller. Blok içindeki If ve For yapılarının kendi kapanış satırlarını yazdığınızdan emin olun.
  • Nesne yalnız bir kez çözümlenir: With satırındaki nesne blok boyunca sabittir. Blok içinde nesne değişkenine başka bir nesne atamak bloğun hedefini değiştirmez. Farklı bir nesneyle çalışmak için bloğu kapatıp yeni bir With açın.
  • İç içe bloklarda dış nesneye erişim: İçteki blokta noktayla başlayan üyeler yalnız en içteki nesneye aittir. Dıştaki nesnenin üyesine ihtiyaç duyarsanız dış nesneyi bir nesne değişkenine atayın ve değişkenin adıyla başvurun. Çok fazla iç içe blok kodu okumayı zorlaştırır; iki seviyeden fazlasını kullanmamaya çalışın.
  • GoTo ile bloğa girilmez: GoTo ya da GoSub ile With bloğunun ortasına atlanamaz. Bloğa her zaman With satırından girilmelidir.
  • İlgili konular:
    • Set deyimi ve nesne değişkenleri (Dim ... As Object / Range / Worksheet)
    • For Each - Next döngüsü
    • Range ve Cells nesneleri, Font ve Interior nesneleri
    • Type deyimi (kullanıcı tanımlı türler)
    • Application.ScreenUpdating özelliği
    • If - Then - Else ve Select Case deyimleri
Ö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
10
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst