Makale For Each ... Next

Bu Makale Yararlı Oldu mu?

  • Evet

  • Hayır


Sonuçlar yalnızca oylamadan sonra görülebilir.
Bu yazımızda, sayaçlı döngülerimizden yani; başlangıcı ve bitişi ve ne kadar döneceği belli olan For Each .. Next döngüsünü detaylıca göreceğiz.
Diğer bir sayaçlı döngü olan For .. Next döngüsünü merak edip öğrenmek isteyenler buradan ulaşabilir.

For Each .. Next döngüsü, For .. Next döngüsü ile aşağı yukarı aynı mantıkla çalışır.
For Each .. Next döngüsü For .. Next döngüsünden farklı olarak, belli bir koleksiyona ya da diziye ait elemanlar üzerinde döner.
Koleksiyon olarak nitelendirdiğimiz nesnelerin tipi Hücre olabileceği gibi, Çalışma Kitapları, Sayfalar, UserForm Kontrolleri, Hücre Aralığı, Sayfaya Eklenen Nesneler, Harici Nesneler vs. olabilir. Bunlarla ilgili çeşitli örnekleri makalenin sonunda bulacaksınız.

For Each .. Next döngüsü bazı kullanımlarda For .. Next döngüsüne göre mantığını anlaması ve kullanması daha kolaydır. Fakat, örneğin; satır ve sütun işlerinde bir hücre aralığı verilerek kullanılırsa For .. Next döngüsüne göre daha yavaş çalışmaktadır, yine de hücre aralıklarında kontroller, işlemler yapılacaksa, iç içe iki For .. Next döngüsü kurmaktan ise For Each .. Next ile sadece hücre aralığı belirterek yapmak, az önce bahsettiğim gibi daha kolay olacaktır. Bunu gözlemleyebilirsiniz.

Şimdi bu döngüyü detaylı bir şekilde inceleyelim..

Yazım kalıbı Syntax aşağıdaki gibidir..
Mavi
renkli kısımlar sabittir.
Kırmızı renkli kısımlar değişkendir.

For Each Değişken_Adı In Hücre_Aralığı
Komutlar
Next Değişken_Adı


Yukarıdaki yazım kalıbını kodda bu şekilde kullanıyoruz;
PHP:
Sub ExcelTurkey()
    For Each alan In Range("A1:E10")
        'buraya döngü sırasında yapılacak işlem kodları yazılır.
    Next alan
End Sub
Bu kodda, A1:E10 hücre aralığındaki her bir hücreyi tek tek döneceğini ve bu hücre aralığındaki her bir hücrenin de adının alan olduğunu belirttik.
Belirttiğimiz hücre aralığındaki, her bir hücreyi kontrol etmek istediğimizde, bu döngü öncelikle satırdaki tüm sütunları bitirip, yani A1,B1,C1,D1,E1 yönünde döndükten sonra A2,B2,C2,D2,E2 şeklinde ikinci satıra geçip, belirtilen tüm sütunlarda ve satırlarda dönecektir.

For Each .. Next döngüsünü anlatmaya başlarken, belli bir koleksiyona ya da diziye ait elemanlar üzerinde döneceğini belirtmiştik.
Koleksiyon derken neyi kastediyoruz, önce onu bir açıklayalım.
Koleksiyon: birbiri ile aynı türde veya aynı benzer özelliklere sahip olan, hücre, kitap, sayfa, nesne, şekil vs. tüm bunları bir koleksiyon olarak düşünün.
Yukarıda Range("A1:E10") hücre aralığı belirttik, bu hücre aralığı bir koleksiyon ve hücre aralığındaki her bir hücre de o koleksiyonun elemanlarıdır.
İşte For Each .. Next döngüsü de, koleksiyondaki elemanları döndürmek, o elemanları özelliklerini denetlemek ve uygulamak için kullanılır.

For .. Next döngüsünde, iç içe iki döngü kullanarak yapabildiğimiz aşağıdaki işlemi, For Each .. Next ile tek döngüde nasıl yaparız onu bu kodlarda görüyorsunuz, aradaki farkı ve kullanımı daha rahat anlayabilirsiniz.. Birinde satır ve sütun için ayrı ayrı döngü kurmak gerekirken, diğerinde sadece dönmesini istediğiniz hücre aralığını belirtmeniz yetecektir.

PHP:
'For .. Next döngüsü ile
Sub ExcelTurkey()
    For i = 1 To 10
        For a = 1 To 5
            Cells(i, a) = "Excel"
        Next a
    Next i
End Sub

'For Each .. Next döngüsü ile
Sub ExcelTurkey()
    For Each alan In Range("A1:E10")
        'buraya döngü sırasında yapılacak işlem kodları yazılır.
    Next alan
End Sub
For Each .. Next döngüsü ile de nasıl çalıştığını bu gif resimde görebilirsiniz.

foreach.gif


Hücreler arasında For Each döngüsü ile nasıl dönülür, nasıl çalışır gördük. Yukarıda şu ifadeyi kullanmıştık; "Koleksiyon olarak nitelendirdiğimiz nesnelerin tipi Hücre olabileceği gibi, Çalışma Kitapları, Sayfalar, UserForm Kontrolleri, Hücre Aralığı, Sayfaya Eklenen Nesneler, Harici Nesneler vs. olabilir." o yüzden hücre kısmını geçiyoruz. Şimdi sayfaları kontrol ettirmek için bu döngüyü nasıl kullanırız onu görelim..

Çalışma kitabımızda genellikle birden çok sayfa ile çalışır, verilerimizi tutar, sonra da bu sayfalardaki verilerle belli kriterlere göre işlemler yapmak isteyebiliriz. Tek tek sayfaları açıp orada kontrol etmektense döngü ile hızlı bir şekilde sayfalar arasında dönerek kontrolünü sağlayabiliriz.

For Each döngüsüyle sayfalar arasında dönmek bu kodlarla dönebilirsiniz.
PHP:
Sub ExcelTurkey()
    Dim syf As Worksheet
    For Each syf In Worksheets
        MsgBox syf.Name
    Next syf
End Sub
Koddaki Worksheets (Çalışma Sayfaları) kısmını yani sayfaları ifade ederken başka ifadeler de kullanabiliriz.
Örneğin; sadece Sheets (Sayfalar) yazabiliriz. Ya da ThisWorkbook.Worksheets (Bu Çalışma Kitabındaki Çalışma Sayfaları) , ya da ThisWorkbook.Sheets (Bu Çalışma Kitabındaki Sayfalar) şeklinde ifade edebiliriz. Ayrıca ThisWorkbook yerine ActiveWorkbook da yazabilirsiniz. Yalız bu şekilde yazarken, sadece o an aktif olan çalışma kitabındaki sayfaları belirtmiş olduğunuzu unutmayın.

Bir başka örnek de nesneler, şekiller vs. üzerinde yapalım.
Sayfadaki tüm şekillerin isimlerini yine MsgBox'ta görüntüleyelim.
PHP:
Sub ExcelTurkey()
    Dim sekil As Shape
    For Each sekil In ActiveSheet.Shapes
        MsgBox sekil.Name
    Next sekil
End Sub
Gördüğünüz gibi; kullanım/yazım şekli hep aynıdır, sadece bu döngüyü nerede kurmak istediğiniz değişir. Yani ActiveSheet.Shapes ifadesi değişir. Hücreleri döndürecekseniz oraya bir hücre aralığı yazarsanız, sayfaları döndürecekseniz yukarıda gördüğümüz gibi sayfaları ifade edersiniz, şekil ise şekilleri ifade edersiniz.

Son olarak bu döngüyü UserForm'a eklediğimiz kontollerde/nesnelerde kuralım.
PHP:
Dim txt As Control
For Each txt In Me.Controls
    MsgBox txt.Name
Next txt
Bu döngüyle, UserForm üzerine eklenen tüm kontrollerin/nesnelerin adını aldırabilirsiniz.
Ayrıca belli bir kontrole, yani örneğin UserForm üzerindeki tüm TextBox'lara ait olan isimleri aldırmak veya o TextBox'larla belli işlemler yapmak isteyebilirsiniz. O zaman da, döngümüz dönerken TypeName fonksiyonu ile bu şekilde kontrolünü yaptırabiliriz.
PHP:
Dim txt As Control
For Each txt In Me.Controls
    If TypeName(txt) = "TextBox" Then
        MsgBox txt.Name
    End If
Next txt
 
Son düzenleme:
Admin

Yorumlar

#2
Süper faydalı oldu. Ben gibi kod yazmayı bilmeyip öğrenmek isteyenler için harika bir döküman oldu bu site, tekrardan emeklerinize sağlık
 
Üst Alt