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ı