Tuesday, August 6, 2013

BelajarVBA 008 - Blok IF

Coretan Mr. Kid

Sungguh banyak kesempatan untuk bisa 'memberi lebih banyak dari apa yang diamanahkan kepada kita dan meminta lebih sedikit dari yang menjadi hak kita'. Sungguh sedikit dari kesempatan itu yang bisa kita raih dan itu adalah suatu kerugian yang besar bagi kita, andaikan kita benar-benar menjadi orang yang berpikir.

Pengaturan proses berdasar suatu kondisi sangat sering dijumpai dalam kehidupan sehari-hari. Begitu pula dalam pemrograman. Suatu kondisi bisa jadi dibatasi oleh banyak nilai dari sebuah kriteria sampai dengan dibatasi oleh banyak nilai dari banyak kriteria. Dengan demikian, diperlukan sebuah proses untuk memeriksa setiap kondisi yang mungkin terjadi.



Operator perbandingan (Comparison Operator)

Pada umumnya, di dalam pemrograman, pemeriksaan setiap kondisi adalah proses membandingkan suatu nilai dengan nilai lainnya atau sekedar memeriksa ada atau tidak ada. Pemeriksaan suatu kondisi akan menghasilkan status terpenuhi atau tidak terpenuhi. Status terpenuhi biasa disebut keadaan TRUE dan status tidak terpenuhi biasa disebut FALSE. Didalam VBA, nilai TRUE akan bernilai -1 jika dikonversi menjadi numerik, sedangkan nilai FALSE akan bernilai 0. Bisa jadi pada bahasa pemrograman selain VBA akan memiliki hasil konversi ke numerik yang berbeda untuk nilai TRUE-nya. Didalam worksheet Excel, nilai TRUE akan dikonversi menjadi nilai 1. Nilai selain 0 akan setara dengan TRUE.

Proses penyusunan kondisi tersebut membutuhkan operator penyusun kalimat kondisi yang disebut comparison operator, antara lain berupa :
  • < (kurang dari); A < B menghasilkan TRUE ketika A kurang dari B
  • > (lebih dari); A > B menghasilkan TRUE ketika A lebih dari B
  • <= (kurang dari atau sama dengan); A <= B menghasilkan TRUE ketika A adalah sebelum B dan maksimal sampai B
  • >= (lebih dari atau sama dengan); A >= B menghasilkan TRUE ketika A mulai dari B atau lebih dari B
  • <> (bukan); A <> B menghasilkan TRUE ketika A selalu berbeda dengan B
  • = (sama dengan); A = B menghasilkan TRUE ketika A bernilai sama dengan B
  • Is (adalah [khusus object]); rngFind Is Nothing menghasilkan TRUE ketika variabel bernama rngFind tidak ada isinya
  • Like (ada bunyi [khusus string]); sTeks Like sPattern menghasilkan TRUE ketika nilai dalam sTeks memiliki bunyi nilai sPattern

Operator logika (Logical Operator)

Sering ditemui juga suatu kebutuhan yang harus memeriksa secara langsung beberapa kondisi, baik yang terdiri dari sebuah kriteria maupun yang banyak kriterianya. Antar kondisi tersebut memiliki suatu hubungan yang harus terpenuhi. Hubungan tersebut sering dinamakan sebagai hubungan logika. Contohnya adalah ketika nilai penjualan mencapai sekian atau jumlah item tertentu yang terjual mencapai sekian maka akan dilakukan proses demikian. Nilai penjualan mencapai sekian adalah kondisi pertama. Jumlah item tertentu yang terjual mencapai sekian adalah kondisi kedua. Kondisi pertama dengan kondisi kedua harus terpenuhi melalui hubungan 'atau', yang berarti andaikan salah satu saja dari kondisi tersebut terpenuhi, proses yang demikian akan dilakukan.

Hubungan logika yang sering digunakan adalah :
  • AND seperti kondisi1 AND kondisi2 maka kedua-duanya harus terpenuhi
  • OR seperti kondisi1 OR kondisi2 maka ada yang harus terpenuhi
  • XOR seperti kondisi1 XOR kondisi2 maka hanya satu saja yang terpenuhi dan tidak boleh keduanya terpenuhi
  • NOT seperti NOT kondisi1 maka selain kondisi1 yang terpenuhi

