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.
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:
Bu kalıpta Cells ile okunan Value boş olduğunda koşul False olur ve döngü sona erer.
İki koşulun mantığı birbirinin tersidir: Do While x < 10 ile Do Until x >= 10 aynı sonucu verir. Hangisinin daha okunaklı olduğuna göre seçin.
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.
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.
İç 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.
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
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
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.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Adet | Birim Fiyat | Tutar |
| 2 | Klavye | 5 | 450,00 | 2.250,00 |
| 3 | Fare | 12 | 220,00 | 2.640,00 |
| 4 | Monitör | 3 | 4.800,00 | 14.400,00 |
| 5 | Kulaklık | 8 | 650,00 | 5.200,00 |
| 6 | Yazıcı | 2 | 3.200,00 | 6.400,00 |
| 7 | Toplam | 30.890,00 |
Satış ListesiExcelDepo v1.0.0
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.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ay | Satış | Kümülatif | Durum |
| 2 | Ocak | 12.000 | 12.000 | |
| 3 | Şubat | 9.500 | 21.500 | |
| 4 | Mart | 14.000 | 35.500 | |
| 5 | Nisan | 11.000 | 46.500 | |
| 6 | Mayıs | 15.500 | 62.000 | Hedef aşıldı |
| 7 | Haziran | 13.000 | ||
| 8 | Temmuz | 16.000 | ||
| 9 | Ağustos | 12.500 |
Aylık HedefExcelDepo v1.0.0
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.| A | B | C | |
|---|---|---|---|
| 1 | Ham Ad | Temiz Ad | Karakter Sayısı |
| 2 | Ayşe Yılmaz | Ayşe Yılmaz | 11 |
| 3 | Mehmet Demir | Mehmet Demir | 12 |
| 4 | Fatma Kaya | Fatma Kaya | 10 |
| 5 | Ali Can Öztürk | Ali Can Öztürk | 14 |
| 6 | Zeynep Şahin | Zeynep Şahin | 12 |
Ad TemizlemeExcelDepo v1.0.0
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