Özellik ikonu

Do While - Loop

İndirme izni yok

Genel Bakış

Do While - Loop (Do While...Loop), belirtilen koşul True olduğu sürece aradaki kod bloğunu yineleyen VBA döngü deyimidir. Koşul her turun başında denetlenir; ilk denetimde koşul False ise döngü gövdesi hiç çalışmaz. Kaç tur döneceği önceden bilinmeyen işlemlerde, örneğin ilk boş hücreye kadar ilerlerken kullanılır.

Söz dizimi​

Temel söz dizimi şöyledir:
VBA 5 satır
Do While koşul
    [deyimler]
    [Exit Do]
    [deyimler]
Loop
  • koşul: Zorunlu. True ya da False sonucu veren ifadedir. Karşılaştırma, mantıksal işleçler (And, Or, Not) ya da Boolean bir değişken olabilir. Sayısal ifadede 0 değeri False, diğer değerler True sayılır. Koşul Null ise False kabul edilir.
  • deyimler: İsteğe bağlı. Koşul True olduğu sürece tekrarlanacak bir ya da daha fazla deyimdir.
  • Exit Do: İsteğe bağlı. Döngüyü hemen bitirir ve Loop satırından sonraki deyimle devam eder. Gövdede birden çok kez yazılabilir; genellikle bir If bloğunun içinde kullanılır.

Döngü nasıl çalışır​

Her turun başında koşul denetlenir. Koşul True ise gövdedeki deyimler çalışır, Loop satırına gelince başa dönülür ve koşul yeniden sınanır. Koşul False olunca döngü biter. Koşul ilk denetimde False ise gövde bir kez bile çalışmaz.

Döngünün bitebilmesi için gövdede koşulu etkileyen bir şeyin değişmesi gerekir: satır sayacını bir artırmak, bir değişkeni güncellemek ya da hücre değerini değiştirmek gibi. Bunu unutursanız döngü sonsuza kadar sürer ve Excel yanıt vermez; bu durumda Esc ya da Ctrl + Break tuşlarıyla kodu durdurabilirsiniz.

En yaygın kullanım, ilk boş hücreye kadar satır satır ilerlemektir:
VBA 5 satır
satir = 2
Do While Cells(satir, 1).Value <> ""
    ' A sütunundaki dolu hücre için işlem yapın
    satir = satir + 1
Loop
Bu kalıpta Cells ile okunan Value boş olduğunda koşul False olur ve döngü sona erer.

Do Until ve Loop While ile farkı​

Do döngüsünün üç yaygın biçimi vardır. While koşul True olduğu sürece, Until ise koşul True olana kadar yinelemeyi sürdürür. Koşulu Loop satırına yazarsanız gövde en az bir kez çalışır.
VBA 14 satır
' 1) Koşul başta; True olduğu sürece döner
Do While koşul
    ' deyimler
Loop

' 2) Koşul başta; False olduğu sürece döner
Do Until koşul
    ' deyimler
Loop

' 3) Gövde en az bir kez çalışır; koşul sonda denetlenir
Do
    ' deyimler
Loop While koşul
İki koşulun mantığı birbirinin tersidir: Do While x &lt; 10 ile Do Until x &gt;= 10 aynı sonucu verir. Hangisinin daha okunaklı olduğuna göre seçin.

1. İlk boş satıra kadar tutar hesaplama​

Satış listesinde her ürünün tutarını (Adet x Birim Fiyat) hesaplayıp toplamı listenin altına yazmak istiyorsunuz. Visual Basic Düzenleyicisi'ni Alt + F11 ile açın, Ekle > Modül (Insert > Module) ile standart modül ekleyin ve kodu oraya yapıştırın. Ürün sayısı değişse de döngü A sütunundaki ilk boş hücrede durur.
VBA 21 satır
Option Explicit

Sub TutarlariHesapla()
    Dim ws As Worksheet
    Dim satir As Long
    Dim toplam As Double

    Set ws = Worksheets("Satış Listesi")
    satir = 2   ' Veriler 2. satırdan başlıyor

    ' A sütunu dolu olduğu sürece devam et
    Do 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   ' Sayacı artırmayı unutmayın
    Loop

    ' 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
Do While - Loop
Formülünü incelemek için bir hücre seçin.
ABCD
1ÜrünAdetBirim FiyatTutar
2Klavye5450,002.250,00
3Fare12220,002.640,00
4Monitör34.800,0014.400,00
5Kulaklık8650,005.200,00
6Yazıcı23.200,006.400,00
7Toplam30.890,00
Satış ListesiExcelDepo v1.0.0
Döngü, A sütununda veri olan her satırda Tutar hücresini doldurur; örneğin ilk ürün için D2 hücresine 2.250,00 yazılır. A7 hücresi boş olduğu için koşul False olur ve döngü sona erer. Döngüden sonra A7 hücresine Toplam metni, D7 hücresine genel toplam olan 30.890,00 değeri yazılır.

2. Exit Do ile hedefe ulaşınca durma​

Aylık satışları sırayla toplayıp kümülatif tutarı C sütununa yazacaksınız. Toplam 60.000 hedefine ulaşıldığı anda D sütununa bir not düşüp döngüyü Exit Do ile bitireceksiniz. Kodu standart modüle yapıştırın.
VBA 24 satır
Option Explicit

Sub HedefeUlasanAyiBul()
    Const HEDEF As Double = 60000
    Dim ws As Worksheet
    Dim satir As Long
    Dim toplam As Double

    Set ws = Worksheets("Aylık Hedef")
    satir = 2

    Do While ws.Cells(satir, 1).Value <> ""
        toplam = toplam + ws.Cells(satir, 2).Value
        ws.Cells(satir, 3).Value = toplam

        ' Hedefe ulaşıldıysa not düş ve döngüden çık
        If toplam >= HEDEF Then
            ws.Cells(satir, 4).Value = "Hedef aşıldı"
            Exit Do
        End If

        satir = satir + 1
    Loop
End Sub
Do While - Loop
Formülünü incelemek için bir hücre seçin.
ABCD
1AySatışKümülatifDurum
2Ocak12.00012.000
3Şubat9.50021.500
4Mart14.00035.500
5Nisan11.00046.500
6Mayıs15.50062.000Hedef aşıldı
7Haziran13.000
8Temmuz16.000
9Ağustos12.500
Aylık HedefExcelDepo v1.0.0
Makro her satırda kümülatif toplamı C sütununa yazar. Toplam hedefe ulaştığında ilgili satırın D hücresine Hedef aşıldı metni yazılır ve Exit Do döngüyü bitirir; o satırdaki kümülatif tutar 62.000 olur. Sonraki aylar için hesaplama yapılmaz, C ve D hücreleri boş kalır. Sütun A dolu olsa bile döngü koşulu beklemeden çıkıldığı için kalan satırlar işlenmez.

3. İç içe Do While ile fazla boşlukları temizleme​

Dışarıdan aktarılan ad listesinde sözcükler arasında birden fazla boşluk var. Dış döngü satırları, iç döngü ise çift boşluk kalmayana kadar temizliği yürütür; kaç tur gerekeceği baştan bilinmediği için Do While uygundur. Kodu standart modüle yapıştırın.
VBA 25 satır
Option Explicit

Sub AdlariTemizle()
    Dim ws As Worksheet
    Dim satir As Long
    Dim metin As String

    Set ws = Worksheets("Ad Temizleme")
    satir = 2

    ' Dış döngü: A sütunu dolu olduğu sürece satır satır ilerle
    Do While ws.Cells(satir, 1).Value <> ""
        ' Baştaki ve sondaki boşlukları at
        metin = Trim(ws.Cells(satir, 1).Value)

        ' İç döngü: metinde çift boşluk olduğu sürece tek boşluğa indir
        Do While InStr(metin, "  ") > 0
            metin = Replace(metin, "  ", " ")
        Loop

        ws.Cells(satir, 2).Value = metin
        ws.Cells(satir, 3).Value = Len(metin)
        satir = satir + 1
    Loop
End Sub
Do While - Loop
Formülünü incelemek için bir hücre seçin.
ABC
1Ham AdTemiz AdKarakter Sayısı
2Ayşe YılmazAyşe Yılmaz11
3 Mehmet Demir Mehmet Demir12
4Fatma KayaFatma Kaya10
5Ali Can ÖztürkAli Can Öztürk14
6Zeynep ŞahinZeynep Şahin12
Ad TemizlemeExcelDepo v1.0.0
İç döngü her turda çift boşlukları tek boşluğa indirir ve çift boşluk kalmayınca durur. Temizlenmiş ad B sütununa, karakter sayısı C sütununa yazılır; örneğin ilk satır için Ayşe Yılmaz ve 11. İkinci satırdaki baş ve son boşluklar Trim ile atıldığı için Mehmet Demir sonucu elde edilir. VBA'daki Trim yalnızca baştaki ve sondaki boşlukları kaldırır, sözcükler arasındakileri kaldırmaz; bu yüzden iç döngüye ihtiyaç vardır.

Kullanırken dikkat edin​

  • Sayaç güncellemeyi unutmayın: Gövdede satır sayacını artırmayı ya da koşulu etkileyen değişkeni değiştirmeyi unutursanız döngü hiç bitmez ve Excel donmuş gibi görünür. Kodu durdurmak için Esc ya da Ctrl + Break tuşlarını kullanın. Bunu önlemek için döngü koşuluna ek bir üst sınır koymak iyi bir alışkanlıktır; örneğin satır numarasının son satırı aşmamasını da koşula ekleyin.
  • Boş hücre ile boşluk içeren hücre aynı değildir: Hücre görünüşte boş olsa da içinde bir boşluk karakteri varsa karşılaştırma boş sayılmaz ve döngü beklenenden uzun sürer. Gerekirse hücre değerini Trim ile temizleyerek denetleyin ya da Len ile uzunluğa bakın.
  • Hata değerli hücreler karşılaştırmada sorun çıkarır: Hücrede #N/A gibi bir hata değeri varsa hücre değerini bir metinle karşılaştırmak 'Type mismatch' (Tür uyuşmazlığı) hatası verir. Veride formül hataları olabilirse önce IsError ile denetleyin.
  • Exit Do yalnızca içinde bulunduğu döngüyü bitirir: İç içe döngülerde Exit Do sadece en içteki Do döngüsünden çıkar. Dış döngüyü de bitirmek için bir Boolean bayrak değişkeni kullanın ya da döngüyü bir yordama taşıyıp Exit Sub veya Exit Function ile çıkın.
  • Koşul başta mı, sonda mı: Gövdenin en az bir kez çalışması gerekiyorsa koşulu sonda denetleyen Do ... Loop While biçimini seçin. Koşul tersten daha doğal ifade ediliyorsa Do Until kullanabilirsiniz. Eski kodlarda gördüğünüz While ... Wend döngüsü de aynı işi yapar, ancak Exit ile erken çıkış desteklemediği için yeni kodda Do While tercih edilir.
  • Hız için ipuçları: Binlerce satırı hücre hücre dolaşırken kodun başında Application.ScreenUpdating özelliğini False yapın ve işiniz bitince True'ya döndürün. Çok büyük veride hücreleri tek tek okumak yerine aralığı bir diziye alıp dizi üzerinde döngü kurmak çok daha hızlıdır.
  • İlgili konular:
    • Do Until - Loop: koşul True olana kadar yineleyen döngü
    • Do - Loop While: gövdeyi en az bir kez çalıştıran döngü
    • For - Next: tur sayısı bilindiğinde kullanılan döngü
    • For Each - Next: koleksiyon ve aralık hücreleri üzerinde döngü
    • While - Wend: eski tip koşullu döngü
    • Exit Do: döngüden erken çıkış
    • If - Then - Else: koşullu işlem deyimi
    • Range.End(xlUp): son dolu satırı bulma
    • Application.ScreenUpdating: ekran güncellemesini kapatarak hız kazanma
    • EBOŞSA ve UZUNLUK: hücrenin boş olup olmadığını denetlemekte kullanılan çalışma sayfası işlevleri
Ö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
4
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst