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ş |