Genel Bakış
Select Case (Select Case...End Select), bir ifadenin değerini sırayla Case kollarındaki değerlerle karşılaştıran ve eşleşen ilk kolun deyimlerini çalıştıran VBA karar yapısıdır. Aynı ifade için çok sayıda koşulu tek tek yazmanız gereken durumlarda, iç içe geçmiş If...ElseIf zincirine göre çok daha okunaklı bir kod sağlar. Not aralıkları, şehir listeleri, ay ve gün numaraları gibi gruplama işlerinde sık kullanılır.
Tek bir ifadenin değerine göre karar veriyorsanız Select Case tercih edilir. Birbirinden bağımsız farklı ifadeleri sınamanız gerekiyorsa Select Case True biçimini kullanabilir ya da If...ElseIf yapısına geçebilirsiniz. Select Case bir değer döndürmez; sonucu bir değişkene ya da hücreye kolların içinde siz yazarsınız.
Makro çalışınca C2 hücresine AA, C3 hücresine BA, C6 hücresine FF yazılır. 105 puanı hiçbir aralığa girmediği için C9 hücresinde Geçersiz sonucu görünür. Aralıklar tam sayı olduğu için ondalıklı puanlarda boşluk doğabileceğini unutmayın.
İstanbul satırında bölge olarak Marmara, prim oranı olarak 10% yazılır. Listede olmayan Trabzon için C7 hücresi Diğer değerini alır. Prim sütununda koşullar büyükten küçüğe dizildiği için her tutar yalnız en yüksek uygun orana düşer; örneğin D3 hücresi 6% olur.
Makro çalışınca ilk satır için C2 hücresine 1. Çeyrek, D2 hücresine Hafta içi yazılır. 17 Şubat 2024 tarihli satırda D3 hücresi Hafta sonu değerini gösterir. vbSaturday ve vbSunday yerleşik sabitlerdir; Weekday işlevi varsayılan olarak Pazar gününe 1, Cumartesi gününe 7 değerini verir. Bu yüzden Case satırında sabitlerin adlarını kullanmak kodu daha okunaklı kılar.
Söz dizimi
Select Case yapısının genel biçimi şöyledir:
VBA
8 satır
Select Case sınanacakİfade
Case değerListesi1
deyimler1
Case değerListesi2
deyimler2
Case Else
varsayılanDeyimler
End Select
- sınanacakİfade: Sayısal ya da metin türünde herhangi bir ifade (değişken, hücre değeri, işlev sonucu); zorunludur. Yapı girildiğinde yalnız bir kez hesaplanır.
- değerListesi: Her Case satırında ifadeyle karşılaştırılacak değer, aralık ya da koşul; en az bir Case kolu yazılmalıdır.
- deyimler: İlgili kol eşleşince çalışan satırlar; isteğe bağlıdır, boş bırakılabilir.
- Case Else: Hiçbir kolun eşleşmediği durumda çalışır; isteğe bağlıdır. Yazmazsanız ve hiçbir kol eşleşmezse hiçbir deyim çalışmaz, hata da oluşmaz.
- End Select: Yapıyı kapatır; zorunludur.
Case satırında kullanabileceğiniz biçimler
Bir Case satırında değerleri farklı biçimlerde yazabilirsiniz:- Tek değer: Case 5 ya da Case "Ankara" gibi birebir eşitlik sınar.
- Virgülle liste: Case "İzmir", "Aydın", "Muğla" biçiminde yazılan değerlerden herhangi biri eşleşirse kol çalışır.
- To ile aralık: Case 1 To 3 uç değerler dahil aralığı sınar. Küçük değer önce yazılmalıdır.
- Is ile karşılaştırma: Case Is >= 100 gibi karşılaştırma işleçlerini (=, <>, <, <=, >, >=) kullanır; Is sözcüğünden sonra yalnız tek bir değer yazılır.
- Karışık kullanım: Bunların hepsini aynı satırda virgülle birleştirebilirsiniz.
Case 1 To 5, 10, Is > 100
Çalışma mantığı ve If ile farkı
Kollar yukarıdan aşağıya sırayla denenir. Eşleşen ilk kolun deyimleri çalışır ve ardından akış doğrudan End Select satırından sonrasına geçer; sonraki kollara bakılmaz. Bu yüzden birbiriyle kesişen koşullarda (ör. Case Is >= 50000 ve Case Is >= 100000) önce en dar ya da en büyük koşulu yazmalısınız.Tek bir ifadenin değerine göre karar veriyorsanız Select Case tercih edilir. Birbirinden bağımsız farklı ifadeleri sınamanız gerekiyorsa Select Case True biçimini kullanabilir ya da If...ElseIf yapısına geçebilirsiniz. Select Case bir değer döndürmez; sonucu bir değişkene ya da hücreye kolların içinde siz yazarsınız.
1. Puana göre harf notu verme (To ile aralıklar)
Öğrencilerin puanları B sütunundadır. Kod, her puanı aralıklarla karşılaştırıp C sütununa harf notunu yazar; 0-100 dışındaki puanlar için Case Else kolu kullanılır. Kodu standart bir modüle yapıştırın ve örnek sayfa etkinken çalıştırın.
VBA
27 satır
Option Explicit
' Puana göre harf notunu C sütununa yazar
Sub HarfNotuVer()
Dim ws As Worksheet
Dim satir As Long
Set ws = ActiveSheet
For satir = 2 To 9
Select Case ws.Cells(satir, 2).Value
Case 90 To 100
ws.Cells(satir, 3).Value = "AA"
Case 80 To 89
ws.Cells(satir, 3).Value = "BA"
Case 70 To 79
ws.Cells(satir, 3).Value = "BB"
Case 60 To 69
ws.Cells(satir, 3).Value = "CC"
Case 0 To 59
ws.Cells(satir, 3).Value = "FF"
Case Else
' 0-100 dışındaki hatalı puanlar
ws.Cells(satir, 3).Value = "Geçersiz"
End Select
Next satir
End Sub
Select-Case
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Öğrenci | Puan | Harf Notu |
| 2 | Ayşe Yılmaz | 95 | AA |
| 3 | Mehmet Kaya | 84 | BA |
| 4 | Fatma Demir | 72 | BB |
| 5 | Ali Çelik | 65 | CC |
| 6 | Zeynep Aydın | 48 | FF |
| 7 | Mustafa Şahin | 100 | AA |
| 8 | Elif Arslan | 88 | BA |
| 9 | Burak Koç | 105 | Geçersiz |
NotlarExcelDepo v1.0.0
2. Şehre göre bölge ve tutara göre prim oranı (liste ve Is)
A sütununda şehir, B sütununda satış tutarı vardır. Kod, şehir adını virgülle ayrılmış listelerle karşılaştırıp C sütununa bölgeyi yazar; ardından tutara göre Case Is koşullarıyla D sütununa prim oranını yazar. Kodu standart bir modüle yapıştırıp örnek sayfa etkinken çalıştırın.
VBA
38 satır
Option Explicit
' Şehirden bölgeyi, tutardan prim oranını belirler
Sub BolgeVePrim()
Dim ws As Worksheet
Dim satir As Long
Set ws = ActiveSheet
For satir = 2 To 9
' Metin listesiyle eşleştirme
Select Case ws.Cells(satir, 1).Value
Case "İstanbul", "Kocaeli", "Bursa"
ws.Cells(satir, 3).Value = "Marmara"
Case "Ankara", "Konya", "Eskişehir"
ws.Cells(satir, 3).Value = "İç Anadolu"
Case "İzmir", "Aydın", "Muğla"
ws.Cells(satir, 3).Value = "Ege"
Case "Antalya", "Adana"
ws.Cells(satir, 3).Value = "Akdeniz"
Case Else
ws.Cells(satir, 3).Value = "Diğer"
End Select
' Büyükten küçüğe sıralanmış Is koşulları
Select Case ws.Cells(satir, 2).Value
Case Is >= 100000
ws.Cells(satir, 4).Value = 0.1
Case Is >= 50000
ws.Cells(satir, 4).Value = 0.06
Case Is >= 20000
ws.Cells(satir, 4).Value = 0.03
Case Else
ws.Cells(satir, 4).Value = 0
End Select
ws.Cells(satir, 4).NumberFormat = "0%"
Next satir
End Sub
Select-Case
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Şehir | Satış Tutarı | Bölge | Prim Oranı |
| 2 | İstanbul | 120.000,00 | Marmara | 10% |
| 3 | Ankara | 64.500,00 | İç Anadolu | 6% |
| 4 | İzmir | 18.000,00 | Ege | 0% |
| 5 | Antalya | 87.250,00 | Akdeniz | 6% |
| 6 | Konya | 52.000,00 | İç Anadolu | 6% |
| 7 | Trabzon | 31.000,00 | Diğer | 3% |
| 8 | Bursa | 150.000,00 | Marmara | 10% |
| 9 | Muğla | 9.500,00 | Ege | 0% |
Satış PrimiExcelDepo v1.0.0
3. Tarihten çeyrek ve gün türü bulma (işlev sonucuyla)
A sütunundaki sipariş tarihlerinden ayı Month işleviyle, haftanın gününü Weekday işleviyle alıp iki ayrı Select Case ile C ve D sütunlarına çeyreği ve gün türünü yazan bir makro kuruyoruz. Kodu standart bir modüle yapıştırıp örnek sayfa etkinken çalıştırın.
VBA
34 satır
Option Explicit
' Tarihe göre çeyrek ve hafta içi/hafta sonu bilgisini yazar
Sub CeyrekVeGunTuru()
Dim ws As Worksheet
Dim satir As Long
Dim tarih As Date
Set ws = ActiveSheet
For satir = 2 To 9
tarih = ws.Cells(satir, 1).Value
' Ay numarasına göre çeyrek
Select Case Month(tarih)
Case 1 To 3
ws.Cells(satir, 3).Value = "1. Çeyrek"
Case 4 To 6
ws.Cells(satir, 3).Value = "2. Çeyrek"
Case 7 To 9
ws.Cells(satir, 3).Value = "3. Çeyrek"
Case Else
ws.Cells(satir, 3).Value = "4. Çeyrek"
End Select
' Gün numarasına göre hafta içi / hafta sonu
Select Case Weekday(tarih)
Case vbSaturday, vbSunday
ws.Cells(satir, 4).Value = "Hafta sonu"
Case Else
ws.Cells(satir, 4).Value = "Hafta içi"
End Select
Next satir
End Sub
Select-Case
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Sipariş Tarihi | Ürün | Çeyrek | Gün Türü |
| 2 | 15.01.2024 | Laptop | 1. Çeyrek | Hafta içi |
| 3 | 17.02.2024 | Yazıcı | 1. Çeyrek | Hafta sonu |
| 4 | 07.04.2024 | Monitör | 2. Çeyrek | Hafta sonu |
| 5 | 22.05.2024 | Klavye | 2. Çeyrek | Hafta içi |
| 6 | 30.07.2024 | Tablet | 3. Çeyrek | Hafta içi |
| 7 | 14.09.2024 | Fare | 3. Çeyrek | Hafta sonu |
| 8 | 03.11.2024 | Kulaklık | 4. Çeyrek | Hafta sonu |
| 9 | 25.12.2024 | Webcam | 4. Çeyrek | Hafta içi |
Sipariş TakvimiExcelDepo v1.0.0
Kullanırken dikkat edin
- Case Else kolunu ihmal etmeyin: Hiçbir kol eşleşmediğinde ve Case Else yoksa kod sessizce End Select sonrasına geçer. Beklenmeyen değerleri yakalamak için çoğu zaman Case Else yazmak iyi bir alışkanlıktır; sonuç hücresinin boş kalıp hatayı gizlemesini önler.
- Kolların sırası önemlidir: Eşleşen ilk kol çalışıp yapıdan çıkıldığı için kesişen koşullarda sıra sonucu belirler. Case Is >= 50000 kolunu Case Is >= 100000 kolundan önce yazarsanız 100000 üzeri tutarlar da ilk kola düşer.
- To aralığında küçük değer önce gelmeli: Case 10 To 1 gibi ters yazılmış bir aralık hiçbir değerle eşleşmez ve hata da vermez. Aralığı her zaman küçükten büyüğe yazın. Ondalıklı sayılarda Case 80 To 89 ile Case 90 To 100 arasında kalan 89,5 gibi değerler boşlukta kalır; bu durumda Case Is >= 80 gibi ifadeleri tercih edin.
- Metin karşılaştırmada büyük/küçük harf: Varsayılan olarak metin karşılaştırması büyük/küçük harfe duyarlıdır. "ankara" değeri Case "Ankara" koluyla eşleşmez. Harf duyarlılığını kaldırmak için modülün başına Option Compare Text yazabilir ya da ifadeyi UCase veya LCase ile dönüştürebilirsiniz. Türkçe İ ve ı harflerine dikkat edin.
- Select Case True ile farklı koşullar: Her kolda ayrı bir koşulu sınamak için Select Case True yazıp kollara Case Range("B2").Value > 10 gibi mantıksal ifadeler koyabilirsiniz. İlk doğru çıkan kol çalışır. Bu biçim, tek bir değerle karşılaştırma yapılamayan durumlarda If...ElseIf yapısına okunaklı bir seçenektir.
- Aynı satıra yazma ve iç içe kullanım: Kısa kollar için iki nokta üst üste ile Case 1: x = "Ocak" biçiminde tek satır yazabilirsiniz. Select Case yapıları iç içe de kullanılabilir; her biri kendi End Select satırıyla kapatılmalıdır. Döngüden ya da yordamdan çıkmak için kol içinde Exit For veya Exit Sub kullanabilirsiniz.
- İlgili konular:
- If...Then...Else: Bağımsız koşulları sınamak için kullanılan temel karar deyimi.
- For...Next: Satırları dolaşırken Select Case ile birlikte sık kullanılır.
- Option Compare: Metin karşılaştırma kuralını belirler.
- Weekday ve Month: Tarihten gün ve ay numarası üreten VBA işlevleri.
- IIf: Tek koşullu, iki seçenekli kısa karar işlevi.
- EĞER ve ÇOKEĞER: Çalışma sayfasında benzer çok koşullu kararlar için kullanılan işlevler.