1. Döngü Nedir?

For döngüsü kabaca belli bir program parçasını belli bir adette tekrar etmek için kullanılan program yapılarıdır. Tabii aynı değerleri kullandığınız sürece, aynı işlemi bir defa da yapsanız bin defa da yapsanız sonuç değişmez. Ancak döngüler kendi içlerinde değerleri değiştirirler bu sayede örnek olarak A1, A2 gibi alt alta satırlara değer yazdırabilirsiniz veya iterasyon yapabilirsiniz.

Döngüler programlama dillerinin vazgeçilmez bir öğesidir. Dizi değişkenleri, yığın nesnesi gibi çoklu değer barındıran yapıların içindeki değerlere erişmek ve bu değerleri kullanarak hesaplama yapmak için de kullanılırlar.

2. For Döngüsü
a. Yapısı

For döngüsünün oldukça basit bir yapısı var. Tanımlı bir değişkenin belirli bir başlangıç değerinden belirli bir bitiş değerine kadar belirli adımlarla artım yaparak döngü içinde yer alan işlem adımlarını tekrarlar. Yazılımı:

Dim iTamsayi as Integer
For iTamsayı = BaşlangıçDeğeri To BitişDeğeri Step Değer



Next iTamsayı

Burada işleyiş şu şekildedir. Döngü For yazan satırda başlar. Bu satırda iTamsayı değişkenine bir başlangıç değeri atanır  ve sırası ile Next yazan satıra kadar olan kodlar çalıştırılır. Next yazan satıra gelindiğinde iTamsayı değişkenine Step ile tanımlanmış değer eklenir ve Bitiş değerine eşit olup olmadığı kontrol edilir. Eğer eşit değilse Next satırına kadar olan bütün işlemler tekrarlanır. Bu işlem iTamsayı değişkeni tanımlı bitiş değerine eşit veya büyük olana kadar tekrar edilir.

Bu yapı sadeleştirilebilir. Örneğin eğer artım değeri 1 ise Step Değer kısmı çıkarılabilir. En son satırdaki Next iTamsayı yazımı da sadece Next olarak güncellenebilir. Bu şekilde kısaltmalar ile en sade hali ile alttaki şekilde oluşur:

Dim iTamsayi as Integer
For iTamsayı = BaşlangıçDeğeri To BitişDeğeri



Next

Not: İç içe birden fazla For, Next döngüsü var ise Next ifadesinden sonra değişken adını yazmak okunabilirliği arttırır ve hangi For döngüsünün sonlandırıldığı daha rahat görülür.

Yine bu tarz yapılarda For satırını yazdıktan hemen sonra Next satırını yazmak bu kodu yazmayı unutmanızı engeller ve oluşabilecek hataları önler.

b. İleriye Doğru Döngü

Şimdi 1’den 20’ye kadar olan sayıları, küçükten büyüğe doğru Immediate penceresine yazdıralım. Aşağıdaki kodda turuncu renkli kısımları yazmak isteğe bağlıdır. Bu kısımları koda dahil etmeseniz de aynı sonucu alırsınız.

Sub Ana()

Dim iSayi As Integer
For iSayi = 0 To 20 Step 1

Debug.Print i

Next iSayi

End Sub

Kodu çalıştırdığınızda immediate penceresi  yandaki resimdeki gibi olacaktır.

c. Geriye Doğru Döngü

For döngüsünü tersten de çalıştırabilirsiniz. Yani ileri doğru değil, geriye doğru bir adımlama yapabilirsiniz. Bu durumda Step değişkenini tanımlamak zorundasınız. Eğer kullanmaz iseniz program hata vermeden çalışır ancak For döngüsü dikkate alınmaz ve istediğiniz sonucu elde edemezsiniz.

Sub Ana()

Dim iSayi As Integer
For iSayi = 40 To 2 Step -2

Debug.Print i

Next

End Sub

d. Basit ETOPLA Örneği

Aşağıdaki gibi bir tabloda Onur adlı öğrencinin notları toplamak isteyelim.

Sub Ana()

‘çalışma sayfası değişkeni
Dim wSayfa As Worksheet
Set wSayfa = Worksheets(1)

‘kullanılan son satırı bul
Dim lSonStr As Long
lSonStr = wSayfa.Cells(wSayfa.Rows.Count, 1).End(xlUp).Row

‘Öğrencinin toplam puanı için değişken
Dim iPuan As Integer

‘döngü için kullanılacak Satır No değişkeni
Dim lStrNo As Long
For lStrNo = 2 To lSonStr

‘1. sütundaki değer Onur ise 3. sütundaki değeri topla
If wSayfa.Cells(lStrNo, 1).Value = “Onur” Then iPuan = iPuan + wSayfa.Cells(lStrNo, 3).Value

Next lStrNo

Debug.Print iPuan

End Sub

A B C
Öğrenci Sınav Puan
Berk 1. Sınav 72
Onur 1. Sınav 22
Mustafa 1. Sınav 57
Hasan 1. Sınav 83
Berk 2. Sınav 80
Onur 2. Sınav 55
Mustafa 2. Sınav 50
Hasan 2. Sınav 90
Berk 3. Sınav 75
Onur 3. Sınav 45
Mustafa 3. Sınav 70
Hasan 3. Sınav 85

Gördüğünüz gibi döngüler yazmanız gereken program satırı adedini düşürüyor ve teker teker erişilmesi mümkün olmayan ya da oldukça uzun kodlama gerektiren işlemleri bir kaç satır ile çözmenizi sağlıyor.

e. Dizi Değişkenlerinde Döngü

Dizi değişkenlerinde alt sınır ve üst sınır değerlerini biz tanımlayabiliyorduk. Bu tarz dizilerde döngü başlangıç ve bitiş değerlerini sabit değerler yerine dizi değişkeninden alabiliriz. Ve tabii istersek ilk elemandan son elemana ya da son elemandan ilk elemana doğru ilerleyebiliriz.

Aşağıdaki örnek kodu incelerseniz dizinin üst sınırından, alt sınırına yani son elemandan ilk elemana doğru ilerleme mevcut. Kodu çalıştırdığınızda Immediate penceresi yandaki gibi oluşacaktır.

Sub Ana()

Dim sIsimler As Variant
sIsimler = Array(“Ahmet”, “Mehmet”, “Feray”, “Özge”, “Şermin”, “Aslı”)

Dim iNo As integer
For iNo=UBound(sIsimler) to LBound(sIsimler) Step -1

Debug.Print sIsimler(iNo)

Next iNo

End Sub

f. Collection Nesnelerinde Döngü

Collection nesnelerinde “count” adlı ve toplam öğe adedini barındıran bir mülk vardı. Döngüde bunu kullanabilirsiniz. Örnek olarak çalışma sayfalarındaki tüm kitaplara erişebilmek için aşağıdaki gibi bir kod kullanabilirsiniz:

Sub Ana()

Dim wSayfalar As Sheets
Set wSayfalar = ThisWorkbook.Worksheets

Dim iSyfNo As Integer

For iSyfNo = 1 To wSayfalar.Count

Debug.Print wSayfalar(iSyfNo).Name

Next

End Sub

3. For Each Döngüsü

For, Each döngüsü dizi değişkenlerinin ve Collection nesnelerinin her bir öğelesine sırayla erişmek için kullanılır. Yazılımı:

Dim oOge as Object
For Each oOge In Collection

….
….
….

Next Oge

Burada da ilk örnekte olduğu gibi “Next Oge” satırını sadece “Next” olarak yazabilirsiniz. oOge nesnesini ise Collection nesnesinin tuttuğu nesne tipinde olması daha verimli bir programlama örneğidir.

Burada çalışma mantığı, Collection olarak döngüye konulmuş nesne içindeki ilk öğe, oOge adlı değişkene atanır ve döngü içindeki kod çalıştırılır. Next satırına gelindiğinde döngü ilk satıra geçer ve bir sonraki nesne oOge değişkenine atanır. Bu işlem nesne içindeki en son öğeye kadar devam eder.

For Each döngüsü For döngüsüne kıyasla daha hızlı çalışır. Ancak sadece tek bir yönde, ilk elemandan son elemana doğru, ilerlemenize imkan tanır.

a. Collection Nesnesi Örneği

Yukarıda çalışma kitabı içindeki tüm çalışma sayfasına erişmek için kullandığım kodu bu kez For, Each döngüsü kullanarak yazalım:

Sub Ana()

Dim wSayfalar As Sheets
Set wSayfalar = ThisWorkbook.Worksheets

Dim wSayfa As Worksheet

For Each wSayfa In wSayfalar

Debug.Print wSayfa.Name

Next

End Sub

b. Dizi Değişkeni Örneği

Dizi değişkenlerinde bu yöntemi kullanabilmek için, verilerini okuyacağınız dizinin türü önemli değildir. Tam sayı, metin, kayar nokta vs. olabilir. Ancak verileri atamak için kullanacağınız öğe değişkeni mutlaka variant türünde olmalıdır.

Ek olarak siz bu değerleri okutabilirsiniz, ancak değiştiremezsiniz. Çünkü atama yaptığınız değişken dizinin elemanı değil, öğe olarak kullandığınız değişkendir.

Sub Ana()

Dim sIsimler As Variant
sIsimler = Array(“Ahmet”, “Mehmet”, “Feray”, “Özge”, “Şermin”, “Aslı”)

Dim sIsim As Variant
For Each sIsim In sIsimler

Debug.Print sIsim
‘atama dizi değişkenine değil, sIsim
‘değişkenine yapılıyor
sIsim=”Mustafa”

Next sIsim

End Sub

Yukarıdaki kodu çalıştırdığınızda Immediate penceresinde ilk dizideki isimler alt alta yazılacaktır.

Dikkat ederseniz programda sIsim=”Mustafa” ile değişkene bir değer ataması yapıyoruz ancak program çalıştırıldıktan sonra dizi içindeki değişkenlerinde herhangi bir değişiklik olmuyor. Resimdeki “Watches” penceresinde program sonunda dizi elemanlarının aldığı son değerleri görebilirsiniz.

4. Döngüden Çıkma

Bazı durumlarda For döngüsünden, döngü sona ermeden çıkmanız gerekebilir. Örnek olarak siz hangi satırda olduğunu bilmediğiniz bir değeri okutmak için tüm satırlarda arama yapabilir ancak istediğiniz değere ulaştığınızda döngüyü daha fazla devam ettirmek istemeyebilirsiniz. Bu durumda Exit For ifadesini kullanmanız gerekir.

Sub Ana()

Dim sIsimler As Variant
sIsimler = Array(“Ahmet”, “Mehmet”, “Feray”, “Özge”, “Şermin”, “Aslı”)

Dim sIsim As Variant
For Each sIsim In sIsimler

Debug.Print sIsim
if sIsim=”Özge” then Exit For

Next sIsim

End Sub

Yukarıdaki kodu çalıştırdığınızda döngü başlayacak ve sırası ile dizi değişkeni içindeki değerleri Immediate penceresine yazdırılacaktır. “Özge” öğesine gelindiğinde önce yazdırma işlemi yapılacak, sonrasında öğenin değeri “if” ile belirtilmiş değer ile kıyaslanacak ve aynı değer olduğundan “Exit For” ifadesi çalıştırılacak döngüden çıkılacaktır. Bu nedenle dizi değişkeni içindeki tüm değerler yazdırılmayacaktır. Program sonunda Immediate penceresinin ekran görüntüsünü de yan tarafta görebilirsinz.

İlginizi Çekebilecek Diğer Yazılar
Etiketler: , ,

Leave a Reply