Koşullar programlamada çok faydalıdır çünkü belirlenen kriterlere bağlı olarak eylemler gerçekleştirmemize izin verirler (IF işlevi Excel ile aynı prensip kullanılır).
VBA If...Then...Else deyimi, belirtilen koşulun doğru olup olmadığına bağlı olarak bir dizi deyimi yürütür. Koşul (mantıksal test) karşılanırsa, bir dizi eylem yürütülür. Ancak koşulun yanlış olması durumunda alternatif bir dizi eylem gerçekleştirilir.
Ancak okunabilirlik açısından, birden fazla düzeyde iç içe geçmiş If...Then...Else ifadeleri yerine Select Case ifadesini kullanabilirsiniz.
Yani koşulu belirleyen en önemli fonksiyon IF'dir ve şimdi nasıl çalıştığını göreceğiz:
If [BURADAKİ SÜRE] Then '=> Koşul doğruysa SONRA '"Doğru" ise talimatlar Else '=> AKSİ TAKDİRDE '"Yalan" ise talimatlar End If
Hadi pratik yapalım ve değişken dersinde kullandığımız örneğe geri dönelim. Bu prosedürün amacı, F5 hücresinde belirtilen dizedeki değeri görüntüleyecek bir iletişim kutusu görüntülemekti:
F5 hücresine harf yazarsanız hataya neden olur. Bunu önlemek istiyoruz.
Sub variables() 'Değişkenlerin beyanı Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Değişkenlere değer atama row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'İletişim kutusu MsgBox last_name & " " & first_name & ", " & age & "yıllar" End Sub
Kod çalıştırılmadan önce F5 hücresine girilen değerin sayı olup olmadığını kontrol edecek bir koşul ekleyelim.
Durumu test etmek için IsNumeric işlevini kullanacağız:
Sub variables() 'Parantez içindeki değer (F5 hücresi) sayısal ise (Dolayısıyla IF KOŞULU DOĞRUDUR), o zaman 'SONRA aşağıdaki talimatları uygulayın If IsNumeric(Range("F5")) Then 'Değişkenlerin beyanı Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Değişkenlere değer atama row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'İletişim kutusu MsgBox last_name & " " & first_name & ", " & age & "yıllar" End If End Sub
Belirlediğimiz koşulun karşılanmaması durumunda da talimat yazmamız gerekir:
Sub variables() If IsNumeric(Range("F5")) Then 'Koşul yerine getirilirse 'Değişkenlerin beyanı Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Değişkenlere değer atama row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'İletişim kutusu MsgBox last_name & " " & first_name & ", " & age & "yıllar" Else 'Koşul karşılanmıyorsa 'İletişim kutusu: uyarı MsgBox "Girilen değer" & Range("F5") & "doğru değil!" 'F5 hücresinin içeriğini silin Range("F5").ClearContents End If End Sub
Artık sayısal olmayan bir değer herhangi bir soruna neden olmayacaktır.
16 satırlık veri içeren dizimizle çalışırken, bir sonraki adımımız row_number değişkeninin "2'den büyük veya eşit" ve "17'den küçük veya eşit" olup olmadığını kontrol etmek olacaktır.
Ama önce karşılaştırma operatörlerine bakalım:
= | Kesinlikle |
<> | tam olarak değil |
< | daha az |
<= | küçük veya eşit |
> | bundan fazla |
>= | büyük veya eşit |
ve bu kullanışlı operatörler:
AND | [koşul1] AND [koşul2] İki koşulun karşılanması gerekiyor |
OR | [koşul1] OR [koşul2] 2 koşuldan en az 1'inin karşılanması gerekir |
NOT | NOT [koşul1] Koşul yerine getirilmemeli |
Şimdi yukarıdaki AND koşullarından birini karşılaştırma operatörleri arasına ekleyelim:
Sub variables() If IsNumeric(Range("F5")) Then 'Sayısal bir değer ise Dim last_name As String, first_name As String, age As Integer, row_number As Integer row_number = Range("F5") + 1 If row_number >= 2 And row_number <= 17 Then 'Doğru numara ise last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "yıllar" Else 'Numara doğru değilse MsgBox "Girilen numara" & Range("F5") & "Doğru değil!" Range("F5").ClearContents End If Else 'Sayısal bir değer değilse MsgBox "Girilen değer" & Range("F5") & "doğru değil!" Range("F5").ClearContents End If End Sub
Makromuzu daha pratik hale getirmek istiyorsak 17'yi satır sayısını tutacak bir değişkenle değiştirebiliriz. Bu, her seferinde bu sınırı değiştirmek zorunda kalmadan diziye satır ekleyip çıkarmamıza olanak tanır.
Bunu yapabilmek için nb_rows değişkenini oluşturup bu fonksiyonu eklememiz gerekiyor.
Bu durumda, Excel'ın kendisindeki COUNTA fonksiyonuna benzer olan WorksheetFunction.CountA fonksiyonunu kullanacağız.
Bu fonksiyonun ilk sütundaki boş olmayan hücrelerin sayısını saymasını ve elde edilen değeri nb_rows değişkenine yazmasını istiyoruz:
Sub variables() If IsNumeric(Range("F5")) Then 'EĞER NUMARASI Dim last_name As String, first_name As String, age As Integer, row_number As Integer Dim nb_rows As Integer row_number = Range("F5") + 1 nb_rows = WorksheetFunction.CountA(Range("A:A")) 'Satır sayısını sayma işlevi If row_number >= 2 And row_number <= nb_rows Then 'GEÇERLİ NUMARA İSE last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "yıllar" Else 'NUMARA YANLIŞ İSE MsgBox "Girilen numara" & Range("F5") & "Doğru değil!" Range("F5").ClearContents End If Else 'NUMARA DEĞİLSE MsgBox "Girilen değer" & Range("F5") & "doğru değil!" Range("F5").ClearContents End If End Sub
ElseIf, IF komutundan sonra ek koşulların eklenmesini mümkün kılar:
If [DURUM 1] Then '=> EĞER koşul 1 doğruysa SONRA 'Talimatlar 1 ElseIf [DURUM 2] Then '=> EĞER koşul 1 yanlış ancak koşul 2 doğruysa O ZAMAN 'Talimatlar 2 Else '=> AKSİ TAKDİRDE 'Talimatlar 3 End If
KOŞUL 1 doğruysa, Bildirim 1 yürütülecek ve IF deyiminden çıkılacaktır (IF ile başlar ve End If ile biter). KOŞUL 2 false değerini döndürürse, İfade 2 yürütülür ve false değerini döndürürse, Bildirim 3 (Else altında) yürütülür.
A1 hücresinde 1'den 6'ya kadar olan notların yer aldığı bir örneği ve B1 hücresinde bu notlara ilişkin bir yorumu görebilirsiniz:
Sub scores_comment() 'Değişkenler Dim note As Integer, score_comment As String note = Range("A1") 'Alınan puana göre yorumlar If note = 6 Then score_comment = "Harika skor!" ElseIf note = 5 Then score_comment = "İyi bir nokta" ElseIf note = 4 Then score_comment = "Tatmin edici puan" ElseIf note = 3 Then score_comment = "Yetersiz puan" ElseIf note = 2 Then score_comment = "Kötü puan" ElseIf note = 1 Then score_comment = "Korkunç skor" Else score_comment = "Sıfır puan" End If 'B1 hücresindeki yorum Range("B1") = score_comment End Sub
If'i birçok ElseIf ifadesiyle kullanmanın bir alternatifi vardır, yani bu tür durumlar için daha uygun olan Select Case komutu.
Select Case operatörünü içeren bir makro örneğini düşünün:
Sub scores_comment() 'Değişkenler Dim note As Integer, score_comment As String note = Range("A1") 'Alınan puana göre yorumlar Select Case note '=> test puanı (puan) Case Is = 6 '=> eğer değer = 6 ise score_comment = "Harika skor!" Case Is = 5 '=> eğer değer = 5 ise score_comment = "İyi bir nokta" Case Is = 4 '=> eğer değer = 4 ise score_comment = "Tatmin edici puan" Case Is = 3 '=> eğer değer = 3 ise score_comment = "Yetersiz puan" Case Is = 2 '=> eğer değer = 2 ise score_comment = "Kötü puan" Case Is = 1 '=> eğer değer = 1 ise score_comment = "Korkunç skor" Case Else '=> eğer değer yukarıdakilerden herhangi birine eşit değilse score_comment = "Sıfır puan" End Select 'B1 hücresindeki yorum Range("B1") = score_comment End Sub
Diğer karşılaştırma operatörlerini de kullanabileceğimizi belirtmekte fayda var:
Case Is >= 6 'değer >= 6 ise
Farklı anlamlara sahip örnekler:
Case Is = 6, 7 'değer = 6 veya 7 ise Case Is <> 6, 7 'değer 6 veya 7'ye eşit değilse
Case 6 To 10 'if değer = 6'dan 10'a kadar herhangi bir sayı