Özellik ikonu

For-Each-Next

İndirme izni yok

Genel Bakış

For-Each-Next (For Each...Next), bir koleksiyondaki ya da dizideki her öğe için aynı deyimleri sırayla çalıştıran döngü deyimidir. Hücre aralığındaki hücreleri, çalışma kitabındaki sayfaları ya da bir dizinin elemanlarını sayaç ve son satır numarası tutmadan dolaşmanızı sağlar.

Söz dizimi​

Deyimin genel biçimi şöyledir:
VBA 5 satır
For Each eleman In grup
    [deyimler]
    [Exit For]
    [deyimler]
Next [eleman]
  • eleman: Her turda grubun sıradaki öğesini tutan değişkendir; zorunludur. Koleksiyonlarda Variant, Object ya da öğenin kendi nesne türü (ör. Range, Worksheet) olabilir. Dizilerde yalnızca Variant olabilir.
  • grup: Dolaşılacak koleksiyonun, nesne topluluğunun ya da dizinin adıdır; zorunludur. Kullanıcı tanımlı türlerden oluşan bir dizi kullanılamaz.
  • deyimler: Her öğe için çalıştırılacak kodlardır; isteğe bağlıdır.
  • Exit For: Döngüden hemen çıkar ve Next satırından sonraki deyimle devam eder; isteğe bağlıdır. İç içe döngülerde yalnızca içinde bulunduğu döngüden çıkar.
  • Next eleman: Döngüyü kapatır. Değişken adını yazmak isteğe bağlıdır, ancak iç içe döngülerde okunabilirliği artırır.

Nasıl çalışır​

Döngü, grubun ilk öğesiyle başlar; öğeyi değişkene atar, deyimleri çalıştırır ve Next satırında sıradaki öğeye geçer. Grupta öğe kalmayınca döngü biter. Grup boşsa deyimler hiç çalışmaz ve döngü atlanır.

For...Next döngüsünden farkı, sayaç ve üst sınır tutmanız gerekmemesidir. Koleksiyonlarda öğe sayısını ve sırasını Excel yönetir. Bir Range içindeki hücrelerin hangi sırayla dolaşılacağına güvenmek yerine, sıra önemliyse For...Next ile Cells(i, j) kullanın.

Döngü değişkeni nesne koleksiyonlarında öğenin kendisine başvurur. Örneğin Range hücresi üzerinde Value ya da Interior.Color değiştirirseniz sayfadaki hücre değişir. Dizilerde ise değişken öğenin bir kopyasını tutar; değişkene yazmak dizinin elemanını değiştirmez.

Sık kullanılan gruplar ve sınırlar​

  • Range: Seçili ya da belirtilen hücrelerin her biri. Satır ya da sütun dolaşmak için Range.Rows ve Range.Columns kullanılır.
  • Worksheets: Çalışma kitabındaki çalışma sayfaları; Sheets ise grafik sayfalarını da kapsar.
  • Workbooks: Açık çalışma kitapları.
  • Collection ve diziler: Kendi oluşturduğunuz Collection nesneleri ile Array(...) ya da Split ile elde edilen diziler.
Öğe silerken (satır, sayfa vb.) ileri yönlü For Each kullanmayın. Silme koleksiyonu değiştirdiği için öğeler atlanabilir; bu işte sondan başa doğru For...Next (Step -1) daha güvenlidir.

1. Hücreleri dolaşarak koşula göre işaretleme​

Aylık satış tutarları B sütunundadır. Makro, B2:B9 aralığındaki her hücreyi dolaşır ve tutar 5000 ve üzerindeyse C sütununa "Hedef üstü", değilse "Hedef altı" yazar. Kodu standart bir modüle yapıştırıp çalıştırın.
VBA 15 satır
Option Explicit

Sub HedefKontrol()
    Dim hucre As Range

    ' B2:B9 aralığındaki her hücre için döngü çalışır
    For Each hucre In ActiveSheet.Range("B2:B9")
        If hucre.Value >= 5000 Then
            ' Offset(0, 1): bir sağdaki hücre (C sütunu)
            hucre.Offset(0, 1).Value = "Hedef üstü"
        Else
            hucre.Offset(0, 1).Value = "Hedef altı"
        End If
    Next hucre
End Sub
For-Each-Next
Formülünü incelemek için bir hücre seçin.
ABC
1ÜrünSatışDurum
2Klavye4.200,00Hedef altı
3Fare6.100,00Hedef üstü
4Monitör12.500,00Hedef üstü
5Kulaklık3.800,00Hedef altı
6Yazıcı5.000,00Hedef üstü
7Tablet8.900,00Hedef üstü
8Webcam2.750,00Hedef altı
9Hoparlör5.400,00Hedef üstü
Satış HedefiExcelDepo v1.0.0
Döngü değişkeni hucre her turda B sütunundaki bir hücreye başvurur. Klavye satırı için C2 hücresine Hedef altı, Fare satırı için C3 hücresine Hedef üstü yazılır. Eşik değeri 5000 olduğundan 5000 tutarlı Yazıcı satırı da "hedef üstü" sayılır, çünkü koşul >= işlecini kullanır.

2. Dizi elemanlarını sayfaya yazma​

Bu örnekte grup bir dizidir. Array işleviyle oluşturulan şehir adları sırayla A ve B sütunlarına yazılır. Dizilerde döngü değişkeninin Variant olması gerektiğine dikkat edin. Kodu standart bir modüle yapıştırıp çalıştırın.
VBA 14 satır
Option Explicit