Bentuk dasar blok IF

Banyak sekali dan sangat sering dijumpai di dalam penentuan alur proses atau pemilihan suatu proses dalam pemrograman menggunakan kata IF yang berarti jika. Kalimat dasarnya adalah 'jika suatu kondisi terpenuhi maka lakukan yang ini, jika kondisi tidak terpenuhi maka lakukan yang itu'. Statement IF bisa digunakan untuk menentukan suatu nilai ataupun suatu proses berdasar suatu kondisi tertentu.

Syntax IF adalah :
   IF kondisi_1 THEN
       proses untuk kondisi_1 yang terpenuhi
   ELSEIF kondisi_2 THEN
       proses untuk kondisi_2 yang terpenuhi
   ELSEIF .. THEN
       .
   .
   ELSEIF kondisi_N THEN
       proses untuk kondisi_N yang terpenuhi
   ELSE
       proses untuk yang tidak memenuhi kondisi apapun
   END IF

Bentuk dasar sebagai sebuah blok IF di atas akan memudahkan pembacaan dan penyusunan alur logika.

Beberapa bentuk penggunaan IF

Dari bentuk dasar IF ini, akan muncul berbagai bentuk, seperti :

Sebaris khusus untuk proses yang harus memenuhi sebuah kondisi

   IF kondisi1 THEN proses_kondisi1_terpenuhi
meskipun bisa disusun dalam bentuk satu baris penulisan, sebaiknya tetap disusun dalam bentuk dasarnya menjadi :
   IF kondisi1 THEN
       proses_kondisi1_terpenuhi
   END IF

Contohnya proses jika nilai penjualan 0 maka batalkan proses :
   IF lJual = 0 THEN Exit Sub
sebaiknya tetap ditulis dalam bentuk dasar IF sebagai :
   IF lJual = 0 THEN    'nilai penjualan adalah 0
       Exit Sub
   END IF


Sebaris untuk mencabang 2 suatu proses berdasar sebuah kondisi :

   IF kondisi1 THEN proses_cabang1 ELSE proses_cabang2
meskipun bisa disusun dalam bentuk satu baris penulisan, sebaiknya tetap disusun dalam bentuk dasarnya menjadi :
   IF kondisi1 THEN
       proses_cabang1
   ELSE
       proses_cabang2
   END IF

Contohnya proses jika nilai penjualan 0 maka tetapkan nilai persentase bonus dengan 0 persen. Jika nilai penjualan tidak 0 maka tetapkan nilai persentase bonus dengan nilai penjualan dibagi 1juta :
   IF lJual = 0 THEN dblBonus = 0 ELSE dblBonus = lJual / 1000000
meskipun bisa disusun dalam bentuk satu baris penulisan, sebaiknya tetap disusun dalam bentuk dasarnya menjadi :
   IF lJual = 0 THEN                'nilai penjualan adalah 0
       dblBonus = 0
   ELSE                             'nilai penjualan bukan 0
       dblBonus = lJual / 1000000
   END IF


Satu kriteria dengan banyak batas :

   IF kondisi1_batas1 THEN
       proses batas 1
   ELSEIF kondisi1_batas2 THEN
       proses batas 2
   .
   ELSE
       proses tidak memenuhi batas-batas yang ada
   END IF

Contohnya adalah penentuan nilai kualitas produk 'A' sampai 'C' berdasar batas minimal nilai lulus uji mencapai 90,75,60 dengan sisanya dinyatakan gagal :
   IF lNilai >= 90 THEN        'Nilai dimulai dari 90 ke atas
       sAkhir = "A"
   ELSEIF lNilai >= 75 THEN    'Nilai dimulai dari 75 sampai sebelum 90
       sAkhir = "B"
   ELSEIF lNilai >= 60 THEN    'Nilai dimulai dari 60 sampai sebelum 75
       sAkhir = "C"
   ELSE                        'Nilai kurang dari 60 (tidak mencapai 60)
       sAkhir = "Gagal"
   END IF


Banyak kriteria :

   IF kondisi1 THEN
       proses kondisi1
   ELSEIF kondisi2 THEN
       proses kondisi2
   .
   ELSE
       proses lainnya
   END IF

Contohnya adalah ketika proses akan diarahkan berdasar warna produk yang merah akan memberi nilai jual adalah 100, jika tinggi lebih dari 50 akan diberi potongan harga sebanyak 25 persen dan selainnya akan diberi nilai kualitas 'C' :
   IF sWarna = "Merah" THEN    'produk warna merah
       lJual = 100
   ELSEIF lTinggi > 50 THEN    'tinggi produk lebih dari 50
       dblDisc = 0.25
   ELSE                        'produk lainnya
       sAkhir = "C"
   END IF


Bersarang ( IF di dalam IF ) :

Bisa digunakan ketika kondisi tersusun atas banyak kriteria, berjenjang, dan harus terpenuhi mengikuti urutan pemeriksaan tertentu :
   IF kondisi1 THEN
       IF kondisi1A THEN
           proses untuk kondisi 1A
       ELSEIF kondisi1B THEN
           proses untuk kondisi 1B
       .
       ELSE
           proses lain selama kondisi1 terpenuhi
       END IF
   ELSEIF kondisi2 THEN
       IF kondisi2A THEN
           .
       ELSEIF .. THEN
           .
       ELSE
           .
       END IF
   .
   ELSE
       IF .. THEN
           .
       ELSEIF .. THEN
           .
       ELSE
           .
       END IF
   END IF

Jumlah level IF yang ada di dalam sebuah IF bisa bertingkat sangat banyak. Kondisi yang paling sering dan mungkin terjadi diletakkan pada baris-baris awal blok IF. Misalnya, kondisi berbunyi nilai penjualan lebih dari nol lebih sering terjadi dibanding nilai penjualan adalah 0, maka gunakan kondisi nilai penjualan lebih dari 0.

Contohnya adalah penentuan bonus untuk warna merah berdasar jumlah item terjual, sedang penentuan bonus untuk tinggi produk lebih dari 50 akan berdasar nilai penjualan, dan selainnya berdasar indeks kualitas penjualannya. Penjualan warna merah lebih sering terjadi dibanding berdasar tinggi produk. Susunan blok IF-nya bisa berupa :
IF sWarna = "Merah" THEN      'produk warna merah
    IF lJual > 10 THEN           'terjual lebih dari 10 item
        dblBonus = 0.25
    ELSEIF lJual > 5 THEN        'terjual lebih dari 5 item - 10 item
        dblBonus = 0.1
    ELSE                         'terjual maksimal 5 item
        dblBonus = 0
    END IF
ELSEIF lTinggi > 50 THEN        'produk dengan tinggi bernilai 50
    IF curSales > 2000000 THEN       'terjual senilai lebih dari 2juta
        dblBonus = 0.25
    ELSEIF curSales >= 1000000 THEN  'terjual mulai 1juta sampai 2juta
        dblBonus = 0.2
    ELSEIF curSales > 500000 THEN    'lebih dari 500ribu tapi belum 1juta
        dblBonus = 0.1
    ELSE                             'terjual maksimal senilai 500ribu
        dblBonus = 0
    END IF
ELSE                       'produk yang bukan berkriteria khusus
    IF sAkhir = "A" THEN      'termasuk kualitas penjualan A
        dblBonus = 0.35
    ELSEIF sAkhir = "B" THEN  'termasuk kualitas penjualan B
        dblBonus = 0.15
    ELSE                      'termasuk dalam kualitas penjualan lainnya
        dblBonus = 0.01
    END IF
END IF


Penggunaan operator logika dalam IF

Beberapa kondisi yang saling terkait dengan operator logika tertentu dapat membentuk sebuah kondisi baru. Penggunaan IF yang disertai operator logika antara lain seperti :

Operator AND seperti kondisi1 AND kondisi2

   IF kondisi1 AND kondisi2 THEN
       proses ketika kondisi1 dan kondisi2 terpenuhi seluruhnya
   ELSE
       proses ketika tidak terpenuhi
   END IF

Susunan seperti ini, terutama untuk operator logika AND pada banyak kondisi, akan lebih cepat bila disusun sebagai :
   IF kondisi1 THEN
       IF kondisi2 THEN
           proses ketika kondisi1 dan kondisi2 terpenuhi seluruhnya
       ELSE
           proses ketika tidak terpenuhi
       ENDIF
   ELSE
       proses ketika tidak terpenuhi
   END IF

Contohnya, bonus diberikan 25% ketika nilai penjualan mencapai 100 sampai dengan 500, selainnya adalah 0%
   dblBonus = 0
   IF lNilai >= 100 AND lNilai <= 500 THEN
       dblBonus = 0.25
   END IF

akan lebih cepat diproses, terutama saat ada banyak kondisi dengan operator logika AND, jika dibentuk dalam susunan :
   dblBonus = 0
   IF lNilai >= 100 THEN
       IF lNilai <= 500 THEN
           dblBonus = 0.25
       END IF
   END IF


Operator OR seperti kondisi1 OR kondisi2

   IF kondisi1 OR kondisi2 THEN
       proses ketika salah satunya terpenuhi
   ELSE
       proses ketika tidak ada yang terpenuhi
   END IF

Susunan seperti ini, terutama untuk operator logika OR pada banyak kondisi, akan lebih cepat bila disusun sebagai :
   IF kondisi1 THEN
       proses ketika salah satunya terpenuhi
   ELSEIF kondisi2 THEN
       proses ketika salah satunya terpenuhi
   ELSE
       proses ketika tidak ada yang terpenuhi
   END IF

Contohnya, bonus diberikan 25% ketika produk yang terjual adalah salah satu dari warna merah atau hijau, atau tinggi produk lebih dari 50. Selainnya akan diberi bonus 0%.
   dblBonus = 0
   IF sWarna = "Merah" OR sWarna = "Hijau" OR lTinggi > 50 THEN
       dblBonus = 0.25
   END IF

akan lebih cepat diproses, terutama saat ada banyak kondisi dengan operator logika AND, jika dibentuk dalam susunan :
   dblBonus = 0
   IF sWarna = "Merah" THEN
       dblBonus = 0.25
   ELSEIF sWarna = "Hijau" THEN
       dblBonus = 0.25
   ELSEIF lTinggi > 50 THEN
       dblBonus = 0.25
   END IF


Operator NOT (bukan atau selain kondisi yang ada)

   IF NOT kondisi1 THEN
       proses ketika kondisi1 tidak terpenuhi
   ELSE
       proses ketika kondisi1 terpenuhi
   END IF

Bisa jadi kondisi1 adalah hasil dari operator logika terhadap beberapa kondisi lain. Misalnya kondisi2 AND ( kondisi3A OR kondisi3B ) akan membentuk kondisi baru bernama kondisi1. Maka susunan IF dengan opreator logika NOT bisa berupa :
   IF NOT ( kondisi2 AND ( kondisi3A OR kondisi3B ) ) THEN
       proses ketika kondisi1 tidak terpenuhi
   ELSE
       proses ketika kondisi1 terpenuhi
   END IF

Contohnya adalah ketika produk adalah warna merah maka nilai bonus adalah 10% dan selainnya adalah 25%, dapat disusun kondisi berbunyi :
   dblBonus = 0.1
   IF NOT ( sWarna = "Merah" ) THEN
       dblBonus = 0.25
   END IF


:)

Pembahasan selanjutnya adalah tentang statement Select Case yang merupakan bahasa lain dari sebagian bentuk penggunaan IF. Juga akan dibahas beberapa fungsi-fungsi bawaan VB/VBA yang bisa digunakan untuk penentuan suatu nilai berdasarkan kondisi tertentu, seperti fungsi IIF, Choose, dan Switch.




No comments:

Post a Comment