Özellik ikonu

If-Else-End If

İndirme izni yok

Genel Bakış

If-Else-End If (If...Then...Else), bir koşulu sınayıp sonucuna göre farklı kod bloklarını çalıştıran VBA karar yapısıdır. Koşul Doğru (True) ise Then bloğu, değilse ElseIf ya da Else bloğu çalışır. Not geçme durumu, prim kademesi, stok uyarısı gibi makro içindeki her türlü ayrımı bu yapıyla kurarsınız.

Söz dizimi​

Blok biçimi birden çok satıra yayılır ve End If ile kapanır. Tek satırlık biçimde ise tüm deyim aynı satırda yazılır ve End If gerekmez.
VBA 11 satır
' Blok biçimi
If koşul1 Then
    ' koşul1 Doğru ise çalışacak deyimler
ElseIf koşul2 Then
    ' koşul2 Doğru ise çalışacak deyimler
Else
    ' hiçbir koşul Doğru değilse çalışacak deyimler
End If

' Tek satırlık biçim
If koşul Then deyim [Else deyim]
  • koşul1: Doğru ya da Yanlış sonucu veren ifade; zorunludur. Sayısal bir ifadede 0 Yanlış, 0 dışındaki her değer Doğru sayılır.
  • Then: Koşuldan sonra gelen anahtar sözcük; zorunludur.
  • ElseIf koşul2 Then: Önceki koşullar Yanlış çıkarsa sınanacak ek koşul; isteğe bağlıdır, istediğiniz kadar yazabilirsiniz.
  • Else: Hiçbir koşul Doğru değilse çalışacak blok; isteğe bağlıdır, en sonda yer alır ve yalnız bir kez yazılır.
  • End If: Blok biçiminde zorunludur; tek satırlık biçimde yazılmaz.

Koşullar nasıl değerlendirilir​

VBA koşulları yukarıdan aşağıya sırayla sınar ve ilk Doğru çıkan bloğu çalıştırıp yapıdan çıkar. Sonraki ElseIf ve Else bölümlerine hiç bakılmaz. Bu yüzden aralık sınamalarında koşulları büyükten küçüğe (ya da küçükten büyüğe) doğru, birbirini kapsayacak sırada yazmalısınız. Örneğin 100000 ve üzerini, ardından 50000 ve üzerini sınarsanız ikinci koşula yalnızca 100000 altındaki değerler ulaşır.

Hiçbir koşul Doğru değilse ve Else yoksa hiçbir blok çalışmaz, kod End If sonrasına geçer.

Koşullarda kullanılan işleçler​

  • Karşılaştırma: =, <>, <, >, <=, >= işleçleriyle değerleri karşılaştırırsınız. Burada = işareti atama değil karşılaştırma yapar.
  • Mantıksal işleçler: And (ve), Or (ya da), Not (değil) ile birden çok koşulu birleştirirsiniz. VBA bu işleçlerde kısa devre yapmaz; iki taraf da her zaman değerlendirilir.
  • Metin ve nesne sınamaları: Like ile desen karşılaştırması, Is Nothing ile nesne atanmış mı kontrolü, IsEmpty, IsNumeric, IsError ile hücre içeriği kontrolü yapılır.
  • İç içe yapı: Bir bloğun içine başka bir If bloğu yazabilirsiniz; her blok kendi End If satırıyla kapanmalıdır.

1. Geçti-Kaldı kararı (If-Else)​

Sayfada öğrenci adları ve notlar var. Not 50 ve üzerindeyse Sonuç sütununa Geçti, değilse Kaldı yazılacak. Kodu standart bir modüle (Ekle > Modül) yapıştırın ve çalıştırın.
VBA 17 satır
Option Explicit

Sub NotSonucuYaz()
    Dim ws As Worksheet
    Dim i As Long

    Set ws = ThisWorkbook.Worksheets("Not Listesi")

    ' 2. satırdan 7. satıra kadar her öğrenciyi değerlendir
    For i = 2 To 7
        If ws.Cells(i, 2).Value >= 50 Then
            ws.Cells(i, 3).Value = "Geçti"
        Else
            ws.Cells(i, 3).Value = "Kaldı"
        End If
    Next i
End Sub
If-Else-End If
Formülünü incelemek için bir hücre seçin.
ABC
1ÖğrenciNotSonuç
2Ahmet Yılmaz72Geçti
3Ayşe Kaya45Kaldı
4Mehmet Demir50Geçti
5Elif Şahin38Kaldı
6Can Öztürk91Geçti
7Zeynep Aydın49Kaldı
Not ListesiExcelDepo v1.0.0
Makro her satırda notu 50 ile karşılaştırır. İlk öğrencinin sonucu Geçti, ikinci öğrencinin sonucu Kaldı olur. Notu tam 50 olan Mehmet Demir için sonuç Geçti çıkar, çünkü koşulda >= işleci kullanıldı. Sınır değerlerin hangi tarafa düşeceğini her zaman >= ve > farkına dikkat ederek belirleyin.

2. Prim kademesi (ElseIf ile çok koşul)​

Satış tutarına göre dört kademe vardır: 100000 ve üzeri Altın, 50000 ve üzeri Gümüş, 20000 ve üzeri Bronz, altı Yok. Makro hem kademeyi hem prim oranını yazar. Kodu standart bir modüle yapıştırıp çalıştırın.
VBA 34 satır
Option Explicit

Sub PrimKademesiYaz()
    Dim ws As Worksheet
    Dim i As Long
    Dim tutar As Double
    Dim kademe As String
    Dim oran As Double

    Set ws = ThisWorkbook.Worksheets("Satış Primi")

    For i = 2 To 7
        tutar = ws.Cells(i, 2).Value

        ' Koşullar büyükten küçüğe doğru sıralanır
        If tutar >= 100000 Then
            kademe = "Altın"
            oran = 0.1
        ElseIf tutar >= 50000 Then
            kademe = "Gümüş"
            oran = 0.06
        ElseIf tutar >= 20000 Then
            kademe = "Bronz"
            oran = 0.03
        Else
            kademe = "Yok"
            oran = 0
        End If

        ws.Cells(i, 3).Value = kademe
        ws.Cells(i, 4).Value = oran
        ws.Cells(i, 4).NumberFormat = "0%"
    Next i
End Sub
If-Else-End If
Formülünü incelemek için bir hücre seçin.
ABCD
1PersonelSatış TutarıKademePrim Oranı
2Burcu Arslan125.000,00Altın10%
3Murat Koç64.500,00Gümüş6%
4Selin Yıldız18.000,00Yok0%
5Okan Çelik52.000,00Gümüş6%
6Deniz Acar99.999,00Gümüş6%
7Hakan Polat20.000,00Bronz3%
Satış PrimiExcelDepo v1.0.0
Koşullar yukarıdan aşağıya sınandığı için her tutar yalnızca kendi kademesine düşer. Burcu Arslan için kademe Altın, prim oranı 10% olur. Deniz Acar'ın tutarı 100000'in hemen altında kaldığı için kademesi Gümüş çıkar. Tam 20000 olan Hakan Polat için kademe Bronz olarak yazılır. Koşulların sırasını tersine çevirirseniz (önce >= 20000 sınarsanız) 20000 ve üzerindeki tüm tutarlar Bronz kademesine düşer, Altın ve Gümüş kademeleri hiç oluşmaz.

3. Stok uyarısı (And, boş hücre ve tek satırlık If)​

Sayfada ürün, mevcut stok ve asgari stok bilgileri var; Zımba satırında stok hücresi bilerek boş bırakıldı. Makro önce boş hücreyi ayıklar, sonra stok durumunu belirler; tükenen ürünün adını da kalın yapar. Kodu standart bir modüle yapıştırıp çalıştırın.
VBA 32 satır
Option Explicit

