1. DO Döngüsü

VBA üzerine bir önceki yazımda FOR döngülerini göstermiştim. Bu yazımda farklı bir döngü olan DO döngülerinden bahsetmek istiyorum. DO kelime anlamı ile YAP demektir. Kısaca belli bir kod aralığını belirli bir şart sağlanana kadar tekrar etmeye yarar.

Eğer programlamaya yeni başladı iseniz bu yazıyı okumadan önce VBA Giriş yazımı okumanızı şiddetle tavsiye ediyorum.

2. Yazılışı

DO döngüleri her zaman DO ifadesi ile başlar ve LOOP ifadesi ile son bulur. Ancak bu iki ifade tek başına bir döngü kurmak için yetersizdir. Döngü için bir de bu döngünün ne kadar tekrar edeceğini belirten bir ifade daha kullanılmalıdır. DO döngülerinde 2 tane ifade kullanılabilir. WHILE ve UNTIL.

WHILE kelime anlamı ile iken olarak çevrilebilir. Örnek olarak bizim döngü içinde değişen bir değişkenimiz olsun. Bu değişken belli değerler arasında iken veya belli bir değer haricinde bir değer iken bu döngüyü devam ettir diyebiliriz.

UNTIL olana kadar olarak çevrilebilir. Yine döngü içinde değeri değişen bir değişkenimiz olsun, bu değişken belirli bir değere ulaşana kadar bu döngüyü devam ettir komutu verebiliriz.

Bu iki anahtar kelimenin kullanıldığı yer de değişebilir. Örnek olarak DO WHILE…LOOP gibi WHILE anahtar kelimesinin başta olduğu bir döngü kurabileceğimiz gibi DO… LOOP WHILE gibi sonda olan bir döngü de kurabiliriz.

Bu iki yazılımın temel farkı eğer WHILE anahtar kelimesi en başta ise döngü başlamadan önce tanımlanan şart kontrol edilir. Eğer bu şart sağlanır ise döngüye devam edilir. Eğer sağlanmaz ise döngü hiç çalıştırılmaz.

Eğer WHILE anahtar kelimesi sonda yer alırsa, şart ne olursa olsun döngü en az bir adım çalıştırılır. Döngünün sonunda şart kontrol edilir, eğer sağlanır ise döngüye devam edilir. Sağlanmaz ise döngüden çıkılır.

Siz bu kontrol anahtar kelimelerini kullanmadan da bir döngü yazabilirsiniz. Bu durumda döngüyü durduracak kodu döngü içinde tanımlamanız gerek.

Bu ön bilgiden sonra gelin beraber bu yazılım farklarına ve nasıl çalıştığına bakalım:

3. Uygulama
a. Döngü Sonunda WHILE Örneği

İlk örneğimizde WHILE şartının döngünün sonunda yer aldığı bir deneme yapalım.

Sub DoLoop1()

Dim i As Integer
i = 0

Do

i = i + 1
Debug.Print i

Loop While i < 10

End Sub

Bu döngüde öncelikle i adında bir tamsayı değişkeni tanımlıyoruz ve buna 0 değeri atıyoruz. Sonra döngü içinde bu değere her adımda 1 ekliyoruz. i değerini Immediate penceresine yazdırıyoruz Döngünün sonunda ise i değerin kontrol ediyoruz, eğer 10’dan küçük ise döngünün başına dönüyoruz.

Programı çalıştırdığınız zaman Immediate penceresi aşağıdaki gibi gözükecek:

Baktığımızda döngünün kendinden beklendiği gibi çalıştığını göreceğiz. Ancak burada ince bir ayrıntı var. Bu ayrıntıyı daha net açıklayabilmek adına i değişkenine ilk değer olarak 0 yerine 10 değerini atayalım:

Sub DoLoop1()

Dim i As Integer
i = 10

Do

i = i + 1
Debug.Print i

Loop While i < 10

End Sub

Bu kodu çalıştırdığımızda program i’nin ilk değerini kontrol etmeden döngüye girecek, i’nin değerini 1 arttıracak ve 11 olacak. Bu değeri immediate penceresine yazacak. Döngü sonunda i değeri 11<10 kontrolünü yapacak ve doğru olmadığından döngüden çıkacak. Ancak şart daha ilk başta doğru olmamasına rağmen döngü bir adım çalışmış olduğundan Immediate penceresinde 11 rakamını göreceksiniz.

b. Döngü Başında WHILE Örneği

Şimdi WHILE döngüsünü döngünün başına yazarak bir deneme yapalım:

Sub DoLoop1()

Dim i As Integer
i = 0

Do While i < 10

i = i + 1
Debug.Print i

Loop

End Sub

Bu döngüde de bir önceki örnekte olduğu gibi i adında bir tamsayı değişkeni tanımlıyoruz ve buna 0 değeri atıyoruz. Program döngü başına geldiğinde i’nin değerini kontrol ediyor, i 0 değerine saip olduğu için 0<10 ifadesi doğru döndürüyor ve döngü içine giriyor. Burada her adımda i’nin değerini 1 arttırıp Immediate penceresine yazdırıyor. Bu işlem i 10 değerini alana kadar tekrar ediyor.

Program sonunda Immediate penceresine bakarsanız bir önceki kod ile aynı sonucun elde edildiğini görürsünüz.

Bir önceki kodla farkını görmek adına i değerine başlangıçta o yerine 10 değerini atayarak programı çalıştıralım. Bu durumda döngü başına geldiğimizde i’nin değerini 10 ile kıyaslıyor, i 10 olduğundan 10<10 kıyaslaması yanlış döndürüyor ve döngüye girmeden program son buluyor. Bu durumda Immediate penceresinde herhangi bir değer göremezsiniz.

c. UNTIL Örneği

UNTIL şartında değişkenimiz belli bir değere ulaşana kadar döngüyü devam ettirebiliriz.

Sub DoLoop1()

Dim i As Integer
i = 10

Do

i = i + 1
Debug.Print i

Loop Until i > 10

End Sub

Bu kodu çalıştırdığımızda program i’nin ilk değerini kontrol etmeden döngüye girecek, i’nin değerini 1 arttıracak ve 1 olacak. Bu değeri Immediate penceresine yazacak. Döngü sonunda i değeri 1>10 kontrolünü yapacak, doğru olmadığından döngüye devam edecek. Bu işlem i değeri 10’dan büyük bir değer olana kadar devam edecek. Bu durumda i 11 olduğunda döngü sona erecektir.

Kodu çalıştırdığınızda Immediate penceresi aşağıdaki gibi olacaktır.

d. Döngü Bitmeden Döngüden Çıkmak

Bazı durumlarda döngü bitmeden döngüyü sonlandırmak isteyebilirsiniz. Örnek olarak iterasyon hesaplamalarını gösterebiliriz. Siz iterasyon sonucunun 0,001’den küçük olmasını talep edebilirsiniz. ve Çoğu durumda yazmış olduğunuz formül hızlıca bu değerin altını elde edebilir. Ancak bazı durumlarda bu değere ulaşması çok çok uzun sürebilir ve hatta mümkün olmayabilir. Bu durumda bir sayaç kullanarak döngü kendini belirli bir adet tekrar ettiğinde döngüden çık diyebilirsiniz.

Ya da Excel sayfasında bir sütunda tam olarak olup olmadığını bilmediğiniz bir değeri aradığınızı düşünelim. Döngünün son satıra kadar devam etmesini isteriz ancak aradığımız değeri bulduğumuzda döngüyü devam ettirmemize gerek kalmaz ve döngüyü sonlandırmamız gerekir.

Veya UNTIL/WHILE anahtar kelimelerini kullanmadan bir döngü yazabilirsiniz. Bu durumda döngüyü durdurmak için de bir kod yazmanız gerek.

Bu gibi durumda kullanmanız gereken anahtar kelime Exit Do. Ben burada biraz mantıksız bir işlem yapacağım.

Sub DoLoop1()

Dim i as integer : i = 0

Do

i = i + 5
Debug.Print i

If i = 100 Then Exit Do

Loop Until i < 5 ‘burada Until i<5 kısmını kaldırarak da döngü tanımlayabiliriz

End Sub

Yukarıdaki kodu çalıştırdığımzda i değişkenine 0 atıyoruz ve döngüye giriyoruz. Döngüde ilk adım olarak i değerine 5 ekliyoruz ve değerini Immediate penceresine yazdırıyoruz. Artık i değerimiz 5. Sonrasında i değerini’nin 100’e eşit olup olmadığını kontrol ediyoruz. Olmadığından döngüye devam ediliyor. Döngü sonunda 5<5 kıyaslaması yapılıyor ve bu kıyaslama yanlış olduğundan döngünün başına dönüyoruz. 

Bir sonraki aşamada i 10 değerini alacak ve 10<5 şartı yine sağlanamayacak. Zaten buradaki sorun döngünün sonundaki şartın hiç bir zaman sağlanamayacak olması. Eğer burada bir Exit Do kullanmazsak kod sonsuz döngüye girecek ve bilgisayarı kitlemeye kadar varabilecek sorunlar yaratabilecektir.

Biz bu örnekte If kıyaslaması kullandık, i değeri 100 olduğunda bu kıyaslama doğru olacağından If içindeki ifade Exit Do çalıştırılarak döngünde çıkılacak.

d. Dikkat Edilmesi Gereken Hususlar

Do döngüsünü yazarken ilk husus kontrol için kullanacağınız anahtar kelimeyi döngünün başında mı sonunda mı kullanmanız gerektiği. Bunun için ilk dikkat etmeniz gereken konu, kontrol etmek istediğiniz değişkenin ilk değeri. Bu değeri döngüden önce siz atadıytsanız ya da program çalışırken bu değişkenin en son hangi değeri aldığından eminseniz kontrolü döngünün sonuna koyabilirsiniz. Ancak bu değişkenin program çalışırken alacağı değer değişken ise döngünün başına koymanızda fayda var.

Örnek olarak siz bir hücredeki rakam değerini okuyor ve bu rakam değerini bir metne dönüştürüp her zaman 5 haneden oluşan görsel bir metin elde etmek istiyorsanız, misal rakam 100 ise 00100 veya 1 ise 00001 gibi bir metin elde etmek istiyorsanız bu şartı döngünün başında kullanmanız daha doğru olur.

Dikkat etmeniz gereken ikinci husus ise her ne olursa olsun, gözden kaçırabileceğiniz konular olduğunu dikkate alarak kodu ilk yazdığınızda şartı kontrol ettiğiniz satıra bir durdurma eklemenizde veya belirli bir tekrardan sonra döngüden çıkmanızı sağlayacak bir Exit Do komutu kullanmanızda fayda var.

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

Leave a Reply