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.
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 ö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"
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
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
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"
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
Bu prosedürümüzden alacağımız yanıtın görüntüsü de
ş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.