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.
Hiçbir koşul Doğru değilse ve Else yoksa hiçbir blok çalışmaz, kod End If sonrasına geçer.
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.
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.
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.
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.| A | B | C | |
|---|---|---|---|
| 1 | Öğrenci | Not | Sonuç |
| 2 | Ahmet Yılmaz | 72 | Geçti |
| 3 | Ayşe Kaya | 45 | Kaldı |
| 4 | Mehmet Demir | 50 | Geçti |
| 5 | Elif Şahin | 38 | Kaldı |
| 6 | Can Öztürk | 91 | Geçti |
| 7 | Zeynep Aydın | 49 | Kaldı |
Not ListesiExcelDepo v1.0.0
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.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Personel | Satış Tutarı | Kademe | Prim Oranı |
| 2 | Burcu Arslan | 125.000,00 | Altın | 10% |
| 3 | Murat Koç | 64.500,00 | Gümüş | 6% |
| 4 | Selin Yıldız | 18.000,00 | Yok | 0% |
| 5 | Okan Çelik | 52.000,00 | Gümüş | 6% |
| 6 | Deniz Acar | 99.999,00 | Gümüş | 6% |
| 7 | Hakan Polat | 20.000,00 | Bronz | 3% |
Satış PrimiExcelDepo v1.0.0
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.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Stok | Asgari Stok | Durum |
| 2 | Kalem | 120 | 50 | Yeterli |
| 3 | Defter | 0 | 30 | Tükendi |
| 4 | Silgi | 15 | 40 | Sipariş ver |
| 5 | Zımba | 20 | Stok girilmemiş | |
| 6 | Dosya | 80 | 60 | Yeterli |
| 7 | Klasör | 25 | 25 | Yeterli |
Stok KontrolExcelDepo v1.0.0
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