Sub StokDurumuYaz()
    Dim ws As Worksheet
    Dim i As Long
    Dim stok As Variant
    Dim asgari As Double
    Dim durum As String

    Set ws = ThisWorkbook.Worksheets("Stok Kontrol")

    For i = 2 To 7
        stok = ws.Cells(i, 2).Value
        asgari = ws.Cells(i, 3).Value

        ' Boş hücre önce denetlenmeli; çünkü boş değer 0'a eşit sayılır
        If Len(stok) = 0 Then
            durum = "Stok girilmemiş"
        ElseIf stok = 0 Then
            durum = "Tükendi"
        ElseIf stok > 0 And stok < asgari Then
            durum = "Sipariş ver"
        Else
            durum = "Yeterli"
        End If

        ws.Cells(i, 4).Value = durum

        ' Tek satırlık If: End If gerekmez
        If durum = "Tükendi" Then ws.Cells(i, 1).Font.Bold = True
    Next i
End Sub
If-Else-End If
Formülünü incelemek için bir hücre seçin.
ABCD
1ÜrünStokAsgari StokDurum
2Kalem12050Yeterli
3Defter030Tükendi
4Silgi1540Sipariş ver
5Zımba20Stok girilmemiş
6Dosya8060Yeterli
7Klasör2525Yeterli
Stok KontrolExcelDepo v1.0.0
Kalem için durum Yeterli, Defter için Tükendi, Silgi için Sipariş ver olur. Stok hücresi boş olan Zımba satırında Stok girilmemiş yazılır; boş denetimi 0 denetiminden önce yapılmasaydı bu satır yanlışlıkla tükendi sayılırdı. Stoku asgariye eşit olan Klasör için sonuç Yeterli çıkar, çünkü koşulda < işleci kullanıldı. Tükendi durumundaki ürünün adı tek satırlık If ile kalın yapılır.

Kullanırken dikkat edin​

  • End If'i unutmayın: Then sözcüğünden sonra aynı satırda deyim yazmazsanız VBA blok biçimi bekler ve End If arar. Eksik olursa kod derlenirken "Block If without End If" hatası alırsınız. Then ile aynı satıra deyim yazarsanız tek satırlık biçim olur ve End If yazmamanız gerekir.
  • ElseIf tek sözcüktür: ElseIf bitişik yazılır. Else ve If'i ayrı yazarsanız ikinci If, Else bloğunun içinde iç içe yeni bir yapı sayılır ve kendi End If satırını ister.
  • Koşulların sırası sonucu değiştirir: İlk Doğru çıkan koşul çalıştığı için aralık sınamalarında en dar ya da en yüksek koşulu başa yazın. Sırayı yanlış kurarsanız sonraki koşullar hiç çalışmaz ve hata vermeden yanlış sonuç üretirsiniz.
  • Boş hücre ve hata değerleri: Boş bir hücrenin değeri 0'a da boş metne de eşit sayılır; bu yüzden boş denetimini (IsEmpty ya da Len) sayısal karşılaştırmadan önce yapın. Hücrede #N/A gibi bir hata değeri varsa karşılaştırma "Type mismatch" hatası verir; önce IsError ile sınayın.
  • Metin karşılaştırması harf duyarlıdır: Varsayılan olarak "Ankara" ile "ANKARA" eşit sayılmaz. Büyük küçük harf farkını yok saymak için UCase ya da LCase ile iki tarafı da aynı biçime getirin ya da modülün başına Option Compare Text yazın. Türkçe İ ve ı harflerinde dönüşümün beklediğiniz gibi olmayabileceğini unutmayın.
  • Çok sayıda eşitlik varsa Select Case: Aynı değişkeni birçok değerle karşılaştırıyorsanız Select Case daha okunaklıdır. Tek bir değer seçecekseniz IIf işlevi kullanılabilir; ancak IIf her iki sonucu da değerlendirdiği için hata üretebilecek ifadelerde güvenli değildir.
  • İlgili konular:
    • Select Case: Tek ifadeyi çok sayıda değerle karşılaştıran karar yapısı.
    • IIf: Tek satırda Doğru ve Yanlış sonucu seçen VBA işlevi.
    • For...Next: Satırlar üzerinde döngü kurarken If ile birlikte kullanılır.
    • And, Or, Not: Koşulları birleştiren mantıksal işleçler.
    • IsEmpty, IsNumeric, IsError: Hücre içeriğini koşulda denetleyen işlevler.
    • Like: Metin desenlerini karşılaştıran işleç.
    • Excel işlevleri: EĞER, VE, YA DA, DEĞİL, EĞERHATA, ÇOKEĞER
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
11
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst