Excel'deki VBA For Each Loop, döngünün başlangıç ve bitiş noktalarını açıkça tanımlamadan çalışma sayfaları, hücreler veya dosyalar gibi bir nesne veya öğe koleksiyonunda yineleme yapmanıza olanak tanıyan bir denetim yapısıdır. Koleksiyonlar arasında döngülemeyi basitleştirir ve özellikle Excel çalışma kitapları ve çeşitli öğeleriyle çalışırken faydalıdır.

Bir örneğe bakalım. Excel çalışma kitabındaki çalışma sayfası adlarının yönetimini kolaylaştırmak için tasarlanmış “FormatSheetNames” adlı bir VBA alt rutinimiz var. Etkin çalışma kitabındaki tüm çalışma sayfalarını yinelemek için bir For Each Loop kullanır. Her sayfayı dolaşırken önemli bir görevi gerçekleştirir: herhangi bir sayfa adının boşluk içerip içermediğini kontrol eder.

Koşullu kontrol, sayfa adlarını boşluklar açısından tarayan InStr işlevi tarafından kolaylaştırılır. Bir sayfa adı içinde bir boşluk belirlendiğinde, kod bu boşluğu bir alt çizgiyle değiştirerek hareket eder.

- VBA For Each Loop, herhangi bir başlangıç ve bitiş noktası belirtmeden nesne veya öğe koleksiyonları arasında yineleme yapmak için kullanılır.
- VBA For Each Loop, doğal olarak bir koleksiyonda ileriye doğru hareket eder. VBA For Each Loop'u Geriye doğru yinelemek için, azalan bir dizin değişkenine sahip standart bir For Döngüsü kullanın.
- VBA For Each Loop, sayfaları, hücreleri, grafikleri veya diğer öğeleri değiştirmek gibi Excel çalışma kitaplarını içeren görevlerin otomatikleştirilmesi için kullanışlıdır.
- VBA For Each Loop esas olarak koleksiyonlar içindir, ancak bir indeks değişkeni olan standart bir For Döngüsü kullanarak bir VBA For Each Loop Dizisi içinde yineleme yapabilirsiniz.
Sözdizimi
For Each element In Collection
‘ Code to be executed for each element.
Next element
VBA'da For Each Döngüsünün sözdizimi aşağıdaki gibidir:
- element: Bu değişken koleksiyondaki geçerli öğeyi temsil eder.
- Koleksiyon: Bu, içinde döngü oluşturmak istediğiniz nesnelerin veya öğelerin koleksiyonudur.
VBA'da For Each Loop Nasıl Kullanılır?
For Each VBA Döngüsünü kullanmanın adımları şunlardır.
Adım 1: Excel çalışma kitabında ALT + F11 tuşlarına basarak Visual Basic for Applications (VBA) düzenleyicisini açın.

Adım 2: VBA düzenleyicisinin içinde, VBA kodunuzu yazabileceğiniz yeni bir modül eklemek için Ekle > Modül'e gidin .

Adım 3: Döngü içerisinde, döngüde dolaşmak istediğiniz nesneleri veya öğeleri temsil edecek değişkenleri tanımlayın.
Adım 4: Modül içinde Her Bir Döngü İçin bir Döngü oluşturun. Döngü yapmak istediğiniz nesne veya öğe koleksiyonunu tanımlayın ve her öğe üzerinde gerçekleştirilecek eylemleri belirtin.
Adım 5: Her bir eleman üzerinde istenen eylemleri yürütmek için döngünün içine mantığı yazın. Döngü içinde geçerli elemanın özelliklerine ve yöntemlerine erişebilir ve bunları düzenleyebilirsiniz.
Adım 6: VBA düzenleyicisini kapatın ve Excel çalışma kitabınıza dönün. ALT + F8 tuşlarına basarak, For Each Loop'u içeren makroyu seçerek ve “Run”a tıklayarak VBA kodunu çalıştırın.
Adım 7: Kodu çalıştırdıktan sonra Excel çalışma kitabınızdaki sonuçları inceleyin. Döngü, koleksiyondaki her bir öğeye belirtilen eylemleri uygulamış olmalıdır.
Örnekler
Örnek 1 – Tüm Sayfalara Aynı Metni Ekle
Bu örnekte, aynı metnin VBA kullanarak bir Excel çalışma kitabındaki sayfaların sol üst hücresine nasıl ekleneceğini anlayacağız.
Diyelim ki birden fazla çalışma sayfası olan bir Excel çalışma kitabımız var ve tüm çalışma sayfalarındaki A1 hücresine metin eklemek istiyoruz. Bunu aşağıdaki prosedürü kullanarak başarabiliriz:

Adım 1: Yeni modülde ilk olarak InsertTextInAllSheets adında bir Alt Rutin (Sub) tanımlayacağız.

Adım 2: Burada, Worksheet türünde bir ws değişkeni bildiriyoruz. Bu değişken, döngüdeki her çalışma sayfasını temsil etmek için kullanılacaktır.

Adım 3: Sonra, bir string olarak textToInsert adında başka bir değişken bildiriyoruz. Bu değişken, her sayfaya eklemek istediğimiz metni depolayacaktır.

Adım 4: Şimdi, “Bu metin eklendi.” dizesini “textToInsert” değişkenine atıyoruz. Bu, her sayfaya eklenecek metindir. Bunu istediğiniz herhangi bir metinle değiştirebilirsiniz.

Adım 5: Şimdi, VBA For Each Loop'u başlatıyoruz. Çalışma kitabındaki (ThisWorkbook) her sayfada yineleme yapacaktır.

Adım 6: Döngünün içinde, hücrelerine erişmek için ws'yi (geçerli çalışma sayfası) kullanırız. Burada, hücrenin ilk satır ve ilk sütundaki (hücre A1) değerini "textToInsert" değişkeninde depolanan metne ayarlarız.

Adım 7: Son olarak, “Next ws” kullanarak döngüyü sonlandırıyoruz. Bu, VBA’ya çalışma kitabındaki bir sonraki sayfaya geçmesini söyler.

Adım 8: Makroyu kaydedin ve Çalıştır'a tıklayın. Çalıştırdığınızda, bu kod aynı metni etkin çalışma kitabındaki tüm sayfaların ilk hücresine ekler.

İşte tam kod:
Sub InsertTextInAllSheets()
Dim ws As Worksheet
Dim textToInsert As String
textToInsert = “This text was inserted.”
For Each ws In ThisWorkbook.Sheets
ws.Cells(1, 1).Value = textToInsert
Next ws
End Sub
Örnek 2 – Tüm Sayfaları Gizle
Bu örnekte, For Each Loop kullanarak bir Excel çalışma kitabındaki tüm çalışma sayfalarını gizleyen bir VBA kodunu inceleyeceğiz. Diyelim ki dört çalışma sayfamız var ve bunları gizlemek istiyoruz; Aşağıdaki adımlar kullanılarak gerçekleştirilebilir:

Adım 1: Yeni modülde ilk olarak HideAllSheets adında bir Alt Rutin tanımlıyoruz.

Adım 2: Burada çalışma sayfalarını temsil edecek ws değişkenini tanımlıyoruz .

Adım 3: Şimdi çalışma kitabındaki tüm sayfaları yineleyecek bir VBA For Each Loop ekliyoruz.

Adım 4: Döngünün içinde, her çalışma sayfasının (ws) Visible özelliğini xlSheetHidden olarak ayarlıyoruz. Sayfayı gizler.

Adım 5: Son olarak “ Next ws ” kullanarak döngüyü sonlandırıyoruz ve bir sonraki sayfaya geçiyoruz.

Adım 6: Makroyu kaydedin ve çalıştır'a tıklayın. Makroyu çalıştırdığınızda, bu kod etkin çalışma kitabındaki tüm sayfaları gizler.

İşte tam kod:
Sub HideAllSheets()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets
ws.Visible = xlSheetHidden
Next ws
End Sub
Örnek 3 – Tüm Sayfaları Göster
Bu örnekte, bir Excel çalışma kitabındaki tüm çalışma sayfalarının nasıl gizlendiğini anlayacağız. Bu, daha önce gizlenen sayfaları tekrar görünür hale getirmemize olanak tanıyan bir VBA For Each Loop kullanılarak gerçekleştirilir.

Adım 1: Yeni modülde UnhideAllSheets adında bir Alt Rutin tanımlayın.

Adım 2: Burada çalışma sayfalarını temsil edecek ws değişkenini tanımlıyoruz.

Adım 3: Şimdi, çalışma kitabındaki tüm sayfaları yineleyecek bir VBA For Each Loop sağlayın.

Adım 4: Döngünün içinde, her çalışma sayfasının (ws) Visible özelliğini xlSheetVisible olarak ayarlıyoruz. Bu özellik sayfayı tekrar görünür hale getirir.

Adım 5: Son olarak “Next ws” kullanarak döngüyü sonlandırıyoruz ve bir sonraki sayfaya geçiyoruz.

Adım 6: Makroyu kaydedin ve Çalıştır'a tıklayın. Makroyu çalıştırdığınızda, bu kod etkin çalışma kitabındaki tüm sayfaları gizler.

İşte tam kod:
Sub UnhideAllSheets()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets
ws.Visible = xlSheetVisible
Next ws
End Sub
Örnek 4 – Tüm Sayfaları Koru ve Korumasını Kaldır
Bu örnekte, Excel çalışma kitabındaki tüm çalışma sayfalarını belirtilen bir parola ile nasıl koruyabileceğimizi ve çalışma kitabının güvenliğini nasıl artırabileceğimizi göreceğiz.

Adım 1: Yeni modülde ProtectUnprotectSheets adında bir Alt Rutin tanımlayarak başlayın.

Adım 2: Daha sonra çalışma sayfalarını temsil edecek ws değişkenini tanımlıyoruz.

Adım 3: Burada, sayfaları korumak için parolayı saklamak üzere bir dize olarak değişken bir parola tanımlıyoruz.

Adım 4: Şimdi “mypassword” ifadesini şifre değişkenine atıyoruz.

Adım 5: Çalışma kitabındaki tüm sayfaları yineleyen VBA For Each Loop'u sağlayacağız.

Adım 6: Döngü içerisinde Protect metodunu kullanarak her çalışma sayfasını (ws) belirtilen parola ile koruyoruz.

Adım 7: Sayfaların korumasını kaldırmak için “ws.Unprotect Password:=password” komutunu kullanın.

Adım 8: Son olarak “ Next ws ” kullanarak döngüyü sonlandırıyoruz ve bir sonraki sayfaya geçiyoruz.

Adım 9: VBA makrosunu kaydedin ve Çalıştır'a tıklayın. Makroyu çalıştırdığınızda, bu kod etkin çalışma kitabındaki tüm sayfaları belirtilen bir parola ile korur.

İşte tam kod:
Sub ProtectUnprotectSheets()
Dim ws As Worksheet
Dim password As String
password = “mypassword”
For Each ws In ThisWorkbook.Sheets
ws.Protect Password:=password
‘ To unprotect: ws.Unprotect Password:=password
Next ws
End Sub
Dikkat Edilmesi Gereken Önemli Noktalar
- Belirli bir koşul karşılanırsa, Exit For ifadesini kullanarak VBA For Each Loop'tan erken çıkabilirsiniz.
- Öğeler arasında döngü oluştururken olası hataları öngörüyorsanız, istisnaları zarif bir şekilde işlemek için On Error Resume Next'i kullanarak VBA'da hata işleme özelliğini eklemeyi düşünün .
- Excel VBA, Çalışma Sayfaları, Hücreler, Grafikler ve daha fazlası dahil olmak üzere döngüye alınacak çeşitli koleksiyonlar sağlar. Görevinize göre uygun koleksiyonu seçin.
- VBA'da uyumsuzluk hatalarını önlemek için değişkenleri doğru veri türleriyle bildirdiğinizden emin olun .
- VBA'da, "VBA For Each Loop Break", VBA For Each Loop için özel bir 'break' ifadesi olarak mevcut değildir. Bunun yerine, 'Exit For'u kullanarak bir koşula dayalı erken bir çıkış elde edebilirsiniz.
- VBA Her Döngü İçin Sonrakine Geçme döngüsünde geçerli yinelemeyi atlayıp koleksiyondaki bir sonraki öğeye geçmek için “Devam Et”i kullanın .
