Genel Bakış
While - Wend (While...Wend), koşul True olduğu sürece aradaki deyimleri tekrar tekrar çalıştıran VBA döngü deyimidir. Kaç kez döneceğini önceden bilmediğiniz işlerde, örneğin boş bir hücreye ya da hedef değere ulaşana kadar satır satır ilerlemek için kullanılır. Yapısı basittir, ancak Do While...Loop kadar esnek değildir.
Bu nedenle gövdede koşulu etkileyen bir değişkeni değiştirmeniz gerekir (sayaç artırmak, bir sonraki satıra geçmek gibi). Aksi halde döngü hiç bitmez ve Excel yanıt vermez duruma gelir. Böyle bir durumda Ctrl + Break tuşlarıyla kodu durdurabilirsiniz.
İç içe kullanım mümkündür. Her Wend, kendisinden önceki en yakın eşleşmemiş While ile eşleşir.
Makro her ürün satırı için tutarı hesapladı; ilk satırın tutarı 1.020,00, son ürünün tutarı 672,00 oldu. A7 hücresi makro çalışmadan önce boş olduğu için döngü orada durdu; genel toplam bu satırdaki D7 hücresine 5.245,20 olarak yazıldı. Satır sayısı değişse bile kod değiştirmeden çalışır.
Makro, tutar hedefe erişene kadar her turda faiz ekledi. Gereken yıl sayısı 12, bu yılın sonunda ulaşılan tutar 20.121,96 olarak D2 ve E2 hücrelerine yazıldı. Koşuldaki And yil < 100 ifadesi güvenlik sınırıdır; döngünün bitmesini garanti eder.
Her Wend kendisine en yakın While ile eşleşti: içteki çarpım döngüsünü bitirir, dıştaki ise bir sonraki satıra geçer. İlk satırın sonucu 6, son satırın sonucu 3.628.800 oldu. Her sayı için sonuç değişkeninin 1'e, sayacın 2'ye yeniden atanması önemlidir; bu atamalar iç döngünün önünde, dış döngünün içinde yapılır.
Söz dizimi
Döngü While ile başlar, Wend ile biter:
VBA
3 satır
While koşul
[deyimler]
Wend
- koşul: Zorunlu. Sonucu True ya da False olan sayısal veya mantıksal ifade. Sonuç Null ise False sayılır. Sıfırdan farklı sayısal değer True kabul edilir.
- deyimler: İsteğe bağlı. Koşul True olduğu sürece her turda çalışan bir ya da daha fazla deyim.
Nasıl çalışır
Excel önce koşulu denetler. Koşul True ise döngü gövdesini çalıştırır, Wend satırına gelince koşula geri döner. Koşul False olduğunda döngüden çıkar ve Wend satırından sonraki deyimle devam eder. Koşul ilk denetimde False ise gövde hiç çalışmaz.Bu nedenle gövdede koşulu etkileyen bir değişkeni değiştirmeniz gerekir (sayaç artırmak, bir sonraki satıra geçmek gibi). Aksi halde döngü hiç bitmez ve Excel yanıt vermez duruma gelir. Böyle bir durumda Ctrl + Break tuşlarıyla kodu durdurabilirsiniz.
İç içe kullanım mümkündür. Her Wend, kendisinden önceki en yakın eşleşmemiş While ile eşleşir.
While - Wend ile Do While arasındaki fark
- Çıkış: While - Wend döngüsünü ortasından terk eden bir Exit While deyimi yoktur. Erken çıkmanız gerekiyorsa Do While...Loop ile Exit Do ya da For...Next ile Exit For kullanın.
- Koşul yeri: While - Wend koşulu her zaman başta denetler. Do...Loop While biçimiyle koşulu sonda denetleyip gövdeyi en az bir kez çalıştırabilirsiniz.
- Tercih: Microsoft, yeni kodlarda daha esnek olduğu için Do...Loop yapısını önerir. While - Wend ise eski kodlarda sık görülür ve çalışmaya devam eder.
1. Boş hücreye kadar satırları işleme
Ürün listesinin kaç satır olduğunu bilmiyorsunuz. Makro, A sütunu boş olana kadar ilerleyip her satırın tutarını (adet x birim fiyat) D sütununa yazar, sonra son satıra genel toplamı ekler. Kodu Alt + F11 ile açtığınız Visual Basic Düzenleyicisi'nde Ekle > Modül (Insert > Module) ile eklediğiniz standart modüle yapıştırın.
VBA
21 satır
Option Explicit
Sub TutarHesapla()
Dim ws As Worksheet
Dim satir As Long
Dim toplam As Double
Set ws = ActiveSheet
satir = 2 ' Veri 2. satırdan başlar
' A sütunu boş olmadığı sürece devam et
While ws.Cells(satir, 1).Value <> ""
ws.Cells(satir, 4).Value = ws.Cells(satir, 2).Value * ws.Cells(satir, 3).Value
toplam = toplam + ws.Cells(satir, 4).Value
satir = satir + 1 ' Sonraki satıra geç (döngüyü bitiren adım)
Wend
' Döngü bittiğinde satir ilk boş satırı gösterir
ws.Cells(satir, 1).Value = "Toplam"
ws.Cells(satir, 4).Value = toplam
End Sub
While - Wend
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Adet | Birim Fiyat | Tutar |
| 2 | Kalem | 120 | 8,50 | 1.020,00 |
| 3 | Defter | 45 | 32,00 | 1.440,00 |
| 4 | Dosya | 60 | 15,75 | 945,00 |
| 5 | Zımba | 18 | 64,90 | 1.168,20 |
| 6 | Klasör | 30 | 22,40 | 672,00 |
| 7 | Toplam | 5.245,20 |
Satış ListesiExcelDepo v1.0.0
2. Hedefe ulaşana kadar yinelemek
Bir birikimin yıllık faizle kaç yılda hedef tutara ulaşacağını bulmak istiyorsunuz. Yıl sayısı önceden bilinmediği için While - Wend uygundur. Koşulun içine yıl sınırı da eklenmiştir; böylece faiz sıfır girilse bile döngü sonsuza gitmez. Kodu standart modüle yapıştırın.
VBA
24 satır
Option Explicit
Sub HedefeUlas()
Dim ws As Worksheet
Dim tutar As Double
Dim faiz As Double
Dim hedef As Double
Dim yil As Long
Set ws = ActiveSheet
tutar = ws.Range("A2").Value
faiz = ws.Range("B2").Value
hedef = ws.Range("C2").Value
yil = 0
' Hedefe ulaşılmadıkça ve 100 yılı aşmadıkça devam et
While tutar < hedef And yil < 100
tutar = tutar * (1 + faiz) ' Yıllık faiz ekle
yil = yil + 1
Wend
ws.Range("D2").Value = yil
ws.Range("E2").Value = tutar
End Sub
While - Wend
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Başlangıç Tutarı | Yıllık Faiz | Hedef Tutar | Yıl Sayısı | Ulaşılan Tutar |
| 2 | 10.000,00 | 6% | 20.000,00 | 12 | 20.121,96 |
Birikim HedefiExcelDepo v1.0.0
3. İç içe While - Wend ile faktöriyel
Dış döngü A sütunundaki sayıları satır satır dolaşır, iç döngü her sayı için 2'den o sayıya kadar çarpım yapar. Sonuç B sütununa yazılır. Kodu standart modüle yapıştırın.
VBA
26 satır
Option Explicit
Sub FaktoriyelYaz()
Dim ws As Worksheet
Dim satir As Long
Dim sayac As Long
Dim sonuc As Double
Set ws = ActiveSheet
satir = 2
' Dış döngü: A sütunu dolu olduğu sürece
While ws.Cells(satir, 1).Value <> ""
sonuc = 1
sayac = 2
' İç döngü: 2'den sayıya kadar çarp
While sayac <= ws.Cells(satir, 1).Value
sonuc = sonuc * sayac
sayac = sayac + 1
Wend
ws.Cells(satir, 2).Value = sonuc
satir = satir + 1
Wend
End Sub
While - Wend
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Sayı | Faktöriyel |
| 2 | 3 | 6 |
| 3 | 4 | 24 |
| 4 | 5 | 120 |
| 5 | 6 | 720 |
| 6 | 7 | 5.040 |
| 7 | 10 | 3.628.800 |
FaktöriyelExcelDepo v1.0.0
Kullanırken dikkat edin
- Sayaç ya da ilerleme deyimini unutmayın: Gövdede koşulu değiştiren bir deyim yoksa (satır numarasını artırmak gibi) döngü sonsuza kadar sürer. Böyle bir durumda Ctrl + Break tuşlarıyla kodu durdurun; bunun için kodu kaydetmiş olmanız iyi olur.
- Exit While diye bir deyim yoktur: While - Wend döngüsünden erken çıkmak için özel bir deyim bulunmaz. Çıkış gerekiyorsa koşula ek bir mantıksal değişken katın ya da Do While...Loop ile Exit Do kullanın.
- Boş hücre denetimi: Hücre değerini <> "" ile karşılaştırmak, boş hücrede doğru çalışır. Ancak formülle boş metin üreten hücreler de boş sayılır; verinin gerçekten bittiğinden emin olmak için sütunu bu açıdan gözden geçirin.
- Büyük veride hız: Hücrelere tek tek yazmak yavaştır. Çok satırlı işlerde Application.ScreenUpdating = False kullanmayı ya da verileri bir diziye alıp topluca yazmayı düşünün.
- İlgili konular:
- Do While...Loop: Koşulu başta denetleyen, Exit Do destekleyen döngü.
- Do...Loop While: Koşulu sonda denetleyen, gövdeyi en az bir kez çalıştıran döngü.
- For...Next: Tekrar sayısı belli olan döngü.
- For Each...Next: Koleksiyondaki her nesne için çalışan döngü.
- If...Then...Else: Koşullu çalıştırma deyimi.
- Exit For, Exit Do: Döngüleri erken terk eden deyimler.