Excel VBA Döngüleri - Her Biri İçin, Sonraki İçin, Yaparken, İç İçe ve Daha Fazlası

VBA'da etkili bir şekilde çalışmak için Döngüleri anlamalısınız.

Döngüler, bir kod bloğunu belirli sayıda tekrarlamanıza veya bir nesne kümesindeki her bir nesnede bir kod bloğunu tekrarlamanıza izin verir.

İlk önce size döngülerin neler yapabileceğini göstermek için birkaç örnek göstereceğiz. O zaman size döngüler hakkında her şeyi öğreteceğiz.

VBA Döngüsü Hızlı Örnekleri

Her Döngü İçin

Her Döngü için, çalışma kitabındaki her çalışma sayfası veya bir aralıktaki her hücre gibi bir koleksiyondaki her nesne arasında döngü yapın.

Çalışma Kitabındaki Tüm Çalışma Sayfalarında Döngü

Bu kod, çalışma kitabındaki tüm çalışma sayfalarında dolaşarak her bir sayfayı gösterir:

12345678 Alt LoopThroughSheets()Dim ws As Çalışma SayfasıÇalışma Sayfalarında Her ws içinws.Visible = DoğruSonrakiAlt Bitiş

Aralıktaki Tüm Hücrelerde Döngü

Bu kod, hücre değerinin negatif, pozitif veya sıfır olup olmadığını test ederek bir dizi hücre arasında dolaşacaktır:

1234567891011121314 Alt If_Loop()Aralık olarak Hücreyi KarartAralıktaki Her Hücre İçin("A2:A6")Cell.Value > 0 iseCell.Offset(0, 1).Value = "Pozitif"ElseIf Cell.Value < 0 O zamanCell.Offset(0, 1).Value = "Negatif"BaşkaCell.Offset(0, 1).Value = "Sıfır"BitirSonraki HücreAlt Bitiş

Sonraki Döngüler İçin

Başka bir “For” Döngüsü türü, For Next Döngüsü'dür. For Next Döngüsü, tamsayılar arasında döngü yapmanızı sağlar.

Bu kod, 1'den 10'a kadar olan tamsayılar arasında dolaşacak ve her birini bir mesaj kutusuyla görüntüleyecektir:

123456 Alt ForLoop()Dim i Tamsayı Olaraki = 1 ila 10 içinMsgBox isonraki benAlt Bitiş

Döngüler Yaparken

Do while Döngüleri, bir koşul karşılandığında döngüye girer. Bu kod ayrıca 1'den 10'a kadar olan tamsayılar arasında dolaşarak her birini bir mesaj kutusuyla görüntüler.

12345678 Alt DoWhileLoop()Tamsayı Olarak Dim nn = 1n < 11 iken yapMesaj Kutusu nn = n + 1DöngüAlt Bitiş

Döngülere Kadar Yap

Tersine, Do Kadar Döngüler bir koşul karşılanana kadar döngüye girer. Bu kod, önceki iki örnekle aynı şeyi yapar.

12345678 Alt DoUntilLoop()Tamsayı Olarak Dim nn = 1n >= 10'a Kadar YapınMesaj Kutusu nn = n + 1DöngüAlt Bitiş

Bunu aşağıda tartışacağız, ancak hiç bitmeyen bir döngü oluşturmamak için Do While veya Do Bitti döngüleri oluştururken son derece dikkatli olmanız gerekir.

VBA Döngü Oluşturucu

Bu, Premium VBA Eklentimizden "Döngü Oluşturucu"nun ekran görüntüsü: AutoMacro. Döngü Oluşturucu, farklı nesneler veya sayılar arasında döngü oluşturmak için hızlı ve kolay bir şekilde döngüler oluşturmanıza olanak tanır. Her nesne üzerinde eylemler gerçekleştirebilir ve/veya yalnızca belirli kriterleri karşılayan nesneleri seçebilirsiniz.

Eklenti ayrıca birçok başka kod oluşturucu, kapsamlı bir VBA kod kitaplığı ve çeşitli kodlama araçları içerir. Herhangi bir VBA geliştiricisi için bir zorunluluktur.

Şimdi farklı döngü türlerini derinlemesine ele alacağız.

Sonraki Döngü İçin VBA

Döngü Sözdizimi için

For Next Döngüsü, bir kod bloğunu belirli sayıda tekrarlamanıza izin verir. Sözdizimi:

12345 [Tamsayı olarak Sayacı Karart]Sayaç için = Baştan Sona [Adım Değeri][Bir şey yap]Sonraki [Sayaç]

Parantez içindeki öğelerin isteğe bağlı olduğu yerler.

  • [Sayacı Uzun Olarak Karart] - Sayaç değişkenini bildirir. Modülünüzün en üstünde Option Explicit bildirilmişse gereklidir.
  • Tezgah - Saymak için kullanılan bir tamsayı değişkeni
  • Başlangıç - Başlangıç ​​değeri (Ör. 1)
  • Son - Bitiş değeri (Ör. 10)
  • [Adım Değeri] - Her 1 tam sayı yerine her n tam sayıyı saymanızı sağlar. Negatif bir değerle geri de gidebilirsiniz (ör. Adım -1)
  • [Bir şey yap] - Tekrar edecek kod
  • Sonraki [Sayaç] - Bir Sonraki Döngü İçin Kapanış Açıklaması. Sayacı dahil edebilir veya etmeyebilirsiniz. Ancak, kodunuzun okunmasını kolaylaştırdığı için sayacı dahil etmenizi şiddetle tavsiye ederim.

Bu kafa karıştırıcıysa, endişelenme. Bazı örnekleri gözden geçireceğiz:

10'a kadar say

Bu kod, For-Next Döngüsü kullanılarak 10'a kadar sayılacaktır:

12345678 Alt ForEach_CountTo10()Tamsayı Olarak Dim nn = 1 ila 10 içinMesaj Kutusu nsonraki nAlt Bitiş

Döngü Adımı için

10'a Kadar Say - Sadece Çift Sayılar

Bu kod yalnızca çift sayıları sayarak 10'a kadar sayılacaktır:

12345678 Alt ForEach_CountTo10_Even()Tamsayı Olarak Dim nn = 2 ila 10 için Adım 2Mesaj Kutusu nsonraki nAlt Bitiş

“Adım 2”yi eklediğimize dikkat edin. Bu, For Loop'a sayaç boyunca 2 adım atmasını söyler. Tersine adım atmak için negatif bir adım değeri de kullanabiliriz:

Döngü Adımı için - Ters

10'dan geri sayım

Bu kod 10'dan geri sayım yapacak:

123456789 Alt ForEach_Countdown_Inverse()Tamsayı Olarak Dim nn = 10 için 1 Adım -1Mesaj Kutusu nsonraki nMsgBox "Kaldır"Alt Bitiş

Hücre Boşsa Satırları Sil

Belirli ölçütleri karşılayan satırları silerek hücre aralıkları arasında dolaşmak için en sık For-Loop negatif adımını kullandım. Üst sıralardan alt sıralara döngü yaparsanız, satırları sildikçe sayacınızı bozarsınız.

Bu örnek, boş hücreli satırları siler (alt satırdan başlayarak):

12345678910 Alt ForEach_DeleteRows_BlankCells()Tamsayı Olarak Dim nn = 10 için 1 Adım -1If Range("a" & n).Value = "" SonraRange("a" & n).EntireRow.DeleteBitirsonraki nAlt Bitiş

Döngü İçin Yuvalanmış

Bir For Loop'u diğer For Loop'un içine "yuvalayabilirsiniz". Çarpım tablosu oluşturmak için Nested For Loops'u kullanacağız:

1234567891011 Alt Nested_ForEach_MultiplicationTable()Satırı Tamsayı Olarak Karart, Tam Sayı Olarak SütunuSatır için = 1'den 9'aSütun için = 1 - 9Hücreler(satır + 1, sütun + 1).Değer = satır * sütunSonraki sütunSonraki satırAlt Bitiş

Çıkış İçin

Exit For deyimi, For Next döngüsünden hemen çıkmanıza izin verir.

Belirli bir koşul karşılanırsa For Next Döngüsünden çıkmak için genellikle bir If İfadesi ile birlikte Exit For kullanırsınız.

Örneğin, bir hücreyi bulmak için For Loop kullanabilirsiniz. Bu hücre bulunduğunda, kodunuzu hızlandırmak için döngüden çıkabilirsiniz.

Bu kod, 1 ile 1000 arasındaki satırlar arasında döngü yaparak A sütununda "hata" arar. Bulunursa, kod hücreyi seçer, bulunan hata konusunda sizi uyarır ve döngüden çıkar:

12345678910111213 Alt ExitFor_Loop()Dim i Tamsayı Olaraki = 1 ila 1000 içinIf Range("A" & i).Value = "hata" SonraAralık("A" & i).SeçMsgBox "Hata Bulundu"Çıkış İçinBitirsonraki benAlt Bitiş

Önemli: İç İçe Döngüler durumunda, Çıkış İçin, tüm etkin Döngülerden değil, yalnızca geçerli Döngüden çıkar.

için devam et

VBA, Visual Basic'te bulunan “Continue” komutuna sahip değildir. Bunun yerine, “Çıkış” kullanmanız gerekecektir.

Her Döngü İçin VBA

Her Döngü İçin VBA, bir koleksiyondaki tüm nesneler arasında döngü yapar:

  • Bir aralıktaki tüm hücreler
  • Bir çalışma kitabındaki tüm çalışma sayfaları
  • Bir çalışma sayfasındaki tüm şekiller
  • Tüm açık çalışma kitapları

Her Döngü İçin Yuvalanmış'ı ayrıca şunları yapmak için de kullanabilirsiniz:

  • Tüm çalışma sayfalarında bir aralıktaki tüm hücreler
  • Tüm çalışma sayfalarındaki tüm şekiller
  • Tüm açık çalışma kitaplarındaki tüm sayfalar
  • ve bunun gibi…

Sözdizimi:

123 Koleksiyondaki Her Nesne İçin[Bir şey yap]Sonraki [Nesne]

Nereye:

  • Nesne - Bir Aralık, Çalışma Sayfası, Çalışma Kitabı, Şekil vb. temsil eden değişken (ör. rng)
  • Toplamak - Nesnelerin toplanması (ör. Aralık(“a1:a10”)
  • [Bir şey yap] - Her nesne üzerinde çalışacak kod bloğu
  • Sonraki [Nesne] - Kapanış açıklaması. [Nesne] isteğe bağlıdır, ancak şiddetle tavsiye edilir.

Aralıktaki Her Hücre İçin

Bu kod, bir aralıktaki her hücrede dolaşacaktır:

123456789 Alt ForEachCell_inRange()Aralık olarak hücreyi karartAralıktaki Her Hücre İçin("a1:a10")cell.Value = cell.Offset(0,1).ValueSonraki hücreAlt Bitiş

Çalışma Kitabındaki Her Çalışma Sayfası İçin

Bu kod, bir çalışma kitabındaki tüm çalışma sayfaları arasında dolaşarak her bir sayfanın korumasını kaldırır:

123456789 Alt ForEachSheet_inWorkbook()Dim ws As Çalışma SayfasıÇalışma Sayfalarında Her ws içinws. "Parola" korumasını kaldırınSonrakiAlt Bitiş

Her Açık Çalışma Kitabı İçin

Bu kod tüm açık çalışma kitaplarını kaydedecek ve kapatacaktır:

123456789 Alt ForEachWB_inWorkbooks()Çalışma Kitabı Olarak Dim wbÇalışma Kitaplarında Her wb içinwb.Close SaveChanges:=DoğruSonraki wbAlt Bitiş

Çalışma Sayfasındaki Her Şekil İçin

Bu kod, aktif sayfadaki tüm şekilleri siler.

123456789 Alt ForEachShape()Dim shp As ShapeActiveSheet.Shapes'teki Her shp içinshp.SilSonraki sayfaAlt Bitiş

Çalışma Kitabındaki Her Çalışma Sayfasındaki Her Şekil İçin

Ayrıca Her Döngü İçin Yuvalayabilirsiniz. Burada, aktif çalışma kitabındaki tüm çalışma sayfalarındaki tüm şekiller arasında dolaşacağız:

1234567891011 Alt ForEachShape_inAllWorksheets()Dim shp As Shape, ws As Çalışma SayfasıÇalışma Sayfalarında Her ws içinHer shp için ws.Shapes'teshp.SilSonraki sayfaSonrakiAlt Bitiş

Her Biri İçin - IF Döngüsü

Daha önce de belirttiğimiz gibi, bir If deyimini bir döngü içinde kullanabilir, yalnızca belirli kriterler karşılandığında eylemleri gerçekleştirebilirsiniz.

Bu kod, bir aralıktaki tüm boş satırları gizleyecektir:

12345678910 Alt ForEachCell_inRange()Aralık olarak hücreyi karartAralıktaki Her Hücre İçin("a1:a10")Eğer cell.Value = "" O zaman _cell.EntireRow.Hidden = DoğruSonraki hücreAlt Bitiş

VBA Do while Döngü

VBA Do while ve Do Kadar (sonraki bölüme bakın) çok benzer. Bir koşul karşılanırken (veya bir koşul karşılanana kadar) bir döngüyü tekrarlarlar.

Do while Döngüsü, bir koşul karşılandığında bir döngüyü tekrarlayacaktır.

İşte Do while Sözdizimi:

123 Koşul Yaparken Yap[Bir şey yap]Döngü

Nereye:

  • Şart - Test edilecek koşul
  • [Bir şey yap] - Tekrarlanacak kod bloğu

Ayrıca, döngünün sonunda Koşul ile bir Do while döngüsü oluşturabilirsiniz:

123 Yapmak[Bir şey yap]Döngü Durumda

Her birinin demosunu yapacağız ve nasıl farklı olduklarını göstereceğiz:

Yaparken

İşte daha önce gösterdiğimiz Do while döngüsü örneği:

12345678 Alt DoWhileLoop()Tamsayı Olarak Dim nn = 1n < 11 iken yapMesaj Kutusu nn = n + 1DöngüAlt Bitiş

Döngü Süresi

Şimdi koşulu döngünün sonuna taşımamız dışında aynı prosedürü uygulayalım:

12345678 Alt DoLoopWhile()Tamsayı Olarak Dim nn = 1YapmakMesaj Kutusu nn = n + 1Döngü n < 11 ikenAlt Bitiş

Döngüye Kadar VBA Yap

Do Kadar Döngüler, belirli bir koşul karşılanana kadar bir döngüyü tekrarlar. Sözdizimi aslında Do while döngüleriyle aynıdır:

123 Koşul kadar yap[Bir şey yap]Döngü

ve benzer şekilde koşul, döngünün başına veya sonuna gidebilir:

123 Yapmak[Bir şey yap]Duruma Kadar Döngü

kadar yap

Bu do Kadar döngüsü, önceki örneklerimizde olduğu gibi 10'a kadar sayılacaktır.

12345678 Alt DoUntilLoop()Tamsayı Olarak Dim nn = 1n > 10'a Kadar YapınMesaj Kutusu nn = n + 1DöngüAlt Bitiş

Döngüye kadar

Bu Döngü Kadar Döngü 10'a kadar sayılacaktır:

12345678 Alt DoLoopUntil()Tamsayı Olarak Dim nn = 1YapmakMesaj Kutusu nn = n + 1n > 10'a Kadar DöngüAlt Bitiş

Do Döngüsünden Çık

Bir For Loop'tan çıkmak için Exit For'u kullanmaya benzer şekilde, bir Do Loop'tan hemen çıkmak için Exit Do komutunu kullanırsınız.

1 Çıkış Yap

İşte Exit Do'ya bir örnek:

123456789101112131415 Alt ExitDo_Loop()Dim i Tamsayı Olarakben = 1i> 1000'e kadar yapınIf Range("A" & i).Value = "hata" SonraAralık("A" & i).SeçMsgBox "Hata Bulundu"Çıkış YapBitirben = ben + 1DöngüAlt Bitiş

Döngüyü Bitir veya Ara

Yukarıda bahsettiğimiz gibi, döngülerden çıkmak için Exit For veya Exit Do kullanabilirsiniz:

1 Çıkış İçin
1 Çıkış Yap

Ancak, döngünüzü çalıştırmadan önce bu komutların kodunuza eklenmesi gerekir.

Şu anda çalışmakta olan bir döngüyü "kırmaya" çalışıyorsanız, tuşuna basmayı deneyebilirsiniz. ESC veya CTRL + Arayı Duraklat klavyede. Ancak bu çalışmayabilir. İşe yaramazsa, döngünüzün bitmesini beklemeniz gerekir veya sonsuz bir döngü olması durumunda şunu kullanın: CTRL + ALT + Silmek Excel'i kapatmaya zorlamak için.

Bu yüzden Do döngülerinden kaçınmaya çalışıyorum, yanlışlıkla sizi Excel'i yeniden başlatmaya zorlayan ve potansiyel olarak işinizi kaybetmeye zorlayan sonsuz bir döngü oluşturmak daha kolaydır.

Daha Fazla Döngü Örneği

Satırlar Arasında Döngü

Bu, bir sütundaki tüm satırlar arasında dolaşacaktır:

123456789 Public Sub LoopThroughRows()Aralık olarak hücreyi karartAralıktaki Her Hücre İçin("A:A")Ff cell.value "" ardından MsgBox cell.address &": " & cell.valueSonraki hücreAlt Bitiş

Sütunlar Arası Döngü

Bu, arka arkaya tüm sütunlar arasında dolaşacaktır:

123456789 Public Sub LoopThroughColumns()Aralık olarak hücreyi karartAralıktaki Her Hücre İçin("1:1")Eğer cell.Value "" Sonra MsgBox cell.Address & ": " & cell.ValueSonraki hücreAlt Bitiş

Bir Klasördeki Dosyalar Arasında Döngü

Bu kod, bir klasördeki tüm dosyalar arasında dolaşarak bir liste oluşturur:

12345678910111213141516171819 Alt LoopThroughFiles ()Obje Olarak Dim ofFSODim ofFolder As ObjectoFile As Object olarak karartDim i Tamsayı OlarakSet oFSO = CreateObject("Scripting.FileSystemObject")Set oFolder = oFSO.GetFolder("C:\Demo)ben = 2oFolder.Files içindeki her bir oFile içinRange("A" & i).value = oFile.Nameben = ben + 1Sonraki oDosyaAlt Bitiş

Dizide Döngü

Bu kod, 'arrList' dizisinde dolaşacaktır:

123 i = LBound(arrList) için UBound(arrList) içinMsgBox arrList(i)sonraki ben

LBound işlevi dizinin "alt sınırını", UBound ise "üst sınırını" alır.

Access VBA'da Döngüler

Yukarıdaki örneklerin çoğu Access VBA'da da çalışacaktır. Ancak Access'te, Aralık Nesnesi yerine Kayıt Kümesi Nesnesi arasında döngü yaparız.

123456789101112131415161718 Alt LoopThroughRecords()Hatada Devam Et SonrakiVeritabanı Olarak Dim dbsÖnce Kayıt Kümesi Olarak Karartdbs'yi ayarla = CurrentDbİlk olarak ayarla = dbs.OpenRecordset("tblClients", dbOpenDynaset)ilk ile.MoveLast.Önce Taşı.EOF = Doğruya Kadar YapınMsgBox (rst.Fields("ClientName")).Sonraki TaşıDöngüİle bitmekilk.Kapatİlk olarak ayarla = Hiçbir şeydbs'yi ayarla = Hiçbir şeyAlt Bitiş

Arkadaşlarınızla sayfasını paylaşan sitenin gelişimine yardımcı olacak

wave wave wave wave wave