VBA'da For Next ve Do While döngüleri nasıl yazılır, hangisi ne zaman seçilir
Beceri rehberi

VBA'da For Next ve Do While döngüleri nasıl yazılır, hangisi ne zaman seçilir

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

Excel VBA'da For Next, Do While ve For Each döngülerini kod örnekleri, geriye doğru satır silme ve sık hatalarla öğrenin.

Döngü neden gerekir?

Excel'de aynı işlemi çok sayıda satıra uygulamak gerektiğinde makro yazmanın asıl gücü döngülerdedir. Bir döngü, aynı kod bloğunu belirli sayıda ya da bir koşul sürdükçe tekrar çalıştırır. Satır satır dolaşıp değer kontrol etmek, her sayfada aynı biçimlendirmeyi uygulamak, bir listeyi tek tek işlemek bunun tipik örnekleridir.

VBA'da döngüler ana ailelere ayrılır. For Next, kaç kez dönüleceği önceden belli olduğunda kullanılır. Do While ve Do Until ise ne kadar döneceği baştan bilinmediğinde, bir koşul değişene kadar çalışır. Bunlara ek olarak, bir koleksiyonun her elemanını gezmek için For Each yapısı bulunur.

For Next döngüsü: sayaçla tekrar

Microsoft'un sözdizimi tanımına göre For Next, bir sayaç değişkeninin başlangıçtan bitişe kadar ilerlemesiyle çalışır. Step belirtilmezse sayaç her turda bir artar. Örneğin bir sütundaki sayıları toplayan döngü:

Dim ws As Worksheet Dim satir As Long Dim sonSatir As Long Dim toplam As Double Set ws = ThisWorkbook.Worksheets("Satislar") sonSatir = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row For satir = 1 To sonSatir If IsNumeric(ws.Cells(satir, "C").Value) Then toplam = toplam + ws.Cells(satir, "C").Value End If Next satir

Burada IsNumeric kontrolü başlık gibi sayı olmayan hücreleri atlatır. Sayacın her turda artması otomatiktir; Microsoft belgesi, döngü içinde sayacın değerini elle değiştirmenin kodu okumayı ve hata ayıklamayı zorlaştırdığını belirtir, bu yüzden sayacı yalnızca okuyun.

Koşul sağlanınca döngüden çıkmak için Exit For kullanılır. Örneğin aradığınız kaydı bulduğunuz anda kalan satırları taramanın anlamı yoktur; Exit For ile döngüyü erkenden bitirirsiniz.

Geriye doğru döngü: satır silerken Step

Satır silerken döngüyü yukarıdan aşağı çalıştırmak klasik bir hatadır. Bir satırı sildiğinizde altındaki satırlar yukarı kayar, sayaç ise bir sonraki sıraya geçer; sonuçta bazı satırlar atlanır. Çözüm döngüyü sondan başa çalıştırmaktır. Belgedeki tanıma göre Step değeri negatif olursa sayaç her turda azalır ve döngü sayaç bitiş değerine eşit ya da büyük kaldıkça sürer:

For satir = sonSatir To 1 Step -1 If ws.Cells(satir, "A").Value = "" Then ws.Rows(satir).Delete End If Next satir

Bu döngü A sütunu boş olan tüm satırları siler. Geriye doğru çalıştığı için silinen satırın altındaki, henüz işlenmemiş satırlar etkilenmez.

Do While ve Do Until: koşul sürdükçe tekrar

Veri uzunluğu bilinmiyorsa ya da bir koşul değişene kadar işlem sürecekse Do döngüsü uygundur. Do While, koşul doğru olduğu sürece; Do Until, koşul doğru olana kadar çalışır. İkisi de aynı işi ters mantıkla yapar, hangisi cümleyi daha doğal kuruyorsa onu seçin.

satir = 1 Do While Not IsEmpty(ws.Cells(satir, "A").Value) ws.Cells(satir, "B").Value = UCase(ws.Cells(satir, "A").Value) satir = satir + 1 Loop

Bu kod A sütunu dolu olduğu sürece her hücrenin büyük harfli halini B sütununa yazar. Koşul döngünün başında kontrol edilirse veri hiç yoksa döngü hiç çalışmaz. Koşulu sona almak için Loop satırına While ya da Until ekleyebilirsiniz; bu durumda blok en az bir kez çalışır.

Do döngüsünde sayacı artırmak sizin sorumluluğunuzdadır. Yukarıdaki örnekte satir artırılmazsa koşul hiç değişmez ve döngü sonsuza kadar sürer.

For Each ile koleksiyonları gezmek

Bir aralıktaki hücreleri, çalışma kitabındaki sayfaları ya da bir formun denetimlerini sırayla işlemek için For Each tercih edilir. Sayaç ve bitiş değeri tutmanız gerekmez, VBA elemanları tek tek verir. Microsoft belgesi, kullanıcı formundaki tüm denetimleri bu yapıyla gezen bir örnek içerir.

Dim sayfa As Worksheet For Each sayfa In ThisWorkbook.Worksheets sayfa.UsedRange.Font.Name = "Calibri" Next sayfa

Bu kod çalışma kitabındaki her sayfadaki kullanılan alanın yazı tipini aynı yapar. Sayfa sayısı değişse de kod değişmez. Aynı yapı, filtre uygulanmış bir tablonun görünür hücrelerini ya da bir listedeki dosya adlarını işlemek için de kullanılır.

Hız: döngüyü yavaşlatan alışkanlıklar

Çok satırlı veride hücreye tek tek erişmek yavaştır, çünkü her erişim Excel ile VBA arasında bir geçiş demektir. Birkaç alışkanlık hızı belirgin biçimde artırır: • Select ve Activate kullanmayın; hücreye doğrudan başvurun. • Döngü boyunca Application.ScreenUpdating değerini kapatın, bittiğinde açın. • Çok büyük aralıklarda aralığı bir kerede bir diziye alıp diziyi döngüyle işleyin, sonucu tek hamlede sayfaya yazın.

Bu son yöntem en çok kazandıranıdır ama kodu biraz karmaşıklaştırır. Önce basit döngüyü yazıp doğruluğunu sınayın; yavaşlık gerçekten sorun olursa diziye geçin.

Sık yapılan hatalar

  • Sonsuz döngü: Do While içinde koşulu değiştirmeyi unutmak. Makro takılırsa Esc ya da Ctrl+Break ile durdurmayı deneyin; olmazsa Excel'i kapatmak gerekebilir ve kaydedilmemiş iş kaybolur. Çalıştırmadan önce dosyayı kaydedin.
  • Satırı ileri yönde silmek: yukarıda anlatılan atlama hatası.
  • İç içe döngülerde aynı sayaç adını kullanmak: Microsoft belgesi, her döngüye ayrı sayaç adı verilmesini ister; satır için satir, sütun için sutun gibi ayırın.
  • Son satırı sabit yazmak: veri uzayınca döngü eksik çalışır; son satırı End özelliğiyle hesaplayın.
  • Döngü içinde ağır işlem yapmak: her turda aynı hesabı yeniden yapıyorsanız onu döngü dışına alın.

Hangi döngüyü seçeceğinizi şöyle karar verin: satır sayısı biliniyorsa For Next, koşula bağlıysa Do While ya da Until, koleksiyon geziyorsanız For Each.

Bu becerinin Mindset programlarındaki yeri

Mindset'in Excel Makroları ve VBA Temelleri programında VBA Diline Giriş ve Veri İşleme Makroları modülleri bu konunun pratik karşılığıdır. Program, veri temizleme, satır bazlı kontrol ve toplu düzenleme işlerini elle yapan finans, satış operasyonu ve raporlama ekipleri için uygundur.

İlgili Mindset programı

Excel Makroları ve VBA Temelleri

Sık sorulanlar

Sık sorulan sorular

For Next ile Do While arasındaki temel fark nedir?

For Next, kaç kez dönüleceği baştan belli olduğunda sayaçla çalışır. Do While ise bir koşul doğru olduğu sürece döner ve süre önceden bilinmeyebilir. Veri uzunluğunu hesaplayabiliyorsanız For Next, boş hücreye kadar ilerleyecekseniz Do While kullanmak okunabilirliği artırır.

Döngüden erken çıkmak mümkün mü?

Evet. For Next ve For Each döngülerinde Exit For, Do döngülerinde Exit Do kullanılır. Genellikle bir koşul sağlandığında, örneğin aranan kayıt bulunduğunda çağrılır. Böylece kalan satırların gereksiz yere taranması önlenir ve makro hızlanır.

Döngü içinde satır silerken neden satırlar atlanıyor?

Bir satırı sildiğinizde altındaki satırlar yukarı kayar, sayaç ise bir sonrakine geçer. Bu yüzden silinen satırın yerine gelen satır işlenmeden kalır. Çözüm, döngüyü son satırdan ilk satıra doğru negatif adımla çalıştırmaktır.

Makro sonsuz döngüye girdi, ne yapmalıyım?

Önce Esc ya da Ctrl+Break tuşlarını deneyin. Yanıt vermiyorsa Excel'i kapatmak zorunda kalabilirsiniz ve kaydedilmemiş değişiklikler kaybolur. Önlem olarak yeni yazdığınız döngüyü çalıştırmadan önce dosyayı kaydedin ve Do döngülerinde sayacı artırdığınızdan emin olun.

For Each ne zaman For Next'ten daha uygundur?

Sayaç tutmak istemediğiniz, koleksiyonun her elemanına aynı işlemi uygulayacağınız durumlarda. Sayfaları, denetimleri ya da bir aralığın hücrelerini gezmek bunun örnekleridir. Sıra numarasına ihtiyacınız varsa ya da geriye doğru gidecekseniz For Next gerekir.

Excel VBA Döngüleri: For Next ve Do While Örnekleri