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.
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.
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.
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.
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.
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.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Bölge | Tutar | Sonuç |
| 2 | Klavye | İstanbul | 850,00 | Normal |
| 3 | Monitör | Ankara | 4.200,00 | Yüksek |
| 4 | Fare | İzmir | 320,00 | Normal |
| 5 | Yazıcı | Bursa | 2.750,00 | Yüksek |
Satış RaporuExcelDepo v1.0.0
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.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Personel | Departman | Maaş | Zam Oranı | Yeni Maaş |
| 2 | Ayşe Yılmaz | Muhasebe | 18.500,00 | 6% | 19.610,00 |
| 3 | Mehmet Demir | Satış | 21.000,00 | 8% | 22.680,00 |
| 4 | Zeynep Kaya | İnsan Kaynakları | 19.250,00 | 5% | 20.212,50 |
| 5 | Can Öztürk | Bilgi İşlem | 27.500,00 | 10% | 30.250,00 |
| 6 | Elif Şahin | Satış | 20.400,00 | 7% | 21.828,00 |
Zam HesabıExcelDepo v1.0.0
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.| A | B | |
|---|---|---|
| 1 | Alan | Değer |
| 2 | Ürün | Tablet |
| 3 | Adet | 12 |
| 4 | Birim Fiyat | 3.450,50 |
| 5 | Tutar | 41.406,00 |
Sipariş ÖzetiExcelDepo v1.0.0
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