Genel Bakış
For-Next (For...Next), bir kod bloğunu sayaç değişkeninin başlangıç ve bitiş değerleri arasında belirli sayıda yineleyen VBA döngü deyimidir. Satır sayısı ya da yineleme adedi önceden bilindiğinde, örneğin bir listedeki her satırı işlemek için en uygun döngüdür. Sayaç her turda Step ile belirlenen değer kadar değişir; isterseniz Exit For ile döngüden erken çıkabilirsiniz.
Parametreler:
Geriye sayarken başlangıç değerinin bitişten büyük olması gerekir. Satır silme gibi işlemlerde alttan üste doğru (Step -1) ilerlemek zorunludur; çünkü bir satır silindiğinde altındaki satırlar yukarı kayar ve yukarıdan aşağıya giden döngü bazı satırları atlar. Step 0 yazarsanız sayaç hiç ilerlemez ve döngü sonsuza kadar sürer.
Döngü sayacı i, 2'den son dolu satır numarasına kadar birer birer artar ve her turda o satırın tutarını D sütununa yazar. Klavye satırı için D2 hücresinde 5.400,00, Monitör satırı için D4 hücresinde 21.000,00, USB Bellek satırı için D7 hücresinde 4.800,00 görünür; her tutar, o satırdaki adet ile birim fiyatın çarpımıdır. Son satırı sabit yazmak yerine End(xlUp) ile bulduğunuz için liste uzasa da kod değişmeden çalışır.
İlk döngüde sayaç 6'dan 1'e doğru azalır; B2 hücresine Haziran, B7 hücresine Ocak yazılır. İkinci döngüde sayaç 2, 4 ve 6 değerlerini alır ve seçilen aylar C sütununa sırayla dizilir: C2 hücresi Ocak, C3 hücresi Mart, C4 hücresi Mayıs olur. Hedef satırı izleyen j değişkeni, sayaç iki şer ilerlerken sonuçların alt alta boşluksuz yazılmasını sağlar.
Döngü satırları yukarıdan aşağıya tek tek kontrol eder ve satışı hedefe ulaşan ilk satırda durur. Hedefi ilk aşan personel D2 hücresinde Mehmet Kaya, bu kişinin bulunduğu satır numarası E2 hücresinde 3 olarak görünür. Daha aşağıdaki satırlarda hedefi geçen başka personel olsa bile Exit For sayesinde bu satırlara bakılmaz. Hiçbir satır koşulu sağlamasaydı D2 hücresinde başta yazılan varsayılan metin kalırdı.
Söz dizimi
For...Next deyiminin söz dizimi şöyledir:
VBA
4 satır
For sayac = baslangic To bitis [Step adim]
deyimler
[If kosul Then Exit For]
Next [sayac]
- sayac: Döngü sayacı olarak kullanılan sayısal değişken; zorunludur. Satır numaraları için Long türünü tercih edin.
- baslangic: Sayacın ilk değeri; zorunludur.
- bitis: Sayacın ulaşacağı son değer; zorunludur. Bu değer de döngüye dahildir.
- Step adim: Her turda sayaca eklenen değer; isteğe bağlıdır, varsayılanı 1'dir. Negatif değer verirseniz sayaç geriye doğru sayar.
- deyimler: Her turda çalışacak kod satırları; isteğe bağlıdır.
- Exit For: Döngüyü hemen bitirip Next satırından sonraki ilk satıra geçer; isteğe bağlıdır.
- Next sayac: Döngü bloğunu kapatır. Sayaç adını yazmak isteğe bağlıdır, ancak iç içe döngülerde okunabilirliği artırır.
Döngü nasıl çalışır
Excel döngüye girerken sayaca başlangıç değerini atar, ardından şu adımları izler:- Kontrol: Adım pozitifse sayaç bitiş değerinden büyük olduğunda, negatifse küçük olduğunda döngü sona erer.
- Çalıştırma: Sayaç sınır içindeyse deyimler çalışır.
- Artırma: Next satırına gelindiğinde sayaca adım değeri eklenir ve kontrole dönülür.
Step ile ileri, geri ve atlamalı sayım
Step ile sayacın nasıl ilerleyeceğini belirlersiniz. Bir atlayarak ilerlemek için Step 2, geriye doğru saymak için Step -1 yazılır:
VBA
7 satır
For i = 2 To 10 Step 2
' 2, 4, 6, 8, 10
Next i
For i = 10 To 1 Step -1
' 10, 9, 8 ... 1
Next i
Erken çıkış ve iç içe döngüler
Aradığınız değeri bulduğunuzda kalan turları çalıştırmanın anlamı yoktur; bu durumda bir If bloğu içinde Exit For kullanın. Birden çok For-Next döngüsünü iç içe yazabilirsiniz; örneğin dış döngü satırları, iç döngü sütunları dolaşır. İç içe döngülerde her döngünün sayacı farklı olmalıdır ve içteki döngü, dıştaki Next satırından önce kapanmalıdır. Exit For yalnızca içinde bulunduğu en yakın döngüyü sonlandırır.1. Satır satır tutar hesaplama
Sipariş listesinde adet ve birim fiyat bilgileri var, Tutar sütunu boş. Alt+F11 ile Visual Basic Düzenleyicisi'ni açın, Ekle > Modül (Insert > Module) komutuyla standart modül ekleyip aşağıdaki kodu yapıştırın. Makro, ikinci satırdan son dolu satıra kadar her satır için adedi birim fiyatla çarpıp D sütununa yazar.
VBA
16 satır
Option Explicit
Sub TutarHesapla()
Dim i As Long
Dim sonSatir As Long
Dim ws As Worksheet
Set ws = ActiveSheet
' A sütunundaki son dolu satırı bul
sonSatir = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' İkinci satırdan son satıra kadar her satırı işle
For i = 2 To sonSatir
ws.Cells(i, 4).Value = ws.Cells(i, 2).Value * ws.Cells(i, 3).Value
Next i
End Sub
For-Next
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Adet | Birim Fiyat | Tutar |
| 2 | Klavye | 12 | 450,00 | 5.400,00 |
| 3 | Fare | 25 | 180,00 | 4.500,00 |
| 4 | Monitör | 5 | 4.200,00 | 21.000,00 |
| 5 | Kulaklık | 18 | 650,00 | 11.700,00 |
| 6 | Webcam | 9 | 900,00 | 8.100,00 |
| 7 | USB Bellek | 40 | 120,00 | 4.800,00 |
Sipariş TutarıExcelDepo v1.0.0
2. Ters sıra ve atlamalı sayım
A sütununda altı ayın adı yer alıyor. Makro iki işlem yapar: Step -1 ile ay adlarını B sütununa ters sırada yazar, Step 2 ile de bir atlayarak seçtiği ayları C sütununa dizer. Kodu standart modüle yapıştırıp çalıştırın.
VBA
21 satır
Option Explicit
Sub TersVeAtlamali()
Dim i As Long
Dim j As Long
Dim n As Long
n = 6 ' Ay sayısı
' Geriye doğru sayım: Haziran'dan Ocak'a
For i = n To 1 Step -1
Cells(n - i + 2, 2).Value = Cells(i + 1, 1).Value
Next i
' Bir atlayarak ilerleme: 2., 4. ve 6. satırlar
j = 2
For i = 2 To 7 Step 2
Cells(j, 3).Value = Cells(i, 1).Value
j = j + 1
Next i
End Sub
For-Next
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ay | Ters Sıra | Bir Atlayarak |
| 2 | Ocak | Haziran | Ocak |
| 3 | Şubat | Mayıs | Mart |
| 4 | Mart | Nisan | Mayıs |
| 5 | Nisan | Mart | |
| 6 | Mayıs | Şubat | |
| 7 | Haziran | Ocak |
AylarExcelDepo v1.0.0
3. Exit For ile ilk eşleşmede çıkış
Satış listesinde her personelin satışı ve hedefi var. Makro, satışı hedefe ilk ulaşan personeli bulur; adını D2, satır numarasını E2 hücresine yazar ve Exit For ile döngüyü bitirir. Kodu standart modüle yapıştırıp çalıştırın.
VBA
19 satır
Option Explicit
Sub IlkBasariliPersonel()
Dim i As Long
Dim sonSatir As Long
sonSatir = Cells(Rows.Count, 1).End(xlUp).Row
' Hedefi aşan çıkmazsa görünecek varsayılan metin
Cells(2, 4).Value = "Hedefi aşan yok"
For i = 2 To sonSatir
If Cells(i, 2).Value >= Cells(i, 3).Value Then
Cells(2, 4).Value = Cells(i, 1).Value
Cells(2, 5).Value = i
Exit For ' İlk eşleşmede döngüden çık
End If
Next i
End Sub
For-Next
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Personel | Satış | Hedef | İlk Hedefi Aşan | Satır No |
| 2 | Ayşe Yılmaz | 48.500,00 | 50.000,00 | Mehmet Kaya | 3 |
| 3 | Mehmet Kaya | 51.200,00 | 50.000,00 | ||
| 4 | Elif Demir | 62.000,00 | 50.000,00 | ||
| 5 | Can Öztürk | 39.800,00 | 50.000,00 | ||
| 6 | Zeynep Arslan | 55.400,00 | 50.000,00 | ||
| 7 | Burak Şahin | 47.000,00 | 50.000,00 |
Hedef KontrolExcelDepo v1.0.0
Kullanırken dikkat edin
- Sayaç için Long kullanın: Integer türü en fazla 32.767 değerini tutar; Excel sayfasında bir milyondan fazla satır bulunduğundan satır numaraları için Long kullanın. Aksi halde büyük listelerde taşma (Overflow) hatası alırsınız.
- Sayacı döngü içinde değiştirmeyin: Döngünün gövdesinde sayaç değişkenine değer atamak tur sayısını bozar ve beklenmedik sonuçlara, hatta sonsuz döngüye yol açar. Sayacı yalnızca Next satırının artırmasına izin verin.
- Satır silerken alttan üste ilerleyin: Bir satırı Delete ile sildiğinizde altındaki satırlar yukarı kayar. Bu nedenle satır silen döngüleri son satırdan ilk satıra doğru Step -1 ile kurun; yukarıdan aşağı giden döngü bazı satırları atlar.
- Ondalıklı adımlarda dikkatli olun: Step 0.1 gibi ondalıklı adımlar kayan noktalı sayıların yuvarlama farkları yüzünden son turu beklenmedik biçimde atlayabilir. Mümkünse tam sayı sayaç kullanıp değeri döngü içinde bölerek hesaplayın.
- Next satırı eksik ya da yanlış olmasın: Her For için bir Next yazılmalıdır; aksi halde 'Next olmadan For' (For without Next) derleme hatası oluşur. İç içe döngülerde Next j ve Next i sıralarının doğru olduğundan emin olun.
- Büyük döngülerde ekranı kapatın: Çok sayıda hücreye yazan döngüleri hızlandırmak için çalışmadan önce Application.ScreenUpdating özelliğini False yapın ve işlem bitince True değerine döndürün. Mümkünse hücreleri tek tek okumak yerine değerleri bir diziye alıp işleyin.
- İlgili konular:
- For Each...Next: Koleksiyon ya da aralıktaki her öğeyi sayaç kullanmadan dolaşır.
- Do While...Loop ve Do Until...Loop: Tur sayısı önceden bilinmediğinde koşula bağlı döngü kurar.
- Exit For: Döngüyü erken sonlandırır.
- If...Then...Else: Döngü içinde koşula göre işlem yapmayı sağlar.
- Cells ve Range.End: Satır ve sütun numarasıyla hücreye erişir, son dolu satırı bulur.
- Application.ScreenUpdating: Büyük döngülerin hızını artırır.
- TOPLA ve ETOPLA: Basit toplama işlemlerini döngüye gerek kalmadan formülle yapar.