Sub SehirListele()
    Dim sehir As Variant   ' Dizilerde döngü değişkeni Variant olmalıdır
    Dim satir As Long

    satir = 2

    For Each sehir In Array("İstanbul", "Ankara", "İzmir", "Bursa", "Antalya")
        ActiveSheet.Cells(satir, 1).Value = satir - 1   ' Sıra numarası
        ActiveSheet.Cells(satir, 2).Value = sehir       ' Şehir adı
        satir = satir + 1
    Next sehir
End Sub
For-Each-Next
Formülünü incelemek için bir hücre seçin.
AB
1SıraŞehir
21İstanbul
32Ankara
43İzmir
54Bursa
65Antalya
Şehir ListesiExcelDepo v1.0.0
Dizide beş eleman olduğu için döngü beş tur çalışır. İlk turda A2 hücresine 1, B2 hücresine İstanbul yazılır; son turda ise B6 hücresi Antalya değerini alır. Satır sayacını satir değişkeni ile kendiniz artırdığınıza dikkat edin; For Each sizin için bir sayaç sağlamaz.

3. Satırları dolaşma ve Exit For ile çıkma​

Her sipariş satırında Adet ile Birim Fiyat çarpılıp D sütununa yazılır. Listenin ortasında boş bir satır vardır; makro ürün adı boş olan satırı görünce Exit For ile döngüyü bitirir. Kodu standart bir modüle yapıştırıp çalıştırın.
VBA 14 satır
Option Explicit

Sub TutarHesapla()
    Dim satir As Range

    ' Rows özelliği aralığı satır satır dolaşmayı sağlar
    For Each satir In ActiveSheet.Range("A2:C9").Rows
        ' Ürün adı boşsa liste bitmiş kabul edilir ve döngüden çıkılır
        If satir.Cells(1, 1).Value = "" Then Exit For

        ' Üçüncü sütunun bir sağı: D sütunu
        satir.Cells(1, 3).Offset(0, 1).Value = satir.Cells(1, 2).Value * satir.Cells(1, 3).Value
    Next satir
End Sub
For-Each-Next
Formülünü incelemek için bir hücre seçin.
ABCD
1ÜrünAdetBirim FiyatTutar
2Defter4012,50500,00
3Kalem1203,75450,00
4Dosya608,90534,00
5Zımba1545,00675,00
6Silgi2002,20440,00
7
8Bant306,50
9Makas1228,00
Sipariş TutarıExcelDepo v1.0.0
Döngü, boş satıra gelene kadar çalışır. Defter satırının tutarı D2 hücresinde 500,00, Kalem satırının tutarı D3 hücresinde 450,00 olarak hesaplanır. Ortadaki boş satırda Exit For çalıştığı için bu satırın altındaki Bant ve Makas satırları işlenmez ve Tutar hücreleri boş kalır. Tüm satırların işlenmesini istiyorsanız Exit For yerine boş satırı atlayan bir koşul kullanın.

Kullanırken dikkat edin​

  • Değişken türüne dikkat edin: Dizi dolaşırken döngü değişkenini Variant dışında bir türle tanımlarsanız "Derleme hatası" ya da tür uyuşmazlığı alırsınız. Koleksiyonlarda ise Range, Worksheet gibi özel bir nesne türü kullanabilirsiniz; bu durumda koleksiyonda başka türde öğe varsa hata oluşur.
  • Dizi elemanları kopyalanır: Dizi dolaşırken değişkene yeni değer atamak dizinin kendisini değiştirmez. Dizi elemanlarını güncellemek için For...Next ile LBound ve UBound sınırlarını kullanıp dizi(i) biçiminde yazın.
  • Silme işlemlerinde ters yönde dolaşın: Satır, sütun ya da sayfa silerken ileri yönlü For Each kullanırsanız öğeler atlanır. Silme işlemlerinde sondan başa doğru For...Next döngüsü kullanın.
  • Geniş aralıklarda performans: Çok sayıda hücreyi tek tek dolaşmak yavaştır. Büyük veri için Application.ScreenUpdating = False ayarını kullanın ya da değerleri önce bir diziye alıp bellekte işleyin. Kullandığınız aralığı yalnızca gerekli hücrelerle sınırlayın; tüm sütunu (A:A) dolaşmak 1 milyondan fazla tur demektir.
  • Exit For yalnızca içteki döngüden çıkar: İç içe For Each döngülerinde Exit For sadece bulunduğu döngüyü sonlandırır. Dıştaki döngüden de çıkmak için bir bayrak değişkeni kullanın ve dıştaki döngüde de Exit For yazın.
  • İlgili konular:
    • For...Next: Sayaçlı döngü; geriye doğru ve adımlı dolaşma için.
    • Do While...Loop ve Do Until...Loop: Koşula bağlı döngüler.
    • Exit For: Döngüden erken çıkış.
    • With...End With: Aynı nesne üzerinde birden çok işlem yaparken kodu kısaltır.
    • Range, Cells ve Offset: Hücre dolaşımında sık kullanılan nesne ve özellikler.
    • Worksheets ve Workbooks: Sayfa ve kitap koleksiyonları.
    • Collection ve Array: Kendi gruplarınızı oluşturmak için.
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
9
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst