Select Case - Case Is - Case - Case Else - End Select

Makro, formül vb.. şekilde bazı örneklerin paylaşılabileceği alan
Kullanıcı avatarı
ExcelVBA
Site Admin
Mesajlar: 10
Kayıt: 20 Haz 2023, 18:12
Lokasyon: İstanbul
Web Sitesi: https://www.excelvba.net
Meslek: Yönetim Kurulu Başkanı (Özel Sektör)
Adınız:
Soyadınız:

Select Case - Case Is - Case - Case Else - End Select

Mesaj gönderen ExcelVBA »

Select Case

Select Case işlemi sabitlenmiş bir değerin kontrolü için kullanılabilir. Döndürdüğü değerler True ya da False olacaktır. True ( doğru ) olduğunda altındaki kod satırları çalışır, False ( yanlış ) olduğunda varsa diğer Case şartlarına kontrole gidilir. Başka Case şartları varsa Case şartları True oluyorsa onun alt satırları okunur. Başka Case şartları yoksa, ya da kontrole gidilen diğer Case şartları hep False yanıtı döndürdü ise, End Select ile blok dışına çıkarak varsa prosedürdeki diğer satırlar okunmaya başlanır. Bu da yok ise prosedürden çıkılır.

Eğer ( if - elseif - end if ) kullanımının benzeri gibi olsa da biraz daha farklı bir türüdür.

Bulunan verinin ne olduğu ile ilgili şart sorgulanır. Bulunan değer Case şartı ile sorgulanabilir. Case şartına uygun bir veri bulundu ise Case altındaki kodlamalar çalışmaya başlar. Mantık olarak eğer mantığında olduğu gibi.

Resimdeki gibi bir veri kaynağımız olduğunu varsayalım.
Resim

Amacımız buradaki grupların almış oldukları puanları Select Case mantığı ile toplayabilmek olsun.
Bunu İf Then mantığı ile de kolayca yapabiliriz. Ya da farklı kurularla. Ama konumuz Select Case olduğpuna göre buna bu şekilde örnek vereceğiz.

Kod: Tümünü seç

Sub SelectCaseEndSelect()
Dim i As Long, a As Long
Dim bir As Long, iki As Long, uc As Long, fark As Long
a = Range("a65536").End(3).Row
    For i = 2 To a
        Select Case Cells(i, 1).Value
            Case Is = "1.GRUP"
                bir = bir + Cells(i, 2).Value
            Case Is = "2.GRUP"
                iki = iki + Cells(i, 2).Value
            Case Is = "3.GRUP"
                uc = uc + Cells(i, 2).Value
            Case Else
                fark = fark + Cells(i, 2).Value
        End Select
     Next i
        MsgBox "1.Grup Puanları       : " & bir & vbCr & _
               "2.Grup Puanları       : " & iki & vbCr & _
               "3.Grup Puanları       : " & uc & vbCr & _
               "Fark Puan Toplam   : " & fark & vbCr _
               , , "Www.ExcelVBA.Net"
End Sub
Prosedürümüzde satırlar arası gezinme için i değişkeni ile bir döngü kullandık. Select Case Cells(i,1).Value ile şartın aranacağı hedefi belirledik. Case Is = ... şekli ile şart sorgulatmış olduk. Şartlar yerine geldi ise dedik ya ilgili Case altındaki kodlar çalışmaya başlayacak; buna göre değişkenlerin içerisine puan toplamlarını atamış olduk.

Prosedür önce döngüden gelen değerdeki ilgili satır içinde bulunan hücre içeriğine bakacak. İlk karşılaşacağı hücre değeri "1.GRUP". Bu grup Case şartları içerisinde var mı ? Evet var.

Kod: Tümünü seç

Case Is = "1.GRUP"
olarak şartlandırmışız.
O halde bu komut satırı True yani Doğru olacak ve alttaki kodlar çalışacak.

Kod: Tümünü seç

bir = bir + Cells(i, 2).Value
. Bu satır ile bir adlı değişkene cells(i,2).value değerini toplatıp atama yaptık. diğer gruplar için de aynı şey geçerli olacak. Her şart doğru bulunduğunda altındaki kod satırları çalışır ve istediğimiz işlemi gerçekleştirir.
Son satıra eklediğimiz Case Else komutu ile daha önceki şartların hiç birine uymayan bir durum ile karşılaşıldığında oluşacak olan olayı tetikleyecek. Eğer 1.grup değilse, 2.grup değilse ve 3.grup değilse o zaman

Kod: Tümünü seç

fark = fark + Cells(i,2).Value
satırı bize olası bir başka grubun da olduğunun kanıtı olacak. Verilerimiz arasında 4.Grup, 5.Grup vb. gruplar da olsaydı fark sayısı bu grupların toplam puan değerlerini alacaktı. Aynı If Then mantığındaki Else mantığındaki gibi.

Son olarak da End Select ile şartlandırma kontrollerimizi kapatıp sonuçların bir mesaj ile bildirilmesini istedik.

Kod: Tümünü seç

        MsgBox "1.Grup Puanları       : " & bir & vbCr & _
               "2.Grup Puanları       : " & iki & vbCr & _
               "3.Grup Puanları       : " & uc & vbCr & _
               "Fark Puan Toplam   : " & fark & vbCr _
               , , "Www.ExcelVBA.Net"
Bu komuttan alacağımız yanıt resimdeki gibi olacaktır.
Resim

Select Case içerisinde de yine Select Case ile yeni şart aramaları yapabiliriz.
Bu kez gruplar arasında 3 ve 3'ten büyük puan adetlerini saydıralım. Saydırdıklarımızı da yine bir mesaj ile görmüş olalım.

Kod: Tümünü seç

Sub SelectCaseEndSelect2()
Dim i As Long, a As Long
Dim bir As Integer, iki As Integer, uc As Integer, fark As Integer
Dim birfark As Integer, ikifark As Integer, ucfark As Integer

a = Range("a65536").End(3).Row
    For i = 2 To a
        Select Case Cells(i, 1).Value
            Case Is = "1.GRUP"
            
                Select Case Cells(i, 2).Value
                    Case Is >= 3
                        bir = bir + 1
                    Case Else
                        birfark = birfark + 1
                End Select
                
            Case Is = "2.GRUP"
            
                Select Case Cells(i, 2).Value
                    Case Is >= 3
                        iki = iki + 1
                    Case Else
                        ikifark = ikifark + 1
                End Select
                
            Case Is = "3.GRUP"
                Select Case Cells(i, 2).Value
                    Case Is >= 3
                        uc = uc + 1
                    Case Else
                        ucfark = ucfark + 1
                End Select
                
            Case Else
                fark = fark + 1
        End Select
     Next i
     
        MsgBox "1.Grup 3 'ten büyük Puan Adeti : " & bir & vbCr & _
               "1.Grup 3 'ten küçük Puan Adeti : " & birfark & vbCr & _
               "2.Grup 3 'ten büyük Puan Adeti : " & iki & vbCr & _
               "2.Grup 3 'ten küçük Puan Adeti : " & ikifark & vbCr & _
               "3.Grup 3 'ten büyük Puan Adeti : " & uc & vbCr & _
               "3.Grup 3 'ten küçük Puan Adeti : " & ucfark & vbCr & vbCr & _
               "Fark Puan Toplam   : " & fark & vbCr _
               , , "Www.ExcelVBA.Net"
End Sub
Karışık bir kod bloğu gibi görünse de aslında mantık düzeni hepsinde aynıdır.
Bu prosedürümüzden alacağımız yanıtın görüntüsü de
Resim
şeklinde olacaktır.

Buna benzer yapıları çoğunlukla Private Sub Worksheet_Change(ByVal Target As Range) prosedürlerinde kullandık. Target ( seçilen, hedef ) hücre değerinin değişikliklerini kontrol etmek için güzel bir yöntemdir. Aslında bazı durumlarda bunun yerine If - ElseIf - Else - Then komutlarını kullanmak, bize kod yazımında daha az komutlarla işlem yapmamızı sağlayabilir. Bu verdiğim örnekte çok fazla bir fark görünmemesine rağmen, If kod yapısında sorgulanan şartlar ile Select Case yapısında sorgulanan şartların arasında yapılacak işlemlere göre büyük farklılıklar da olabiliyor.

Örneğin , Private Sub Worksheet_Change(ByVal Target As Range) olayında Target değerini If then yapısına bağladığınızda, daha sıkıcı bir kod bloğu yazmak zorunda kalabilirsiniz.

Sütunda aradığınız bir değerin hangi sütundan gelmesi gerektiği kararını If sorgulaması ile yaptıktan sonra yine if yapısı ile hücreyi sorgulayacaksınız, yeni bir if ile hücredeki değeri sorgulayacaksınız, ki bu sefer yukarıda verdiğim örnekteki yapıdan daha uzunca bir kod bloğu oluşturmak zorunda kalabilirsiniz.