Genel Bakış
IIf (Immediate If), verilen koşulu değerlendirip koşul Doğru (True) ise bir değeri, Yanlış (False) ise başka bir değeri döndüren VBA işlevidir. Bir değişkene ya da hücreye atanacak değeri tek satırda seçmenizi sağlar; If...Then...Else bloğunun kısa bir alternatifidir.
Önemli bir ayrıntı: IIf her çağrıldığında TruePart ve FalsePart ifadelerinin ikisini de hesaplar. Koşul hangi sonucu seçerse seçsin diğer ifade de çalıştırılır. Bu nedenle ifadelerden biri hata üretiyorsa (örneğin sıfıra bölme ya da var olmayan bir nesneye erişim) koşul o dalı seçmese bile çalışma zamanı hatası oluşur.
Makro her satırda koşulu sınar. Ayşe Yılmaz için D2 hücresine Hedef tamam, Mehmet Kaya için D3 hücresine Hedef altında yazılır. Satış ile hedefin eşit olduğu Can Öztürk satırında (D5) sonuç Hedef tamam olur, çünkü koşulda büyük eşit işleci kullanılmıştır.
Dizüstü Bilgisayar satırında iskonto oranı C2 hücresinde 10%, net tutar D2 hücresinde 16.650,00 olur. Klavye satırında hiçbir kademe sağlanmadığı için C4 hücresi 0% değerini alır ve net tutar D4 hücresinde 850,00 çıkar. İç içe IIf, iki kademe için yeterince okunaklıdır; kademe sayısı arttıkça Select Case kullanmak daha uygundur.
Kalem Seti için birim fiyat D2 hücresinde 105,00, durum E2 hücresinde Stokta var olur. Adedi sıfır olan Dosya Klasörü satırında bölme hiç yapılmaz; D4 hücresi 0,00, E4 hücresi Stokta yok değerini alır. Aynı bölmeyi IIf içine koysaydınız, koşul Doğru olsa bile bölme ifadesi de hesaplanacağı için makro hata vererek dururdu.
Söz dizimi
IIf işlevi üç bağımsız değişkenle çağrılır:IIf(Expression, TruePart, FalsePart)
- Expression: Değerlendirilecek koşul. Sonucu Doğru ya da Yanlış olmalıdır. Zorunludur.
- TruePart: Koşul Doğru ise döndürülecek değer ya da ifade. Zorunludur.
- FalsePart: Koşul Yanlış ise döndürülecek değer ya da ifade. Zorunludur.
Dönüş değeri ve çalışma biçimi
IIf, Variant türünde bir değer döndürür. Koşul Doğru ise TruePart, Yanlış ise FalsePart sonucu döner. Sonucu bir sayı değişkenine ya da hücreye atayabilir, bir metinle birleştirebilir veya başka bir işlevin bağımsız değişkeni olarak kullanabilirsiniz.Önemli bir ayrıntı: IIf her çağrıldığında TruePart ve FalsePart ifadelerinin ikisini de hesaplar. Koşul hangi sonucu seçerse seçsin diğer ifade de çalıştırılır. Bu nedenle ifadelerden biri hata üretiyorsa (örneğin sıfıra bölme ya da var olmayan bir nesneye erişim) koşul o dalı seçmese bile çalışma zamanı hatası oluşur.
IIf ile If...Then...Else karşılaştırması
- IIf: Bir değer seçip onu doğrudan atamak ya da başka bir ifadenin içinde kullanmak için uygundur. Kısa ve okunaklıdır.
- If...Then...Else: Dallardan yalnızca biri çalışır. Birden çok satırlık işlem yapılacaksa, dallardan biri hata verebiliyorsa ya da yan etkisi olan bir çağrı varsa bunu tercih edin.
- Select Case: İki değil, çok sayıda seçenek arasından seçim yapılacaksa iç içe IIf kullanmaktan daha okunaklıdır.
1. Satış hedefini kontrol etme
Sayfada personelin satışları ve hedefleri var. Makro, her satırda satışı hedefle karşılaştırıp D sütununa durum metnini yazar. Kodu standart bir modüle (Ekle > Modül) yapıştırın ve örnek sayfa etkinken çalıştırın.
VBA
16 satır
Option Explicit
' Her personelin satışını hedefiyle karşılaştırır
Sub HedefDurumuYaz()
Dim ws As Worksheet
Dim i As Long
Dim sonSatir As Long
Set ws = ActiveSheet
sonSatir = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To sonSatir
' Satış hedefe eşit ya da büyükse ilk metin, değilse ikinci metin yazılır
ws.Cells(i, 4).Value = IIf(ws.Cells(i, 2).Value >= ws.Cells(i, 3).Value, "Hedef tamam", "Hedef altında")
Next i
End Sub
IIf
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Personel | Satış | Hedef | Sonuç |
| 2 | Ayşe Yılmaz | 48.500 | 45.000 | Hedef tamam |
| 3 | Mehmet Kaya | 39.200 | 40.000 | Hedef altında |
| 4 | Zeynep Demir | 52.750 | 50.000 | Hedef tamam |
| 5 | Can Öztürk | 41.000 | 41.000 | Hedef tamam |
| 6 | Elif Şahin | 36.800 | 38.000 | Hedef altında |
| 7 | Burak Aydın | 47.300 | 45.000 | Hedef tamam |
Hedef KontrolExcelDepo v1.0.0
2. İç içe IIf ile kademeli iskonto
Satış tutarı 10.000 ve üzerindeyse yüzde 10, 5.000 ve üzerindeyse yüzde 5, diğer durumlarda iskonto yok. İki kademeyi iç içe IIf ile kuran makro, oranı C sütununa, net tutarı D sütununa yazar. Kodu standart bir modüle yapıştırın.
VBA
24 satır
Option Explicit
' Tutara göre kademeli iskonto oranını ve net tutarı hesaplar
Sub IskontoUygula()
Dim ws As Worksheet
Dim i As Long
Dim sonSatir As Long
Dim tutar As Double
Dim oran As Double
Set ws = ActiveSheet
sonSatir = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
ws.Range("C2:C" & sonSatir).NumberFormat = "0%"
ws.Range("D2:D" & sonSatir).NumberFormat = "#,##0.00"
For i = 2 To sonSatir
tutar = ws.Cells(i, 2).Value
' İç içe IIf: önce 10.000 sınırı, sonra 5.000 sınırı sınanır
oran = IIf(tutar >= 10000, 0.1, IIf(tutar >= 5000, 0.05, 0))
ws.Cells(i, 3).Value = oran
ws.Cells(i, 4).Value = tutar * (1 - oran)
Next i
End Sub
IIf
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Tutar | İskonto | Net Tutar |
| 2 | Dizüstü Bilgisayar | 18.500,00 | 10% | 16.650,00 |
| 3 | Monitör | 6.200,00 | 5% | 5.890,00 |
| 4 | Klavye | 850,00 | 0% | 850,00 |
| 5 | Yazıcı | 4.300,00 | 0% | 4.300,00 |
| 6 | Tablet | 9.800,00 | 5% | 9.310,00 |
| 7 | Ofis Koltuğu | 5.400,00 | 5% | 5.130,00 |
| 8 | Masa Lambası | 320,00 | 0% | 320,00 |
İskonto HesabıExcelDepo v1.0.0
3. IIf tuzağı: sıfıra bölme
IIf her iki dalı da hesapladığı için, adedin sıfır olduğu satırlarda birim fiyatı IIf ile hesaplamak hataya yol açar. Bu örnekte bölme işlemi güvenli biçimde If...Then...Else ile, durum metni ise IIf ile yazılır. Kodu standart bir modüle yapıştırın.
VBA
25 satır
Option Explicit
' Birim fiyatı hesaplar; adet sıfırsa bölme yapmaz
Sub BirimFiyatHesapla()
Dim ws As Worksheet
Dim i As Long
Dim sonSatir As Long
Set ws = ActiveSheet
sonSatir = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
ws.Range("D2:D" & sonSatir).NumberFormat = "#,##0.00"
For i = 2 To sonSatir
' IIf burada kullanılsaydı bölme her durumda hesaplanır ve 11 numaralı hata oluşurdu
If ws.Cells(i, 3).Value = 0 Then
ws.Cells(i, 4).Value = 0
Else
ws.Cells(i, 4).Value = ws.Cells(i, 2).Value / ws.Cells(i, 3).Value
End If
' Yan etkisi ve hata riski olmayan basit bir metin seçimi için IIf uygundur
ws.Cells(i, 5).Value = IIf(ws.Cells(i, 3).Value = 0, "Stokta yok", "Stokta var")
Next i
End Sub
IIf
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Tutar | Adet | Birim Fiyat | Durum |
| 2 | Kalem Seti | 1.260,00 | 12 | 105,00 | Stokta var |
| 3 | Defter | 840,00 | 28 | 30,00 | Stokta var |
| 4 | Dosya Klasörü | 0,00 | 0 | 0,00 | Stokta yok |
| 5 | Zımba | 375,00 | 5 | 75,00 | Stokta var |
| 6 | Kağıt A4 | 1.980,00 | 18 | 110,00 | Stokta var |
| 7 | Silgi | 0,00 | 0 | 0,00 | Stokta yok |
Birim FiyatExcelDepo v1.0.0
Kullanırken dikkat edin
- İki dal da hesaplanır: IIf, TruePart ve FalsePart ifadelerini her zaman birlikte değerlendirir. Sıfıra bölme, geçersiz dizin ya da Nothing nesnesine erişim gibi hata üretebilecek ifadeleri IIf içine koymayın; bu durumda If...Then...Else kullanın.
- Yan etkisi olan çağrılardan kaçının: IIf içinde bir Function çağırıyorsanız, işlev koşuldan bağımsız olarak iki dalda da çalışır. İşlev hücre değiştiriyor ya da sayaç artırıyorsa beklenmeyen sonuçlar doğar.
- Dönüş değeri Variant'tır: Sonuç Variant olarak döner. Dallardan biri metin, diğeri sayı ise atadığınız değişkenin türüne dikkat edin; uyumsuz atamalar tür uyuşmazlığı (Type mismatch) hatasına yol açabilir.
- İç içe kullanımı sınırlı tutun: İki ya da üç kademeden fazla iç içe IIf kodu okumayı ve bakımını zorlaştırır. Çok sayıda seçenek varsa Select Case deyimini ya da Switch ve Choose işlevlerini düşünün.
- Karşılaştırma türlerine dikkat edin: Hücre değerlerini karşılaştırırken metin biçimindeki sayılar beklenmeyen sonuç verebilir. Gerekirse koşulda sayısal dönüştürme yapın ve boş hücreleri ayrıca denetleyin.
- İlgili konular: