Özellik ikonu

Select-Case

İndirme izni yok

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.

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.
VBA
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.
ABC
1ÖğrenciPuanHarf Notu
2Ayşe Yılmaz95AA
3Mehmet Kaya84BA
4Fatma Demir72BB
5Ali Çelik65CC
6Zeynep Aydın48FF
7Mustafa Şahin100AA
8Elif Arslan88BA
9Burak Koç105Geçersiz
NotlarExcelDepo v1.0.0
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.

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.
ABCD
1ŞehirSatış TutarıBölgePrim Oranı
2İstanbul120.000,00Marmara10%
3Ankara64.500,00İç Anadolu6%
4İzmir18.000,00Ege0%
5Antalya87.250,00Akdeniz6%
6Konya52.000,00İç Anadolu6%
7Trabzon31.000,00Diğer3%
8Bursa150.000,00Marmara10%
9Muğla9.500,00Ege0%
Satış PrimiExcelDepo v1.0.0
İ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.

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.
ABCD
1Sipariş TarihiÜrünÇeyrekGün Türü
215.01.2024Laptop1. ÇeyrekHafta içi
317.02.2024Yazıcı1. ÇeyrekHafta sonu
407.04.2024Monitör2. ÇeyrekHafta sonu
522.05.2024Klavye2. ÇeyrekHafta içi
630.07.2024Tablet3. ÇeyrekHafta içi
714.09.2024Fare3. ÇeyrekHafta sonu
803.11.2024Kulaklık4. ÇeyrekHafta sonu
925.12.2024Webcam4. ÇeyrekHafta içi
Sipariş TakvimiExcelDepo v1.0.0
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.

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.
Ö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
6
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst