BelajarVBA 009 - Select Case dan fungsi kondisi

Coretan Mr. Kid


Banyak ulama sepakat bahwa sikap sabar yang sesungguhnya tampak pada reaksi pertama saat ujian menerpa pertama kali.

Pembahasan lalu tentang blok IF tampak jelas bahwa IF bisa digunakan untuk memeriksa kondisi dengan banyak kriteria seperti berdasar nilai penjualan, warna produk, dan tinggi produk. Blok IF juga bisa digunakan untuk memeriksa kondisi berisi sebuah kriteria yang dibatasi oleh banyak nilai pembatas, seperti nilai lebih dari sekian dan kurang dari sekian, dan sebagainya.

Blok Select Case digunakan untuk memilih proses melalui pemeriksaan terhadap kelompok nilai dari sebuah kriteria. Misalnya saja, suatu nilai analisa penjualan terbentuk kelompok dari 1 sampai 9. Untuk kelompok nilai 1 sampai 3 dan 9 akan mendapat persentase 25%, sedangkan kelompok nilai 4, 6 dan 7 akan mendapat persentase sebesar 10%, dan sisanya mendapat persentase sebesar 3%. Sedang yang diluar kelompok 1 sampai 9 tidak akan mendapat persentase alias 0%.

Penggunaan IF pada kasus demikian akan membutuhkan kondisi yang banyak sekali. Kira-kira akan berbunyi sebagai berikut :
   IF lNilai >= 1 AND lNilai <= 3 OR lNilai = 9 THEN
       dblPersen = 0.25
   ELSEIF lNilai = 4 OR lNilai = 6 OR lNilai = 7 THEN
       dblPersen = 0.1
   ELSEIF lNilai = 5 OR lNilai = 8 THEN
       dblPersen = 0.03
   ELSE
       dblPersen = 0
   END IF

yang jika disusun mengikuti cara penyusunan operator logika akan menjadi :
   IF lNilai = 9 THEN
       dblPersen = 0.25
   ELSEIF lNilai = 4 THEN
       dblPersen = 0.1
   ELSEIF lNilai = 6 THEN
       dblPersen = 0.1   
   ELSEIF lNilai = 7 THEN
       dblPersen = 0.1   
   ELSEIF lNilai = 5 THEN
       dblPersen = 0.03
   ELSEIF lNilai = 8 THEN
       dblPersen = 0.03
   ELSEIF lNilai >= 1 THEN
       IF lNilai <= 9 THEN
           dblPersen = 0.25
       ELSE
           dblPersen = 0
       END IF
   END IF

dan hal ini sangatlah merepotkan.


Bentuk dasar blok Select Case

Secara umum, blok Select Case mengikuti syntax :
   SELECT CASE kriteria
       CASE nilai-nilai kelompok pertama
           proses untuk kelompok pertama
       CASE nilai-nilai kelompok kedua
           proses untuk kelompok kedua
       .
       CASE nilai-nilai kelompok ke-N
           proses untuk kelompok ke-N
       CASE ELSE
           proses untuk yang tidak masuk kelompok manapun
   END SELECT

Blok Select Case bisa disusun bersarang (nested) alias ada Select Case di dalam Select Case layaknya nested IF. Secara umum bentuk bersarangnya adalah :
   SELECT CASE kriteria1
       CASE nilai kriteria1 untuk kelompok pertama
           SELECT CASE kriteria2
               CASE nilai kriteria2 untuk kelompok pertama
                   proses kriteria2 untuk kelompok pertama
               .
               CASE ELSE
                   .
           END SELECT
       CASE nilai kriteria1 untuk kelompok kedua
           SELECT CASE kriteria2
               CASE nilai kriteria2 untuk kelompok pertama
                   .
               .
           END SELECT
       .
   END SELECT

Blok Select Case bisa menjadi proses dalam blok IF dan begitu pula sebaliknya. Definisi nilai kelompok bisa berupa variabel. Setiap elemen anggota kelompok dipisahkan dengan karakter koma.

Contoh penerapan blok Select Case untuk contoh kasus di atas tadi :
   SELECT CASE lNilai
       CASE 1 TO 3, 9
           dblPersen = 0.25
       CASE 4, 6, 7
           dblPersen = 0.1
       CASE 5, 8
           dblPersen = 0.03
       CASE ELSE
           dblPersen = 0
   END SELECT

Jika nilai 5 dalam contoh di atas disimpan dalam variabel bernama lKelTertentu, maka blok Select Case di atas bisa ditulis :
   SELECT CASE lNilai
       CASE 1 TO 3, 9
           dblPersen = 0.25
       CASE 4, 6, 7
           dblPersen = 0.1
       CASE lKelTertentu, 8
           dblPersen = 0.03
       CASE ELSE
           dblPersen = 0
   END SELECT


Cara mendefinisikan nilai-nilai kelompok selain dengan cara menyebut nilai tunggal secara langsung adalah sebagai berikut :

Rentang nilai dari nilai awal sampai dengan nilai akhir

   nilai_awal TO nilai_akhir
nilai_awal dan nilai_akhir bisa berupa variabel
Contoh :
   SELECT CASE lNilai
       CASE 1 TO 3, lMinimum TO lMaksimum
           'proses A
   END SELECT

Artinya, proses A akan dikerjakan jika lNilai bernilai dari 1 sampai dengan 3 atau dari nilai yang disimpan dalam variabel lMinimum sampai dengan nilai yang disimpan dalam variabel lMaksimum.

Pada data berupa teks (ber-datatype string), maka akan berdasar tata urutan kode ASCII karakternya dan bersifat case sensitive, seperti :
   SELECT CASE sNama
       CASE "beexcel" TO "kid"
           'proses A
   END SELECT

Artinya, proses A akan dikerjakan jika nilai dalam sNama ada dalam urutan antara teks 'beexcel' sampai dengan 'kid'. Jadi, jika sNama berisi teks berbunyi 'ah masa sih', 'lupa', atau 'Fulan' maka proses A tidak akan dikerjakan karena tidak diantara tata urutan dari 'beexcel' sampai 'kid'. Jika sNama berisi teks 'gajah', maka proses A akan dikerjakan.

Menggunakan operator perbandingan terhadap suatu nilai

   IS operator_perbandingan nilai_pembanding
  • Kata IS tersebut bukanlah operator perbandingan IS yang telah dijelaskan pada bahasan lalu.
  • Operator_perbandingan yang bisa digunakan adalah salah satu dari <, >, =, <=, >=, <>
  • nilai_pembanding bisa berupa variabel
Contoh :
   SELECT CASE lNilai
       CASE IS <= lMinimum, IS > 17
           'proses A
   END SELECT

Artinya, proses A akan dikerjakan jika lNilai bernilai kurang dari atau sama dengan nilai yang disimpan dalam variabel lMinimum atau lebih dari 17.

Pada data berupa teks (ber-datatype string), maka akan berdasar tata urutan kode ASCII karakternya dan bersifat case sensitive, seperti :
   SELECT CASE sNama
       CASE IS < "beexcel", IS >= "kid"
           'proses A
   END SELECT

Artinya, proses A akan dikerjakan jika nilai dalam sNama ada dalam urutan sebelum teks 'beexcel' atau ada dalam urutan sejak teks 'kid'. Jadi, jika sNama berisi teks 'belajar', 'fulan', atau 'kepo' maka proses A tidak akan dikerjakan. Jika sNama berisi teks 'Gajah' atau 'kuper', maka proses A akan dikerjakan.

Fungsi-fungsi yang dapat berlaku seperti IF atau Select Case

Bahasan tentang blok IF dan blok Select Case dapat mengarahkan alur program untuk memproses sesuatu, termasuk mengisi suatu nilai ke dalam sebuah variabel. Jumlah variabel yang digunakan dalam proses pun bisa lebih dari satu buah. Kadangkala, pemeriksaan suatu kondisi dimaksudkan untuk mengisi sebuah variabel saja. Contohnya seperti kasus pertama dalam bahasan ini, yang hanya akan mengisi variabel bernama dblPersen. VB/VBA menyediakan fungsi untuk menyederhanakan penggunaan blok IF atau blok Select Case. Pada umumnya, fungsi-fungsi tersebut digunakan untuk kebutuhan pengisian nilai suatu variabel berdasar suatu kondisi yang simpel. Variabel bisa digunakan untuk menggantikan nilai-nilai tetapan dalam contoh dibawah nanti. Penggunaan datatype string juga dimungkinkan dalam pemanfaatan fungsi-fungsi ini.

Fungsi IIF

Fungsi ini digunakan layaknya IF yang sebaris. Sebaiknya penggunaan dalam bentuk nested function (fungsi dalam fungsi) dihindari agar memudahkan pembacaan baris-baris kode dilain waktu atau oleh programmer lain.

Syntax :
   variabel_hasil = IIF( kondisi , bagian_TRUE , bagian_FALSE )

Contohnya untuk mengisi persentase bonus senilai 25% ketika nilai penjualan mencapai 1juta atau lebih, dan tidak ada bonus jika belum mencapai nilai penjualan 1juta.
   dblPersen = IIF( curSales >= 1000000 , 0.25 , 0 )

Fungsi Switch

Fungsi ini digunakan layaknya IF .. ELSEIF, tetapi tanpa ELSE. Jadi, seluruh kondisi harus didefinisikan secara jelas untuk seluruh kemungkinan yang mungkin. Jika tidak ada kondisi yang sesuai, maka akan menghasilkan nilai NULL dan hanya variabel ber-datatype variant yang bisa menampung nilai hasilnya.

Syntax :
   variabel_hasil = Switch( _
                           kondisi_1,hasil_kondisi_1_TRUE _
                          ,..,.. _
                          ,kondisi_N,hasil_kondisi_N_TRUE)

Contoh untuk seluruh kemungkinan diwakili oleh seluruh kondisi yang ada
Persentase bonus senilai 25% ketika nilai penjualan lebih dari 2juta, persentase 15% untuk nilai penjualan lebih dari 1juta sampai 2juta, persentase 5% untuk nilai penjualan senilai 1juta, dan selainnya akan memiliki persentase 0%.
   Dim dblPersen As Double, curSales As Currency
   dblPersen = Switch( curSales < 1000000 , 0 _
                     , curSales = 1000000 , 0.05 _
                     , curSales > 1000000 AND curSales <= 2000000 , 0.15 _
                     , curSales > 2000000 , 0.25 )


Contoh untuk tidak semua kemungkinan diwakili oleh kondisi-kondisi yang ada
Persentase bonus senilai 25% ketika nilai penjualan lebih dari 2juta dan persen senilai 10% jika penjualan sebesar 1juta.
   Dim vPersen As Variant, curSales As Currency
   vPersen = Switch(curSales = 1000000,0.1,curSales > 2000000,0.25)

Ketika curSales bernilai 2juta, maka vPersen akan berisi NULL

Contoh menggunakan lebih dari satu kriteria kondisi
Persentase bonus senilai 25% ketika nilai penjualan lebih dari 2juta dan persen senilai 17% ketika jumlah item terjual lebih dari 100.
   Dim vPersen As Variant, curSales As Currency, lItem As Long
   vPersen = Switch(curSales > 2000000,0.25,lItem > 100,0.17)

Pada contoh ini digunakan 2 kriteria, yaitu berdasar curSales (kriteria nilai penjualan) dan lItem (kriteria jumlah item terjual). Karena tidak seluruh kemungkinan nilai dari masing-masing kriteria didefinisikan kondisinya, maka dapat menghasilkan nilai NULL, yaitu ketika curSales kurang dari atau sama dengan 2juta atau lItem kurang dari atau sama dengan 100. Oleh sebab itu variabel hasil menggunakan datatype variant yang dapat menampung nilai NULL.

Fungsi Choose

Fungsi ini digunakan untuk memilih suatu nilai berdasar nilai indeks item-item yang didefinisikan. Jadi, nilai indeks harus selalu terwakili oleh item-item yang didefinisikan.

Syntax :
   variabel_hasil = Choose( indeks , item1 , item2 , .. , itemN )

Contoh :
Produk kualitas 1 diberi persentase laba 25%, kualitas 2 diberi persentase laba 17%, kualitas 3 diberi persentase laba 9%.
   dblPersen = Choose( lKualitas , 0.25 , 0.17 , 0.09 )

Contoh ini sama dengan blok IF berbunyi :
   IF lKualitas = 1 THEN
       dblPersen = 0.25
   ELSEIF lKualitas = 2 THEN
       dblPersen = 0.17
   ELSEIF lKualitas = 3 THEN
       dblPersen = 0.09
   END IF

atau sama dengan blok Select Case berbunyi :
   SELECT CASE lKualitas
       CASE 1
           dblPersen = 0.25
       CASE 2
           dblPersen = 0.17
       CASE 3
           dblPersen = 0.03
   END SELECT

yang tidak ada bagian ELSE (pada blok IF) atau CASE ELSE (pada blok Select Case). Terkadang, fungsi ini digunakan ketika memanfaatkan beberapa object control Option Button.

:)

Insya Allah pembahasan berikutnya adalah tentang perulangan (loop). Perulangan adalah salah satu bagian penting dan sangat sering digunakan. Pemahaman tentang pengkondisian (IF ataupun Select Case) akan memudahkan dalam memahami tentang perulangan.



5 komentar: