Özellik ikonu

For-Next

İndirme izni yok

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.

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]
Parametreler:
  • 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.
Başlangıç, bitiş ve adım değerleri döngü başlarken yalnızca bir kez hesaplanır. Döngü sürerken bitiş değerini tutan değişkeni değiştirmeniz tur sayısını etkilemez. Pozitif adımla başlangıç değeri bitişten büyükse döngü hiç çalışmaz. Döngü normal biçimde bittiğinde sayaç, bitiş değerinden bir adım ilerideki değerde kalır; Exit For ile çıkarsanız sayaç çıkış anındaki değerini korur.

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
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.

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.
ABCD
1ÜrünAdetBirim FiyatTutar
2Klavye12450,005.400,00
3Fare25180,004.500,00
4Monitör54.200,0021.000,00
5Kulaklık18650,0011.700,00
6Webcam9900,008.100,00
7USB Bellek40120,004.800,00
Sipariş TutarıExcelDepo v1.0.0
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.

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.
ABC
1AyTers SıraBir Atlayarak
2OcakHaziranOcak
3ŞubatMayısMart
4MartNisanMayıs
5NisanMart
6MayısŞubat
7HaziranOcak
AylarExcelDepo v1.0.0
İ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.

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.
ABCDE
1PersonelSatışHedefİlk Hedefi AşanSatır No
2Ayşe Yılmaz48.500,0050.000,00Mehmet Kaya3
3Mehmet Kaya51.200,0050.000,00
4Elif Demir62.000,0050.000,00
5Can Öztürk39.800,0050.000,00
6Zeynep Arslan55.400,0050.000,00
7Burak Şahin47.000,0050.000,00
Hedef KontrolExcelDepo v1.0.0
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ı.

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.
Ö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
13
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst