TOP

VBA-Ders 7.1. Koşullar (Koşullar)

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.


Eğer...O zaman...Başka

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
NOTNOT [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

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

Select Vaka

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ı