Özellik ikonu

While - Wend

İndirme izni yok

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.

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.
ABCD
1ÜrünAdetBirim FiyatTutar
2Kalem1208,501.020,00
3Defter4532,001.440,00
4Dosya6015,75945,00
5Zımba1864,901.168,20
6Klasör3022,40672,00
7Toplam5.245,20
Satış ListesiExcelDepo v1.0.0
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.

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.
ABCDE
1Başlangıç TutarıYıllık FaizHedef TutarYıl SayısıUlaşılan Tutar
210.000,006%20.000,001220.121,96
Birikim HedefiExcelDepo v1.0.0
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.

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.
AB
1SayıFaktöriyel
236
3424
45120
56720
675.040
7103.628.800
FaktöriyelExcelDepo v1.0.0
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.

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.
Ö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
8
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst