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.
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.
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.
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.
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.
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.
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.| A | B | C | |
|---|---|---|---|
| 1 | Ürün | Satış | Durum |
| 2 | Klavye | 4.200,00 | Hedef altı |
| 3 | Fare | 6.100,00 | Hedef üstü |
| 4 | Monitör | 12.500,00 | Hedef üstü |
| 5 | Kulaklık | 3.800,00 | Hedef altı |
| 6 | Yazıcı | 5.000,00 | Hedef üstü |
| 7 | Tablet | 8.900,00 | Hedef üstü |
| 8 | Webcam | 2.750,00 | Hedef altı |
| 9 | Hoparlör | 5.400,00 | Hedef üstü |
Satış HedefiExcelDepo v1.0.0
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.| A | B | |
|---|---|---|
| 1 | Sıra | Şehir |
| 2 | 1 | İstanbul |
| 3 | 2 | Ankara |
| 4 | 3 | İzmir |
| 5 | 4 | Bursa |
| 6 | 5 | Antalya |
Şehir ListesiExcelDepo v1.0.0
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.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Adet | Birim Fiyat | Tutar |
| 2 | Defter | 40 | 12,50 | 500,00 |
| 3 | Kalem | 120 | 3,75 | 450,00 |
| 4 | Dosya | 60 | 8,90 | 534,00 |
| 5 | Zımba | 15 | 45,00 | 675,00 |
| 6 | Silgi | 200 | 2,20 | 440,00 |
| 7 | ||||
| 8 | Bant | 30 | 6,50 | |
| 9 | Makas | 12 | 28,00 |
Sipariş TutarıExcelDepo v1.0.0
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.