Saturday, August 31, 2013

BelajarVBA 010 - Perulangan 3 : FOR EACH dan keluar dari loop

Coretan Mr. Kid

Bermewah-mewahan dan tidak memerangi kebodohan diri akan membuat seseorang menjadi pecinta dunia dan melupakan bahwa kelak dia akan mempertanggungjawabkan segala perbuatannya

Perulangan (loop) berupa blok FOR ... NEXT dan DO ... LOOP telah dibahas pada episode sebelumnya. Pada umumnya, proses loop yang telah dibahas tersebut digunakan untuk melakukan loop terhadap suatu nilai dari suatu kondisi awal sampai kondisi akhir yang berupa nilai numerik. Penggunaan blok loop seperti FOR ... NEXT atau DO ... LOOP terhadap suatu array adalah dengan melakukan loop terhadap indeks elemen array. Sedangkan loop pada suatu object collection dilakukan terhadap indeks koleksinya.

Pembahasan kali ini adalah tentang blok FOR EACH yang dapat digunakan untuk melakukan loop terhadap setiap item arrayatau setiap item object collection. Misalnya melakukan loop terhadap setiap range pada suatu kumpulan range tertentu atau melakukan loop terhadap setiap worksheet yang ada di dalam workbook. Selain itu, akan dibahas pula tentang statement dan penyusunan baris kode agar proses loop berhenti ketika memang dikehendaki untuk berhenti pada saat nilai loop tersebut.



Bentuk dasar FOR EACH

Perulangan yang menggunakan statement FOR EACH akan melakukan perulangan dengan mengambil setiap elemen suatu grup data. Grup data bisa berupa array ataupun object collection. Jadi pada perulangan ini, nilai loop yang diproses adalah elemen suatu grup itu sendiri. Jika grup data berupa object collection, maka nilai loop adalah setiap item object dari object colletion tersebut.

Syntax :
   FOR EACH var_item IN grup_data
      'baris kode yang di-loop untuk setiap var_item
   NEXT var_item


Hal yang perlu diperhatikan :
  • var_item ber-datatype Variant jika grup_data adalah suatu array
  • var_item ber-datatype Variant, Object atau nama class object dari item dalam grup data jika grup_data adalah suatu object collection
  • minimal ada sebuah elemen atau item didalam grup_data
Contoh 1 :
Menampilkan nilai setiap kode dari sebuah daftar kode yang berisi nilai-nilai kode 10,15, dan 20. Pada kasus ini, dapat diketahui bahwa ada sebuah daftar kode yang berisi 3 buah nilai kode, yaitu 10,15, dan 20. Daftar ini berupa array. Proses loop dilakukan untuk mengambil setiap nilai kode dalam daftar tersebut. Kemudian memprosesnya, dimana proses tersebut adalah menampilkan kepada user. Prosedur loop untuk kasus ini dapat berbunyi :
   Public Sub Contoh1_ForEachNext()
      Dim vKode As Variant
   
      For Each vKode In Array(10, 15, 20)
         MsgBox vKode
      Next vKode
   End Sub

Proses yang terjadi pada prosedur di atas adalah :
  • Deklarasi variabel item loop bernama vKode yang akan menampung salah satu elemen dari daftar kode. Karena data akan berupa array, maka dipilihlah datatype Variant untuk variabel vKode.
  • Proses loop dimulai dengan mendefinisikan variabel penampung setiap elemen array [vKode] dan mendefinisikan grup data yang akan di-loop [Array(10, 15, 20)] pada baris berbunyi :
     For Each vKode In Array(10, 15, 20)
  • Baris tersebut memiliki arti bahwa setiap elemen dari Array(10, 15, 20) diproses satu persatu dengan meletakkannya di wadah bernama vKode
  • Proses loop pertama akan membuat vKode berisi elemen array pertama yang bernilai 10
  • Kemudian proses dalam loop dikerjakan, yaitu baris kode berbunyi :
     MsgBox vKode
  • Setelah itu, akan beralih ke elemen array berikutnya saat proses mencapai baris kode berbunyi :
     Next vKode
  • Karena masih ada elemen array yang belum pernah dimasukkan ke dalam vKode, maka terjadilah pengambilan elemen array tersebut dan memasukkannya ke dalam vKode. Jadi, vKode akan berubah isinya menjadi elemen array kedua yang bernilai 15.
  • Baris kode dalam blok loop kembali dikerjakan, yaitu menampilkan nilai vKode kepada user melalui baris kode :
     MsgBox vKode
  • Proses akan berlangsung demikian terus menerus sampai seluruh elemen array pernah diambil dan dimasukkan ke dalam variabel vKode
  • Ketika seluruh elemen array pernah diambil dan dimasukkan ke dalam vKode, maka proses loop selesai atau keluar dari blok loop
  • Proses akan beralih ke baris kode berikutnya. Ternyata baris kode berikutnya adalah akhir blok prosedur (END SUB), maka prosedur selesai dikerjakan

Contoh 2 :
Menampilkan nama worksheet dari setiap worksheet yang ada di dalam workbook. Pada kasus ini dapat diketahui bahwa grup data adalah berupa object collection, yaitu kumpulan worksheet dalam workbook. Setiap item dalam collection tersebut memiliki datatype object Worksheet. Jadi, variabel item dapat menggunakan datatype Worksheet. Prosedur untuk kasus ini dapat berbunyi :
   Public Sub Contoh2_ForEachNext()
      Dim sht As Worksheet
   
      For Each sht In ThisWorkbook.Worksheets
         MsgBox sht.Name
      Next sht
   End Sub

Proses yang terjadi pada prosedur di atas adalah :
  • Deklarasi variabel item bernama sht yang ber-datatype Worksheet karena grup data berupa object collection yang berisi object worksheet
  • Proses loop dimulai dengan mendefinisikan variabel penampung setiap item object collection [sht] dan mendefinisikan grup data yang akan di-loop [ThisWorkbook.Worksheets] pada baris berbunyi :
     For Each sht In ThisWorkbook.Worksheets
  • Baris tersebut memiliki arti bahwa setiap item Worksheet (karena datatype sht adalah Worksheet) dari kumpulan worksheet dalam workbook  diproses satu persatu dengan meletakkannya di wadah bernama sht
  • Proses loop pertama akan membuat sht berisi object worksheet dengan indeks 1 yang ada dalam workbook
  • Kemudian proses dalam loop, yang berupa menampilkan nama worksheet, dikerjakan. Proses tersebut adalah baris kode berbunyi :
     MsgBox sht.Name
  • Setelah itu, akan beralih ke item worksheet berikutnya saat proses mencapai baris kode berbunyi :
     Next sht
  • Jika masih ada item worksheet yang belum pernah dimasukkan ke dalam sht, maka terjadilah pengambilan item worksheet tersebut dan memasukkannya ke dalam sht. Jadi, sht akan berubah isinya menjadi object worksheet yang memiliki indeks 2 yang ada dalam workbook.
  • Baris kode dalam blok loop kembali dikerjakan, yaitu menampilkan nama worksheet kepada user melalui baris kode :
     MsgBox sht.Name
  • Proses akan berlangsung demikian terus menerus sampai seluruh item dalam object collection worksheet pernah diambil dan dimasukkan ke dalam variabel sht
  • Ketika seluruh item worksheet dalam object collection worksheet pernah diambil dan dimasukkan ke dalam sht, maka proses loop selesai atau keluar dari blok loop
  • Proses akan beralih ke baris kode berikutnya. Ternyata baris kode berikutnya adalah akhir blok prosedur (END SUB), maka prosedur selesai dikerjakan

Nested For Each

Seperti halnya blok loop lainnya, blok loop dengan FOR EACH juga bisa berada dalam blok loop lainnya, termasuk dalam blok loop dengan FOR EACH lainnya.

Bentuk dasarnya adalah :
   FOR EACH var_item1 IN grup_data1
      'baris kode yang di-loop untuk setiap var_item1
      FOR EACH var_item2 IN grup_data2
         'baris kode yang di-loop untuk setiap var_item2
      NEXT var_item2
      'baris kode yang di-loop untuk setiap var_item1   
   NEXT var_item1

Kaidah pemilihan datatype setiap var_item disesuaikan dengan grup_data masing-masing.

Contoh :
Menuliskan kombinasi nomor urut dan nomor kode. Nomor urut dari nomor 1 sampai 5. Nomor kode adalah 10, 15, dan 20. Setiap nomor urut akan mendapatkan setiap nomor kode. Ditulis pada sheet bernama 'Dataku' mulai baris 2, dengan nomor urut ditulis di kolom A (kolom ke-1 dalam sheet Dataku) dan nomor kode ditulis di kolom B (kolom ke-2 dalam sheet Dataku).

Kasus ini akan diselesaikan dengan FOR EACH seluruhnya, meskipun bisa dilakukan dengan blok loop lainnya. Pada kasus ini dapat diketahui bahwa :
  • Untuk nomor urut, akan ada grup data berupa array berisi angka 1 sampai 5
  • Setiap elemen array nomor urut akan dimasukkan ke wadah ber-datatype Variant yang diberi nama vNomor
  • Untuk nomor kode, akan ada grup data berupa array berisi angka-angka 10, 15, dan 20
  • Setiap elemen array nomor kode akan dimasukkan ke wadah ber-datatype Variant yang diberi nama vKode
  • Penulisan dilakukan ke sheet bernama Dataku mulai baris 2
  • Penulisan dimulai dari baris 2. Artinya dibutuhkan sebuah variabel penyimpan posisi penulisan, misalnya bernama lBaris dan akan dimulai dari nilai 2
  • Setiap nomor urut akan mendapatkan setiap nomor kode. Artinya bahwa loop terhadap array nomor kode ada di dalam loop terhadap array nomor urut
  • Penulisan nomor urut dan nomor kode dilakukan setiap pembacaan elemen array nomor kode atau di dalam blok loop terhadap array nomor kode.
  • Nilai lBaris akan bertambah 1 setiap selesai menuliskan nomor kode
  • Baris kode penambahan lBaris tersebut diletakkan dalam blok loop terhadap array nomor kode
Prosedur untuk contoh kasus ini dapat berbunyi :
   Public Sub Contoh1_NestedForEach()
      Dim vNomor As Variant, vKode As Variant
      Dim lBaris As Long
   
      lBaris = 2
      For Each vNomor In Array(1, 2, 3, 4, 5)

         For Each vKode In Array(10, 15, 20)
            Sheets("Dataku").Cells(lBaris, 1).Value = vNomor
            Sheets("Dataku").Cells(lBaris, 2).Value = vKode
           
            lBaris = lBaris + 1
         Next vKode

      Next vNomor
   End Sub


Keluar dari loop

Seringkali terjadi bahwa sebuah loop akan diarahkan untuk segera selesai atau proses segera keluar dari loop tanpa perlu menyelesaikannya sampai dengan item terakhir yang telah didefinisikan dalam baris definisi loop. Misalkan saja ketika melakukan loop terhadap suatu area range dan proses loop akan dihentikan ketika range tidak berisi suatu nilai. Pada dasarnya, ketika nilai yang di-loop tidak memenuhi ekspresi kondisi batas loop maka proses loop akan selesai atau dihentikan. Jadi, dengan mengubah nilai yang di-loop menjadi tidak memenuhi ekspresi kondisi adalah salah satu cara untuk keluar dari loop. Saat ini, cara ini umumnya digunakan hanya ketika menggunakan blok loop WHILE ... WEND. Blok loop FOR ... NEXT, FOR EACH, dan DO ... LOOP juga bisa menggunakan cara ini jika dikehendaki.

Khusus untuk blok loop FOR ... NEXT, FOR EACH dan DO ... LOOP dapat juga menggunakan statement yang sudah disediakan oleh VB/VBA, yaitu :
  • EXIT FOR untuk keluar dari blok loop yang menggunakan FOR (FOR ... NEXT atau FOR EACH)
  • EXIT DO untuk keluar dari blok loop yang menggunakan DO ... LOOP, meskipun pada beberapa kasus, batasan harus keluar dari loop bisa dijadikan salah satu elemen penyusun ekspresi kondisi dengan memanfaatkan statement logika seperti AND atau OR

Pada blok loop yang bersarang (nested loop), maka EXIT FOR atau EXIT DO akan keluar dari blok loop di level tersebut. Misal, EXIT FOR terletak pada blok loop dengan FOR ... NEXT yang ada di dalam blok loop dengan DO ... LOOP. Maka EXIT FOR akan membuat proses loop keluar dari blok loop dengan FOR ... NEXT. Meski demikian, proses loop pada blok DO ... LOOP masih bekerja karena blok loop ini berada dilevel lebih atas daripada blook loop dengan FOR ... NEXT.

Contoh 1 :
Menampilkan hasil penjumlahan nilai 1 sampai suatu nilai akhir tertentu yang tertinggi atau senilai 17. Prosedur loop untuk kasus ini bisa berbunyi :
1. Blok loop FOR ... NEXT
  • Menggunakan EXIT FOR
     Public Sub Contoh1_KeluarExitFor()
        Dim lNomor As Long, lTotal As Long, lAkhir As Long
   
        lAkhir = 5
        For lNomor = 1 To lAkhir
           lTotal = lTotal + lNomor
           If lTotal >= 17 Then
              lTotal = lTotal - lNomor
              Exit For
           End If
        Next lNomor
        MsgBox "Berhenti di lNomor = " & lNomor - 1 & vbCrLf & _
            "dengan lTotal = " & lTotal _
            , vbExclamation
     End Sub

  • Mengubah nilai yang di-loop
     Public Sub Contoh1_KeluarSetNilai()
        Dim lNomor As Long, lNomorReal As Long
        Dim lTotal As Long, lAkhir As Long
   
        lAkhir = 5
        For lNomor = 1 To lAkhir
           lTotal = lTotal + lNomor
           lNomorReal = lNomor
           If lTotal >= 17 Then
              lTotal = lTotal - lNomor
              lNomorReal = lNomor - 1
              lNomor = lAkhir
           End If
        Next lNomor
        MsgBox "Berhenti di lNomor = " & lNomorReal & vbCrLf & _
            "dengan lTotal = " & lTotal _
            , vbExclamation
     End Sub

Pada kedua prosedur di atas, proses loop akan berhenti ketika lTotal telah mencapai nilai 17 atau lebih atau ketika batas akhir loop tercapai. Kemudian menampilkan hasil penjumlahan kepada user menggunakan sebuah kotak pesan.
Perbedaan antara kedua prosedur adalah :
  • penggunaan baris EXIT FOR pada prosedur bernama Contoh1_KeluarExitFor dan menggunakan baris kode pengubah nilai loop menjadi nilai diluar area kerja loop yang berbunyi lNomor = lAkhir.
  • Nilai nomor urut saat nilai total tercapai dapat dihitung dengan pasti pada prosedur Contoh1_KeluarExitFor, yaitu dengan mengurangkannya dengan nilai interval yang diletakkan setelah statement STEP. Pada kasus ini, intervalnya menggunakan nilai default, yaitu 1, karena tidak ada statement STEP dalam prosedur.
  • Pada prosedur bernama Contoh1_KeluarSetNilai dibutuhkan sebuah variabel tambahan bernama lNomorReal untuk menyimpan nilai nomor urut untuk nilai total yang sedang dihasilkan, karena nilai lNomor akan diubah menjadi lAkhir agar proses loop bisa terhenti ketika batas nilai total telah tercapai.
  • Penambahan baris-baris kode untuk menentukan nilai lNomorReal akan menambah waktu proses yang akan terasa signifikan ketika melakukan loop terhadap data yang sangat banyak.


2. Blok loop DO ... LOOP
  • Menggunakan EXIT DO
     Public Sub Contoh2_KeluarExitDo()
        Dim lNomor As Long, lAkhir As Long
        Dim lTotal As Long
   
        lNomor = 1
        lAkhir = 5
        Do While lNomor <= lAkhir
           lTotal = lTotal + lNomor
           If lTotal >= 17 Then
              lTotal = lTotal - lNomor
              Exit Do
           End If
           lNomor = lNomor + 1
        Loop
        MsgBox "Berhenti di lNomor = " & lNomor - 1 & vbCrLf & _
            "dengan lTotal = " & lTotal _
            , vbExclamation
     End Sub

  • Mengubah nilai yang di-loop
     Public Sub Contoh2_KeluarSetNilai()
        Dim lNomor As Long, lNomorReal As Long
        Dim lTotal As Long, lAkhir As Long
   
        lNomor = 1
        lAkhir = 5
        Do While lNomor <= lAkhir
           lTotal = lTotal + lNomor
           lNomorReal = lNomor
           If lTotal >= 17 Then
              lTotal = lTotal - lNomor
              lNomorReal = lNomor - 1
              lNomor = lAkhir
           End If
           lNomor = lNomor + 1
        Loop
        MsgBox "Berhenti di lNomor = " & lNomorReal & vbCrLf & _
            "dengan lTotal = " & lTotal _
            , vbExclamation
     End Sub

  • Memasukkan batasan keluar kedalam ekspresi kondisi
     Public Sub Contoh2_KeluarEkspresiKondisi()
        Dim lNomor As Long, lNomorReal As Long
        Dim lTotal As Long, lAkhir As Long
   
        lNomor = 1
        lAkhir = 5
        Do While lNomor <= lAkhir And lTotal + lNomor <= 17
           lTotal = lTotal + lNomor
           lNomor = lNomor + 1
        Loop
        MsgBox "Berhenti di lNomor = " & lNomor - 1 & vbCrLf & _
            "dengan lTotal = " & lTotal _
            , vbExclamation
     End Sub

Perbedaan antara prosedur Contoh2_KeluarExitDo dengan Contoh2_KeluarSetNilai sama dengan perbedaan antara prosedur Contoh1_KeluarExitFor dengan Contoh2_KeluarSetNilai. Hanya saja, statement yang digunakan adalah EXIT DO dan bukan EXIT FOR. Pada prosedur Contoh2_KeluarEkspresiKondisi, batasan keluar dari loop dimasukkan ke dalam ekspresi kondisi. Batasan keluar loop adalah ketika nilai total ditambahkan nilai nomor yang baru masih di dalam batas nilai total yang ditentukan (17). Kondisi kerja loop juga dipengaruhi nilai nomor yang kurang dari atau sama dengan nilai akhir (lAkhir). Penggunaan statement logika AND untuk menghubungkan kedua kondisi tersebut disebabkan karena seluruh kondisi harus terpenuhi. Ekspresi kondisi yang terbentuk adalah :
   lNomor <= lAkhir And lTotal + lNomor <= 17
Blok loop yang digunakan untuk ekspresi kondisi di atas adalah DO WHILE

3. Blok loop WHILE ... WEND
     Public Sub Contoh3_KeluarWhileWend()
        Dim lNomor As Long, lNomorReal As Long
        Dim lTotal As Long, lAkhir As Long
   
        lNomor = 1
        lAkhir = 5
        While lNomor <= lAkhir And lTotal + lNomor <= 17
           lTotal = lTotal + lNomor
           lNomor = lNomor + 1
        Wend
        MsgBox "Berhenti di lNomor = " & lNomor - 1 & vbCrLf & _
            "dengan lTotal = " & lTotal _
            , vbExclamation
     End Sub

Prosedur Contoh3_KeluarWhileWend mirip dengan prosedur bernama Contoh2_KeluarEkspresiKondisi. Hanya berbeda jenis blok loop yang digunakan, yaitu WHILE ... WEND pada prosedur Contoh3_KeluarWhileWend dan DO WHILE ... LOOP pada prosedur Contoh2_KeluarEkspresiKondisi.

Contoh 2 :
Menampilkan hasil penjumlahan dari nilai-nilai yang ada di sheet bernama Dataku pada kolom Q mulai baris 1 sampai suatu cell di kolom Q tersebut adalah kosong. Prosedur loop untuk kasus ini bisa berbunyi :
   Public Sub Contoh4_KeluarForEach()
      Dim rng As Range, lTotal As Long
   
      For Each rng In Sheets("Dataku").Range("Q:Q")
         If Len(rng.Value) = 0 Then
            Exit For
         End If
         lTotal = lTotal + rng.Value
      Next rng
      MsgBox "lTotal = " & lTotal & vbCrLf & _
            "terakhir di baris " & rng.Row - 1 _
            , vbExclamation
   End Sub

Pada prosedur di atas, pemeriksaan tentang keberadaan isi suatu cell adalah dengan membandingkan bahwa jumlah karakter (LEN) di cell tersebut adalah 0. Hal ini dilakukan pada baris :
   If Len(rng.Value) = 0 Then
Ketika hasil pemeriksaannya adalah TRUE alias panjang karakter cell tersebut adalah 0, maka proses akan masuk ke dalam blok IF yang berisi baris kode untuk keluar blok FOR yang berbunyi :
   Exit For

Simpulan

Penggunaan FOR EACH bisa jadi akan lebih lambat dibandingkan penggunaan DO ... LOOP atau FOR ... NEXT pada kondisi-kondisi tertentu. Penggunaan grup data yang bisa diisi dengan data-data pilihan saja adalah salah satu yang membuat FOR EACH terasa begitu praktis dan efisien. Contohnya adalah pada hasil autofilter suatu tabel yang menghasilkan data yang tidak kontinyu baris-baris Excel-nya akan mudah dijadikan sebagai sebuah grup data, sehingga proses loop yang harus dilakukan pada hasil autofilter tersebut akan lebih sederhana jika menggunakan FOR EACH.

:)

Insya Allah pembahasan selanjutnya adalah tentang dasar-dasar dalam menggunakan object range. Hal ini mencakup tentang pemahaman LastCell, CurrentRegion, Offset, Resize, End xlUp atau End xlDown, dan sebagainya. Dasar-dasar dalam menggunakan object range akan memudahkan dalam mengolah data menggunakan VBA, karena menyusun rujukan yang dinamis membutuhkan pemahaman tentang cara menggunakan object range. Contohnya adalah menentukan batas bawah tabel data yang ada atau menentukan baris kosong pertama yang ada disebuah tabel data berkaidah database.




Thursday, August 29, 2013

BelajarVBA 010 - Perulangan 2 : DO ... LOOP

Coretan Mr. Kid

Seorang petani yang ingin memanen buah tomat harus menamam tanaman tomat dengan bibit yang baik kemudian merawatnya dengan sungguh-sungguh agar Tuhan berkenan menumbuhkan buah tomat kualitas super. Apakah yang ingin Anda panen kelak ? Sudahkah Anda menanamnya saat ini ? Jika sudah menanamnya, apakah sudah Anda rawat dengan sungguh-sungguh ?

Pada pembahasan yang lalu telah dibahas tentang perulangan menggunakan statement FOR ... NEXT. Blok FOR ... NEXT yang telah dibahas adalah yang bekerja berdasar nilai batas awal dan batas akhir dengan interval lompatan antar nilai yang diproses yang tertentu dalam susunan awal TO akhir STEP interval. Jadi dibutuhkan setidaknya 2 (dua) nilai sebagai nilai batas dan 1 (satu) nilai interval dengan default adalah 1. Kali ini pembahasan akan menggunakan DO ... LOOP disertai pengenalan penggunaan statement WHILE ... WEND.



Bentuk dasar DO ... LOOP

Pembahasan kali ini adalah tentang perulangan memanfaatkan statement DO ... LOOP. Perulangan ini membentuk blok DO ... LOOP yang membutuhkan ekspresi kondisi sebagai pembatas proses dan penentuan nilai yang diproses didalam blok tersebut. Ekspresi pembatas didefinisikan bersama statement WHILE atau UNTIL. Blok DO ... LOOP berdasar letak pendefinisian ekspresi batas memiliki 2 (dua) macam, yaitu :
  • Ekspresi batas di baris DO, yaitu memulai proses perulangan ketika benar-benar telah terpenuhi kondisi batasnya
  • Ekspresi batas di baris LOOP, yaitu memproses perulangan setidaknya sekali sebelum memeriksa kondisi batasnya

Syntax :
  • Ekspresi batas di baris DO
     DO WHILE|UNTIL ekspresi_kondisi_batas
        'baris kode yang diulang
     LOOP

  • Ekspresi batas di baris LOOP
     DO
        'baris kode yang diulang
     LOOP WHILE|UNTIL ekspresi_kondisi_batas


Statement WHILE atau UNTIL dipilih sesuai kebutuhan, yaitu :
  • Statement WHILE membutuhkan ekspresi kondisi batas terakhir dari nilai yang boleh diproses.
  • Statement UNTIL membutuhkan ekspresi kondisi batas pertama dari nilai yang diluar area nilai yang boleh diproses.

Contohnya adalah membuat nomor urut dari 3 sampai 8 dan ditulis di sheet bernama 'Dataku' mulai baris 5 secara berurutan. Dari definisi kasusnya, diketahui bahwa :
  • nilai batas awal adalah 3, yang kemudian disimpan dalam variabel tertentu, misalnya bernama lNomor.
  • nilai terakhir adalah 8, yang akan membentuk ekspresi kondisi batas untuk lNomor
  • ketika akan menggunakan stetement WHILE, maka lNomor selalu kurang dari atau sama dengan 8 yang berbunyi WHILE lNomor <= 8
  • ketika akan menggunakan statement UNTIL, maka lNomor pertama yang diluar batas nilai yang boleh diproses adalah ketika lNomor lebih dari 8 yang berbunyi UNTIL lNomor > 8
  • interval nomor urut yang berurutan berarti adalah selalu bertambah 1, sehingga dibutuhkan baris kode untuk mengubah nilai lNomor menjadi baru yang didapat dari penambahan nilai 1 terhadap nilai lNomor yang lama yang berbunyi lNomor = lNomor + 1
  • penulisan pada sheet bernama 'Dataku'
  • penulisan dimulai dari baris 5, yang berarti nomor barisnya akan selalu berupa lNomor + 2 karena lNomor dimulai dari nilai 3 dan membutuhkan penambahan 2 agar bisa mencapai nomor baris 5.

Prosedur loop untuk kasus ini adalah :
Ekspresi batas di baris DO WHILE LOOP ditulis di kolom A
   Public Sub Contoh1_DoWhileLoop()
      Dim lNomor As Long, lBaris As Long
   
      'hapus yang lama dulu ya
      Sheets("Dataku").Columns(1).ClearContents
   
      'mulai proses contoh
      lNomor = 3
      Do While lNomor <= 8
         lBaris = lNomor + 2
         Sheets("Dataku").Range("A" & lBaris).Value = lNomor
         lNomor = lNomor + 1
      Loop
   End Sub


Proses yang terjadi adalah :
  • Deklarasi variabel nomor urut (lNomor) ber-type Long dan nomor baris penulisan (lBaris) ber-type Long.
  • Menghapus isi data dikolom penulisan
  • Menetapkan nilai awal nomor baris adalah 3
  • Memulai blok loop dengan membawa nilai lNomor bernilai 3, dan memeriksa kondisi batas adalah nomor urut selalu kurang dari atau sama dengan 8 pada baris kode :
     Do While lNomor <= 8
  • Karena lNomor saat ini bernilai 3, berarti lNomor memenuhi kondisi batas. Proses akan dilanjutkan ke baris-baris kode dalam blok DO ... LOOP
  • Mendapatkan nomor baris penulisan pada loop pertama (lNomor = 3) berupa lNomor + 2 yang menghasilkan nilai 3 + 2 = 5
  • Menulis nilai lNomor ke sheet bernama 'Dataku' pada kolom A di baris lBaris
  • Mendapatkan nilai lNomor yang baru dengan menambahkan lNomor yang lama (3) dengan nilai 1, sehingga menghasilkan nilai 4
  • Mengulangi proses blok loop, yaitu kembali ke baris DO, dengan membawa nilai lNomor baru (4)
  • Proses terus berjalan, dengan nilai lNomor yang terus bertambah, hingga suatu saat nanti lNomor yang baru akan bernilai 9, dan proses kembali ke baris DO dengan membawa nilai lNomor yang baru (9) ini.
  • Memeriksa kondisi batas terhadap lNomor (9)
  • Karena nilai 9 yang ada dalam lNomor tidak memenuhi kondisi berbunyi lNomor <= 8, maka proses loop pada blok DO ... LOOP telah selesai dan proses berlanjut ke baris berikutnya seteoah blok DO ... LOOP
  • Baris berikutnya setelah blok DO ... LOOP adalah baris akhir prosedur (END SUB), maka prosedur selesai dikerjakan

Ekspresi batas di baris DO UNTIL LOOP ditulis di kolom C
   Public Sub Contoh1_DoUntilLoop()
      Dim lNomor As Long, lBaris As Long
   
      'hapus yang lama dulu ya
      Sheets("Dataku").Columns(3).ClearContents
   
      'mulai proses contoh
      lNomor = 3
      Do Until lNomor > 8
         lBaris = lNomor + 2
         Sheets("Dataku").Range("C" & lBaris).Value = lNomor
         lNomor = lNomor + 1
      Loop
   End Sub

Prosedur bernama Contoh1_DoUntilLoop akan dijalankan seperti prosedur bernama Contoh1_DoWhileLoop. Perbedaannya adalah pada proses pemeriksaan terhadap ekspresi kondisi. Pada penggunaan UNTIL, yang diperiksa adalah tercapainya kondisi nilai proses yang diluar nilai-nilai yang boleh diproses. Pada kasus ini, nilai-nilai yang boleh diproses adalah sebelum nilai 9. Maka proses akan dikerjakan sampai (UNTIL) mencapai kondisi bahwa nilai lNomor mencapai 9 atau lebih (lNomor > 8).

Ekspresi batas di baris DO LOOP WHILE ditulis di kolom E
   Public Sub Contoh1_DoLoopWhile()
      Dim lNomor As Long, lBaris As Long
   
      'hapus yang lama dulu ya
      Sheets("Dataku").Columns(5).ClearContents
   
      'mulai proses contoh
      lNomor = 3
      Do
         lBaris = lNomor + 2
         Sheets("Dataku").Range("E" & lBaris).Value = lNomor
         lNomor = lNomor + 1
      Loop While lNomor <= 8
   End Sub

Prosedur bernama Contoh1_DoLoopWhile akan diproses sebagai berikut :
  • Deklarasi variabel nomor urut (lNomor) ber-type Long dan nomor baris penulisan (lBaris) ber-type Long.
  • Menghapus isi data dikolom penulisan
  • Menetapkan nilai awal nomor baris adalah 3
  • Memulai blok loop dengan membawa nilai lNomor bernilai 3, dengan menjalankan baris DO
  • Mendapatkan nomor baris penulisan pada loop pertama (lNomor = 3) berupa lNomor + 2 yang menghasilkan nilai 3 + 2 = 5
  • Menulis nilai lNomor ke sheet bernama 'Dataku' pada kolom A di baris lBaris
  • Mendapatkan nilai lNomor yang baru dengan menambahkan lNomor yang lama (3) dengan nilai 1, sehingga menghasilkan nilai 4
  • Mengulangi proses blok loop ketika hasil pemeriksaan ekspresi kondisi batasnya terpenuhi (LOOP)
  • Pemeriksaan nilai lNomor yang baru (4) dengan ekspresi kondisi batas yang berbunyi While lNomor <= 8
  • Karena lNomor yang baru (4) masih memenuhi batas kondisi, yaitu kurang dari atau sama dengan 8, maka proses akan kembali ke baris DO
  • Proses ini akan berlangsung terus menerus dengan nilai lNomor yang terus bertambah, sehingga suatu saat nanti, lNomor yang baru akan mencapai nilai 9
  • Saat lNomor yang baru bernilai 9, dilakukan pemeriksaan oleh baris kode berbunyi :
     Loop While lNomor <= 8
  • Karena lNomor yang baru (9) tidak bisa memenuhi kondisi batas (<=8), maka proses loop oleh blok DO ... LOOP selesai dan proses dilanjutkan ke baris berikutnya setelah blok DO ... LOOP
  • Baris berikutnya setelah blok DO ... LOOP adalah baris akhir prosedur (END SUB), maka prosedur selesai dikerjakan.

Ekspresi batas di baris DO LOOP UNTIL ditulis di kolom G
   Public Sub Contoh1_DoLoopUntil()
      Dim lNomor As Long, lBaris As Long
   
      'hapus yang lama dulu ya
      Sheets("Dataku").Columns(7).ClearContents
   
      'mulai proses contoh
      lNomor = 3
      Do
         lBaris = lNomor + 2
         Sheets("Dataku").Range("G" & lBaris).Value = lNomor
         lNomor = lNomor + 1
      Loop Until lNomor > 8
   End Sub

Prosedur bernama Contoh1_DoLoopUntil akan dijalankan seperti prosedur bernama Contoh1_DoLoopWhile. Perbedaannya adalah pada proses pemeriksaan terhadap ekspresi kondisi. Pada penggunaan UNTIL, yang diperiksa adalah tercapainya kondisi nilai proses yang diluar nilai-nilai yang boleh diproses. Pada kasus ini, nilai-nilai yang boleh diproses adalah sebelum nilai 9. Maka proses akan dikerjakan sampai (UNTIL) mencapai kondisi bahwa nilai lNomor mencapai 9 atau lebih (lNomor > 8).

Ekspresi kondisi yang diletakkan setelah statement DO akan memiliki alur proses yang berbeda dengan yang diletakkan setelah statement LOOP pada bagian awal proses loop-nya.  Hal ini akan tampak jelas ketika lNomor di set untuk dimulai dari nilai 9 pada setiap prosedur contoh di atas. Pada ekspresi kondisi yang diletakkan setelah statement DO tidak akan menulis hasil apapun. Ekspresi kondisi yang diletakkan setelah statement LOOP akan menulis sebuah hasil. Artinya, pada ekspresi kondisi yang diletakkan setelah statement LOOP akan selalu diproses minimal 1 (satu) kali. Hal ini disebabkan karena proses pemeriksaan ekspresi kondisi dilakukan saat akan berpindah ke nilai loop berikutnya.

Nested DO ... LOOP

Blok DO ... LOOP, baik menggunakan WHILE atau UNTIL yang diletakkan pada baris DO ataupun LOOP, bisa diletakkan dalam blok DO ... LOOP apapun yang lain untuk membentuk perulangan yang bersarang (nested).

Syntax umumnya :
  • Ekspresi batas di baris DO
     DO WHILE|UNTIL ekspresi_kondisi_batas1
        'baris kode yang diulang dalam batas1
        DO WHILE|UNTIL ekspresi_kondisi_batas2
           'baris kode yang diulang dalam batas2
        LOOP
        'baris kode yang diulang dalam batas1
     LOOP

          atau
     DO WHILE|UNTIL ekspresi_kondisi_batas1
        'baris kode yang diulang dalam batas1
        DO
           'baris kode yang diulang dalam batas2
        LOOP WHILE|UNTIL ekspresi_kondisi_batas2
        'baris kode yang diulang dalam batas1
     LOOP

  • Ekspresi batas di baris LOOP
     DO
        'baris kode yang diulang dalam batas1
        DO WHILE|UNTIL ekspresi_kondisi_batas2
           'baris kode yang diulang dalam batas2
        LOOP
        'baris kode yang diulang dalam batas1
     LOOP WHILE|UNTIL ekspresi_kondisi_batas1

          atau
     DO
        'baris kode yang diulang dalam batas1
        DO
           'baris kode yang diulang dalam batas2
        LOOP WHILE|UNTIL ekspresi_kondisi_batas2
        'baris kode yang diulang dalam batas1
     LOOP WHILE|UNTIL ekspresi_kondisi_batas1


Contohnya adalah menulis nomor urut dari 3 sampai 8, dengan setiap nomor urut akan mendapat kode 10,15, dan 20 dan ditulis mulai baris 5. Kasus ini memberi informasi bahwa :
  • setiap nomor urut akan mendapat 3 buah kode, maka di setiap nilai nomor urut yang di proses loop akan ada proses loop pemberian kode
  • nomor urut diproses loop dengan interval penambahan 1, dimulai dari nomor urut 3, maksimal adalah 8, dan dengan variabel bernama lNomor
  • nomor kode diproses loop dengan interval penambahan 5, dimulai dari nomor kode 10, maksimal adalah 20, dan dengan variabel bernama lKode
  • baris penulisan selalu bertambah dengan interval 1 dan dimulai dari baris ke-5 Excel

Misalkan nomor urut akan ditulis di kolom J (kolom ke-10 sheet Dataku) dan nomor kode akan ditulis di kolom K (kolom ke-11 sheet Dataku). Blok DO ... LOOP bisa menggunakan :
  • WHILE dengan kondisi batas nomor urut adalah lNomor <= 8 dan kondisi batas nomor kode adalah lKode <= 20
  • UNTIL dengan kondisi batas nomor urut adalah lNomor > 8 dan kondisi batas nomor kode adalah lKode > 20

Kali ini blok DO ... LOOP akan menggunakan UNTIL. Penggunaan WHILE bisa Anda coba sendiri. Prosedur untuk kasus ini bisa berbunyi :
   Public Sub Contoh1_NestedDoLoopUntil()
      Dim lNomor As Long, lKode As Long, lBaris As Long
   
      'hapus hasil yang lama
      Sheets("Dataku").Range("j5").CurrentRegion.ClearContents
   
      'set nilai awal nomor urut dan baris penulisan
      lNomor = 3
      lBaris = 5
   
      'memulai proses loop
      'loop nomor urut di sisi terluar
      Do
   
         'set nilai awal nomor kode
         'dilakukan setiap akan memulai loop nomor kode
         lKode = 10
       
         'loop nomor kode di dalam loop nomor urut
         'karena setiap nomor urut akan mendapat nomor kode
         Do
       
            'menulis data di kolom J (kolom ke-10)
            'dan kolom K (kolom ke-11)
            Sheets("Dataku").Cells(lBaris, 10).Value = lNomor
            Sheets("Dataku").Cells(lBaris, 11).Value = lKode
           
            'set nilai nomor kode berikutnya
            lKode = lKode + 5
           
            'set nomor baris penulisan berikutnya karena setiap
            'menulis kode akan bertambah baris penulisannya

            lBaris = lBaris + 1
           
         Loop Until lKode > 20
       
         'set nomor urut berikutnya
         lNomor = lNomor + 1
       
      Loop Until lNomor > 8
   End Sub


Blok WHILE ... WEND

Proses loop dengan statement WHILE ... WEND juga akan membentuk sebuah blok loop. Blok WHILE ... WEND sama dengan blok DO WHILE ... LOOP.

Bentuk dasarnya adalah :
   WHILE ekspresi_kondisi
      'baris kode yang di-loop
   WEND


Contohnya adalah prosedur bernama Contoh1_DoWhileLoop di atas dapat ditulis dalam blok WHILE ... WEND menjadi :
   Public Sub Contoh1_WhileWend()
      Dim lNomor As Long, lBaris As Long
   
      'hapus yang lama dulu ya
      Sheets("Dataku").Columns(13).ClearContents
   
      'mulai proses contoh
      lNomor = 3
      While lNomor <= 8
         lBaris = lNomor + 2
         Sheets("Dataku").Range("M" & lBaris).Value = lNomor
         lNomor = lNomor + 1
      Wend
   End Sub


Simpulan

Blok-blok loop yang telah dijabarkan bisa disusun nested terhadap blok-blok loop lain. Misalnya level 1 proses loop menggunakan blok DO ... LOOP, level 2 proses loop menggunakan WHILE ... WEND, level 3 proses loop menggunakan blok FOR ... NEXT, dan sebagainya. Contoh-contoh di atas adalah contoh sederhana. Implementasi dari penjabaran di atas dalam kasus nyata membutuhkan kejelian dalam menyusun ekspresi kondisi.

:)

Insya Allah, pembahasan selanjutnya adalah tentang loop dengan blok FOR EACH ... NEXT yang bisa digunakan untuk loop setiap elemen array atau object collections.




Wednesday, August 21, 2013

BelajarVBA 010 - Perulangan 1 : FOR ... NEXT

Coretan Mr. Kid

Bersegeralah mengambil setiap kesempatan berbuat kebaikan. Jika memungkinkan, gunakan seluruh potensi diri untuk bisa membuat kesempatan berbuat kebaikan.

Salah satu kegiatan yang termasuk sering dilakukan dalam pemrograman adalah mengulang-ulang suatu proses. Contohnya adalah membuka seluruh workbook penjualan setiap cabang yang ada dalam sebuah folder secara silih berganti. Kemudian membaca data didalamnya dan menyalinnya ke sebuah workbook penampung seluruh data.
Perulangan dalam VB/VBA berupa :
  • FOR ... NEXT
  • DO WHILE|UNTIL ... LOOP
  • DO ... LOOP WHILE|UNTIL
  • WHILE ... WEND
  • FOR EACH ... NEXT
Bahasan kali ini akan difokuskan pada FOR ... NEXT.



Bentuk dasar FOR ... NEXT

Perulangan dengan FOR ... NEXT digunakan untuk memproses sesuatu dari suatu nilai awal sampai nilai akhir dengan interval lompatan tertentu. Contohnya adalah memberi nomor urut suatu output tertentu yang dimulai dari nomor urut 1 sampai sekian dengan interval lompatan angka nomor urut adalah 1. Interval lompatan juga bisa digunakan untuk menentukan posisi suatu data. Contohnya adalah membaca atau menulis data disetiap kelipatan 5 baris, artinya mulai baris 2 lalu 7,12,dst. Hal ini berarti juga bisa digunakan untuk membaca atau menulis data untuk setiap blok data yang terdiri dari sekian kolom. Misalnya, sebuah data output dengan kolom-kolom yang berupa series data per bulan per cabang. Jika ada 7 cabang, maka cabang pertama selalu 7 kolom setelah posisi terakhir ditemukannya cabang pertama tersebut.
Secara umum, bentuk dasar FOR ... NEXT adalah :
FOR variabel_loop = nilai_awal TO nilai_akhir [STEP nilai_interval]
    'baris-baris kode untuk suatu proses yang harus di-loop
NEXT [variabel_loop]

Bagian :
  • variabel_loop : nama dari variabel yang ber-datatype bilangan bulat seperti Integer atau Long
  • nilai_awal : nilai bilangan bulat yang menjadi titik mulai proses. Bisa menggunakan variabel.
  • nilai_akhir : nilai bilangan bulat yang menjadi titik akhir proses. Bisa menggunakan variabel.
  • [STEP nilai_interval] : informasi tentang lompatan nilai variabel_loop untuk masuk ke proses selanjutnya.
  • nilai_interval : nilai bilangan bulat yang menjadi interval lompatan bagian [STEP]. Default-nya adalah 1. Jika berisi nilai negatif, maka variabel_loop yang baru akan lebih kecil dari variabel_loop yang lama. Bagian ini tidak boleh bernilai 0, karena akan membuat blok FOR ... NEXT diproses terus menerus tanpa henti.
  • NEXT [variabel_loop] : akhir blok FOR tersebut. Bagian [variabel_loop] boleh tidak ditulis. Meskipun demikian, sebaiknya tetap ditulis agar memudahkan pembacaan baris-baris kode dikemudian hari.

Contoh Penggunaan :

Buat sebuah workbook baru. Ganti nama sebuah sheet dengan nama Dataku. Lakukan Save As dengan Save as type dipilih Macro Enabled Workbook (.xlsm) atau Excel 97-2003 Workbook (.xls). Buat sebuah general module dalam VBE. Selamat mencoba contoh-contoh yang ada.

Contoh 1 : FOR ... NEXT nilai yang bertambah
Akan membuat nomor urut dari nomor 1 sampai nomor 6 dengan interval nomor urut adalah 1. Ditulis mulai A2 di sheet bernama 'Dataku'. Bunyi prosedur untuk kebutuhan seperti contoh 1 ini adalah :
   Public Sub ForNext_Contoh1()
       Dim lNomor As Long
   
       For lNomor = 1 To 6 Step 1
           Sheets("Dataku").Range("A" & lNomor + 1).Value = lNomor
       Next lNomor
   End Sub

  • Proses akan diawali dengan mendeklarasikan variabel loop bernama lNomor yang ber-datatype Long (menampung bilangan bulat).
  • Pada baris berbunyi :
        For lNomor = 1 To 6 Step 1
  • Variabel lNomor akan diisi dengan nilai 1 sebagai nilai awal proses loop.
  • Komputer akan menyimpan batas akhir berupa nilai 6.
  • Komputer juga akan menyimpan bahwa interval dari lNomor yang satu ke lNomor berikutnya adalah +1
  • Pada baris berbunyi :
        Sheets("Dataku").Range("A" & lNomor + 1).Value = lNomor
  • nilai dalam variabel lNomor (bagian = lNomor) akan ditulis kesebuah cell dengan alamat di kolom A baris lNomor + 1. Karena lNomor bernilai 1, maka lNomor + 1 akan bernilai 2, yang artinya akan merujuk ke cell dengan alamat A2 di sheet bernama 'Dataku'.
  • Pada baris berbunyi :
        Next lNomor
  • nilai lNomor yang lama, yaitu 1, akan ditambahkan oleh komputer dengan nilai interval yang sudah disimpannya, yaitu +1, sehingga variabel lNomor akan memiliki nilai yang baru, yaitu 1 (nilai yang lama) ditambah +1 (nilai interval) yang menghasilkan nilai 2.
  • Proses berikutnya adalah langsung ke baris berbunyi :
        Sheets("Dataku").Range("A" & lNomor + 1).Value = lNomor
  • dengan membawa lNomor berisi nilai yang baru, yaitu 2, sehingga lokasi penulisan lNomor berikutnya ada di sheet Dataku cell A3.
  • Proses akan terus seperti itu sampai suatu saat nanti, lNomor yang baru (saat memproses Next lNomor) akan menghasilkan nilai yang lebih dari nilai akhir yang disimpan komputer, yaitu 6. Jadi, saat lNomor bernilai 7, maka proses loop selesai dan berpindah ke baris kode berikutnya, alias tidak kembali ke baris penulisan nomor lagi.
  • Jadi, baris-baris kode dalam blok FOR ... NEXT di atas akan diproses sebanyak 6 kali, yaitu dari lNomor bernilai 1 sampai dengan lNomor bernilai 6 karena intervalnya +1.
Sesuai penjelasan per bagian diatas, dimana bagian [STEP nilai_interval_lompatan] memiliki nilai default adalah 1, maka prosedur diatas bisa ditulis tanpa bagian Step 1 sebagai berikut :
   Public Sub ForNext_Contoh1()
       Dim lNomor As Long
   
       For lNomor = 1 To 6
           Sheets("Dataku").Range("A" & lNomor + 1).Value = lNomor
       Next lNomor
   End Sub


Contoh 2 : FOR ... NEXT nilai yang bertambah dengan interval lebih dari 1
Nomor urut akan dimulai dari 1, tetapi bertambah per 3, dan ditulis di kolom C mulai baris 2. Bunyi prosedur untuk kebutuhan seperti contoh 2 ini adalah :
   Public Sub ForNext_Contoh2()
       Dim lNomor As Long, lBaris As Long
   
       lBaris = 2
       For lNomor = 1 To 6 Step 3
           Sheets("Dataku").Range("C" & lBaris).Value = lNomor
           lBaris = lBaris + 1
       Next lNomor
   End Sub

  • Ada penambahan variabel bernama lBaris yang bertugas untuk menyimpan nomor baris Excel lokasi penulisan. Hal ini dibutuhkan karena nilai intervalnya sudah bukan +1 lagi.
  • Nilai lBaris diset pertama kali dengan nilai 2 karena penulisan akan dimulai pada baris 2.
  • Nilai lBaris harus diset dengan nilai yang baru, yaitu bertambah 1, tepat sebelum memasuki baris Next lNomor dengan baris kode :
       lBaris = lBaris + 1
  • Kolom penulisan nomor urut juga disesuaikan menjadi "C", karena lokasi penulisan nomor urut akan dilakukan pada kolom C sheet 'Dataku'
  • Nilai interval (setelah bunyi statement STEP) diisi dengan 3, karena penambahannya diminta per 3.
Proses yang terjadi dalam prosedur tersebut adalah :
  • Mendeklarasikan lNomor bertype Long dan lBaris bertype Long
  • Mengisi nilai lBaris dengan nilai 2
  • Memproses baris FOR yang diawali berupa mengisi lNomor pertama kali dengan nilai 1, kemudian menyimpan nilai akhir (6) dan nilai interval (3)
  • Menulis disheet bernama 'Dataku' pada kolom C di baris yang disimpan oleh variabel lBaris saat itu
  • Menyimpan nilai lBaris yang baru, yaitu nilai lBaris yang lama ditambah dengan nilai 1
  • Menuju nilai lNomor berikutnya, dimana lNomor akan mengalami penambahan +3 akibat nilai intervalnya adalah +3
  • Jadi, baris-baris kode dalam blok FOR ... NEXT di atas akan diproses sebanyak 2 kali, yaitu dari lNomor bernilai 1 sampai dengan lNomor bernilai 6 karena intervalnya +3, yaitu pada lNomor bernilai 1 dan 4.
  • Pada saat lNomor bernilai 1, lBaris bernilai 2. Saat lNomor bernilai 4, lBaris bernilai 2.


Contoh 3 : FOR ... NEXT nilai yang berkurang minimal -1
Nomor urut dimulai dari 6 kemudian menurun per 3. Ditulis pada kolom E pada baris 2,3,dst. Bunyi prosedur untuk kebutuhan seperti contoh 3 ini adalah :
   Public Sub ForNext_Contoh3()
       Dim lNomor As Long, lBaris As Long
   
       lBaris = 2
       For lNomor = 6 To 1 Step -3
           Sheets("Dataku").Range("E" & lBaris).Value = lNomor
           lBaris = lBaris + 1
       Next lNomor
   End Sub

  • Perbedaan dengan Contoh 2 adalah pada baris :
       For lNomor = 6 To 1 Step -3
       Sheets("Dataku").Range("E" & lBaris).Value = lNomor

  • Nilai awal lNomor adalah 6.
  • Nilai akhir yang disimpan komputer adalah 1.
  • Nilai interval yang disimpan komputer adalah -3.
  • Penulisan dilakukan pada kolom E
Proses yang terjadi dalam prosedur bernama ForNext_Contoh3 adalah :
  • Deklarasi variabel lNomor bertype Long untuk nilai loop
  • Deklarasi variabel lBaris bertype Long untuk nilai baris penulisan
  • Menentukan baris pertama penulisan senilai 2 dalam baris :
       lBaris = 2
  • Proses untuk menetapkan nilai pertama loop ke dalam lNomor sebesar 6, menyimpan nilai akhir senilai 1, dan menyimpan nilai interval -3, yaitu pada baris kode berbunyi :
       For lNomor = 6 To 1 Step -3
  • Proses penulisan nilai pertama loop (nilai 6) ke sheet 'Dataku' pada kolom E baris 2 (disimpan oleh lBaris saat ini), pada baris kode :
       Sheets("Dataku").Range("E" & lBaris).Value = lNomor
  • Menentukan nilai baris penulisan yang baru (lBaris yang baru), yaitu lBaris yang lama ditambah 1 yang menghasilkan nilai 3 dari 2 + 1, pada baris kode :
       lBaris = lBaris + 1
  • Berpindah ke nilai loop kedua (lNomor baru), yaitu nilai loop lama ditambah nilai interval yang berupa 6 + (-3) dan akan menghasilkan lNomor baru bernilai 3
  • Karena lNomor yang baru (bernilai 3) masih dalam rentang nilai awal (6) dan nilai akhir (1), maka proses kembali ke baris penulisan nilai loop dengan membawa nilai loop kedua yang bernilai 3
  • Proses penulisan nilai loop kedua (nilai 3) ke sheet 'Dataku' pada kolom E baris 3 (disimpan oleh lBaris saat ini), pada baris kode :
       Sheets("Dataku").Range("E" & lBaris).Value = lNomor
  • Menentukan nilai baris penulisan yang baru (lBaris yang baru), yaitu lBaris yang lama ditambah 1 yang menghasilkan nilai 4 dari 3 + 1, pada baris kode :
       lBaris = lBaris + 1
  • Berpindah ke nilai loop ketiga (lNomor baru), yaitu nilai loop lama (3) ditambah nilai interval (-3) dan akan menghasilkan lNomor baru bernilai 0
  • Karena lNomor yang baru (bernilai 0) sudah diluar rentang nilai awal (6) dan nilai akhir (1), maka proses loop selesai alias keluar dari blok FOR ... NEXT untuk memproses baris kode berikutnya.
  • Baris kode berikutnya setelah blok FOR ... NEXT adalah akhir blok prosedur berupa END SUB, maka seluruh prosedur selesai dikerjakan.


Contoh 4 : FOR ... NEXT posisi penulisan yang bertambah dengan interval lebih dari 1
Nomor urut dari 1 yang bertambah per 1 ditulis pada setiap baris dikolom G mulai dari baris 2 sampai baris 10 per 3 baris. Jadi nomor urut 1,2,dst akan ditulis pada baris 2,5,dst. Bunyi prosedur untuk kebutuhan seperti contoh 3 ini adalah :
   Public Sub ForNext_Contoh4()
       Dim lNomor As Long, lBaris As Long
   
       lNomor = 1
       For lBaris = 2 To 10 Step 3
           Sheets("Dataku").Range("G" & lBaris).Value = lNomor
           lNomor = lNomor + 1
       Next lBaris
   End Sub

  • Prosedur diatas mirip dengan Contoh 2. Perbedaannya adalah variabel yang digunakan dalam baris-baris kode :
        lNomor = 1
        For lBaris = 2 To 10 Step 3

  • dan juga baris kode :
        lNomor = lNomor + 1
        Next lBaris

  • Karena berbasis pada posisi penulisan yang dibatasi, maka nilai yang ditulis (lNomor) yang ditentukan nilai awalnya (baris kode lNomor = 1) dan bertambah 1 melalui proses di baris kode :
        lNomor = lNomor + 1
  • Variabel lBaris yang menjadi pokok proses loop diatur penentuan nilai-nilainya menggunakan baris kode :
        For lBaris = 2 To 10 Step 3

Nested FOR ... NEXT

Blok FOR ... NEXT bisa berada didalam blok FOR ... NEXT lain dan disebut nested loop FOR ... NEXT. Jumlah level nestednya bisa sangat banyak (sangat dalam). Secara umum syntax-nya adalah :
   FOR var_loop1 = nilai_awal1 TO nilai_akhir1 [STEP nilai_interval1]
     'baris-baris kode yang di-loop berdasar var_loop1
   
     FOR var_loop2 = nilai_awal2 TO nilai_akhir2 [STEP nilai_interval2]
        'baris-baris kode yang di-loop berdasar var_loop2

        FOR var_loopN = nilai_awalN TO nilai_akhirN [STEP nilai_intervalN]
            'baris-baris kode yang di-loop berdasar var_loopN
        NEXT [var_loopN]

        'baris-baris kode yang di-loop berdasar var_loop2
     NEXT [var_loop2]

     'baris-baris kode yang di-loop berdasar var_loop1
   NEXT [var_loop1]


Contoh Penggunaan :

Contoh 1 : nested menulis 2 kolom
Menulis nomor urut dari 1 sampai 3 pada kolom K mulai baris 2, dengan setiap nomor urut akan disertai nomor kode berinterval 5 dari nilai 10 sampai 25 pada kolom L. Pada kasus seperti ini, perlu dijabarkan lebih dulu bahwa ada 3 nilai yang berubah disana, yaitu baris penulisan (lBaris), nomor urut di kolom K (lNomor), dan nomor kode di kolom L (lKode). Baris penulisan akan selalu bertambah konstan dengan interval 1 (ditulis di baris 2,3,dst). Nomor urut pada kasus ini juga akan bertambah konstan setiap baris kode kembali ke kode senilai 10. Jadi, nomor urut 1 akan diisi oleh kode 10,15,20,25. Artinya, blok FOR ... NEXT untuk menentukan nilai lKode ada didalam blok FOR ... NEXT untuk menentukan nilai lNomor, karena lNomor berubah lebih lambat dari lKode (tergantung pada perubahan nilai lKode).

Prosedur untuk kebutuhan seperti ini akan berbunyi :
   Public Sub NestedForNext_Contoh1()
      Dim lNomor As Long, lBaris As Long, lKode As Long
   
      lBaris = 2
      For lNomor = 1 To 3
         For lKode = 10 To 25 Step 5
            Sheets("Dataku").Range("K" & lBaris).Value = lNomor
            Sheets("Dataku").Range("L" & lBaris).Value = lKode
            lBaris = lBaris + 1
         Next lKode
      Next lNomor
   End Sub

Proses yang terjadi dalam prosedur di atas adalah :
  • Deklarasi variabel lNomor bertype Long, lBaris bertype Long, lKode bertype Long
  • Menetapkan baris penulisan pertama yaitu 2 pada baris kode :
       lBaris = 2
  • Menentukan nilai loop pertama lNomor pada baris kode :
       For lNomor = 1 To 3
  • Saat lNomor pertama ini, akan dilakukan penentuan nilai loop pertama lKode pada baris kode :
       For lKode = 10 To 25 Step 5
  • Kemudian menuliskan nilai lNomor dan lKode pada lBaris saat itu, yaitu 2
  • Usai dilakukan penulisan lKode, maka baris penulisan akan diubah menjadi nilai baru, yaitu menjadi 3 oleh baris kode :
       lBaris = lBaris + 1
  • Proses dilanjutkan dengan menentukan lKode berikutnya, yaitu lKode lama (10) ditambah interval +5, sehingga lKode baru menjadi 15
  • Karena lKode yang baru (nilai 15) masih diantara nilai awal lKode (10) dan nilai akhir lKode (25), maka proses kembali ke baris penulisan nilai lNomor dan lKode. Nilai lNomor masih tetap bernilai 1 karena belum memproses baris Next lNomor.
  • Penulisan nilai lNomor (1) dan lKode (15) pada lBaris (3)
  • Usai dilakukan penulisan lKode, maka baris penulisan akan diubah menjadi nilai baru, yaitu menjadi 4.
  • Proses dilanjutkan dengan menentukan lKode berikutnya, yaitu lKode lama (15) ditambah interval +5, sehingga lKode baru menjadi 20
  • Karena lKode yang baru (nilai 20) masih diantara nilai awal lKode (10) dan nilai akhir lKode (25), maka proses kembali ke baris penulisan nilai lNomor dan lKode. Nilai lNomor masih tetap bernilai 1 karena belum memproses baris Next lNomor.
  • Penulisan nilai lNomor (1) dan lKode (20) pada lBaris (4)
  • Usai dilakukan penulisan lKode, maka baris penulisan akan diubah menjadi nilai baru, yaitu menjadi 5.
  • Proses dilanjutkan dengan menentukan lKode berikutnya, yaitu lKode lama (20) ditambah interval +5, sehingga lKode baru menjadi 25
  • Karena lKode yang baru (nilai 25) masih diantara nilai awal lKode (10) dan nilai akhir lKode (25), maka proses kembali ke baris penulisan nilai lNomor dan lKode. Nilai lNomor masih tetap bernilai 1 karena belum memproses baris Next lNomor.
  • Penulisan nilai lNomor (1) dan lKode (25) pada lBaris (5)
  • Usai dilakukan penulisan lKode, maka baris penulisan akan diubah menjadi nilai baru, yaitu menjadi 6.
  • roses dilanjutkan dengan menentukan lKode berikutnya, yaitu lKode lama (25) ditambah interval +5, sehingga lKode baru menjadi 30
  • Karena nilai lKode baru (30) sudah diluar rentang nilai lKode (10 sampai 25), maka blok FOR ... NEXT milik lKode selesai dikerjakan dan beralih ke baris kode berikutnya yang berbunyi :
       Next lNomor
  • Pada baris Next lNomor ini terjadi penentuan nilai lNomor baru, yaitu nilai lNomor lama (1) ditambah interval (defaultnya +1), sehingga lNomor yang baru menjadi bernilai 2.
  • Karena lNomor yang baru (2) masih dalam rentang interval lNomor (1 sampai 3), maka proses kembali ke baris setelah FOR lNomor blabla, yang artinya adalah memulai proses loop lKode lagi dan dimulai dari lKode bernilai 10.
  • Proses berikutnya adalah loop lKode sampai lKode yang baru berada diluar rentang 10 sampai 25 dengan nilai lNomor tetaplah lNomor yang baru, yaitu bernilai 2.
  • Ketika lKode sudah diluar rentang 10 sampai 25, maka blok FOR ... NEXT lKode selesai dan masuk lagi ke baris Next lNomor
  • Nilai lNomor yang baru akan berubah dari yang tadinya adalah 2 menjadi 3.
  • Karena lNomor yang baru (3) masih dalam rentang 1 sampai 3, maka proses loop lKode (baris For lKode blabla sampai Next lKode) diproses kembali sampai lKode mencapai nilai diluar rentang 10 sampai 25.
  • Ketika lKode diluar rentang nilainya, baris Next lNomor kembali diproses.
  • Nilai lNomor akan berubah menjadi 4 dari yang tadinya bernilai 3.
  • Karena lNomor yang baru (4) diluar rentang 1 sampai 3, maka blok FOR ... NEXT lNomor selesai dikerjakan dan beralih ke baris kode berikutnya
  • Baris kode berikutnya adalah baris akhir blok prosedur (END SUB), maka prosedur selesai dikerjakan.


Contoh 2 : nested menulis 2 kolom, tapi tidak semua kolom pertamanya ditulis
Seperti contoh 1 nested for ... next diatas, tapi kali ini nomor urut hanya ditulis pada baris pertama kode saja dan ditulis pada kolom N untuk nomor urut dan kolom O untuk kode. Jadi, nomor urut selalu bersama nilai kode 10. Artinya, penulisan nilai nomor urut dilakukan tepat sebelum proses loop kode dimulai. Jadi, prosedur seperti contoh 1 diatas cukup diubah dengan memindahkan baris penulisan nomor tepat pada baris sebelum loop kode dan menyeseuaikan kolom lokasi penulisan. Bentuknya akan menjadi seperti dibawah ini :
   Public Sub NestedForNext_Contoh2()
      Dim lNomor As Long, lBaris As Long, lKode As Long
   
      lBaris = 2
      For lNomor = 1 To 3
         Sheets("Dataku").Range("N" & lBaris).Value = lNomor
       
         For lKode = 10 To 25 Step 5
            Sheets("Dataku").Range("O" & lBaris).Value = lKode
            lBaris = lBaris + 1
         Next lKode
      Next lNomor
   End Sub

Proses yang terjadi akan seperti pada contoh 1. Perbedaannya adalah ketika lNomor berubah menjadi lNomor yang baru atau usai memproses baris Next lNomor dan lNomor masih dalam rentang 1 sampai 3, maka proses akan kembali ke baris kode berbunyi :
   Sheets("Dataku").Range("N" & lBaris).Value = lNomor

Contoh 3 : nested menulis 2 kolom, tapi tidak semua kolom pertamanya ditulis dan kode selalu dimulai di baris baru
Seperti contoh 2 diatas, tetapi akan ditulis di kolom Q:R dan kode selalu dimulai dibaris yang baru. Artinya, kode pertama (nilai 10) akan ditulis di baris yang berbeda dengan nomor urutnya. Jadi, setiap kali selesai menulis nomor urut, dibutuhkan penentuan nomor baris baru juga. Prosedur contoh 2 di atas perlu ditambahkan proses penentuan nilai baris yang baru tepat sebelum proses loop kode dimulai. Bentuk prosedurnya akan menjadi :
   Public Sub NestedForNext_Contoh3()
      Dim lNomor As Long, lBaris As Long, lKode As Long
   
      lBaris = 2
      For lNomor = 1 To 3
         Sheets("Dataku").Range("Q" & lBaris).Value = lNomor
         lBaris = lBaris + 1
       
         For lKode = 10 To 25 Step 5
            Sheets("Dataku").Range("R" & lBaris).Value = lKode
            lBaris = lBaris + 1
         Next lKode
      Next lNomor
   End Sub

Kehadiran baris kode :
   lBaris = lBaris + 1
setelah baris kode :
   Sheets("Dataku").Range("Q" & lBaris).Value = lNomor
yang membuat penulisan kode selalu dimulai di baris yang berbeda dengan baris penulisan nomor urut.

Dari 3 contoh di atas, jika diinginkan ada baris kosong antar blok nomor urut, apakah yang perlu dilakukan ? Silakan mencobanya sendiri.

Contoh 4 : nested menulis dibanyak baris dan kolom
Kali ini, nomor urut akan ditulis per baris mulai dari baris 2 dan diletakkan pada kolom T (kolom ke-20 dalam sheet Dataku). Kode akan dituliskan kekanan pada baris nomor tersebut mulai kolom S (kolom ke-21 dalam sheet Dataku) dan seterusnya sampai kode bernilai 25.

Pada kasus seperti ini, perlu penjabaran tambahan, yaitu selain lNomor, lKode, lBaris, dibutuhkan lKolom yang menjadi penentu lokasi kolom penulisan. Kolom penulisan yang berurutan adalah dimulai dari kolom ke-21 dan bertambah dengan interval 1 sampai seluruh kode tertulis. Prosedurnya akan berbunyi :
   Public Sub NestedForNext_Contoh4()
      Dim lNomor As Long, lBaris As Long, lKode As Long, lKolom As Long
   
      lBaris = 2
      For lNomor = 1 To 3
         Sheets("Dataku").Cells(lBaris, 20).Value = lNomor
       
         lKolom = 21
         For lKode = 10 To 25 Step 5
            Sheets("Dataku").Cells(lBaris, lKolom).Value = lKode
            lKolom = lKolom + 1
         Next lKode
       
         lBaris = lBaris + 1
      Next lNomor
   End Sub

Proses yang terjadi pada prosedur tersebut adalah :
  • Deklarasi variabel lNomor, lKode, lBaris, lKolom yang masing-masingnya bertype Long.
       Dim lNomor As Long, lBaris As Long, lKode As Long, lKolom As Long
  • Menetapkan nilai baris awal lokasi penulisan dengan nilai 2
       lBaris = 2
  • Memulai loop nomor urut dengan lNomor pertama adalah 1, pada rentang 1 sampai 3
       For lNomor = 1 To 3
  • Menulis nilai nomor urut pada sheet bernama 'Dataku' pada baris lBaris yang saat ini bernilai 2 di kolom ke-20 dalam sheet 'Dataku' (kolom T)
       Sheets("Dataku").Cells(lBaris, 20).Value = lNomor
  • Menetapkan nilai kolom awal lokasi penulisan kode dengan nilai 21 (dimulai dari kolom ke-21 di sheet 'Dataku', yang berarti kolom S)
       lKolom = 21
  • Memulai loop kode dengan lKode pertama adalah 10, pada rentang 10 sampai 25 dengan interval +5
       For lKode = 10 To 25 Step 5
  • Menulis nilai kode disetiap kolom secara berurutan pada baris nomor urut yang sedang diproses (saat ini lBaris adalah 2)
       Sheets("Dataku").Cells(lBaris, lKolom).Value = lKode
  • Menentukan nilai kolom baru, sehingga lKolom yang baru bernilai 22, yaitu lKolom yang lama (20) ditambah dengan nilai 1
       lKolom = lKolom + 1
  • Menentukan lKode yang baru, sehingga lKode yang baru bernilai 15, yaitu lKode yang lama (10) ditambah interval (+5)
       Next lKode
  • Ketika lKode yang baru masih dalam rentang 10 sampai 25, maka kembali ke baris penulisan lKode dengan nilai lKode yang baru, lKolom yang baru, dan lBaris yang masih tetap seperti semula. Proses ini adalah kembali ke baris kode :
       Sheets("Dataku").Cells(lBaris, lKolom).Value = lKode
  • Ketika lKode yang baru sudah tidak direntang 10 sampai 25, maka loop kode untuk nomor urut tersebut telah selesai dan proses harus menulis untuk nomor urut yang baru pada baris yang baru. Maka proses dilanjutkan dengan menentukan nilai baris penulisan yang baru
       lBaris = lBaris + 1
  • Nilai lBaris yang baru sudah berubah dan proses selanjutnya adalah menentukan nilai lNomor yang baru
       Next lNomor
  • Ketika lNomor yang baru masih dalam rentang 1 sampai 3, maka proses kembali ke penulisan nomor urut dengan nilai lBaris yang baru dan lNomor yang baru, yaitu ke baris kode :
       Sheets("Dataku").Cells(lBaris, 20).Value = lNomor
  • Proses penentuan lKolom awal akan dilakukan setelahnya, diikuti proses loop kode pada lNomor yang baru.
  • Hal ini akan dilakukan sampai lNomor yang baru sudah diluar rentang 1 sampai 3.
  • Saat lNomor yang baru sudah diluar rentang 1 sampai 3, maka blok FOR ... NEXT lNomor selesai dikerjakan dan beralih ke baris kode berikutnya
  • Baris kode berikutnya adalah akhir blok prosedur (END SUB) yang berarti prosedur telah selesai dikerjakan.


Simpulan

  • Dari berbagai contoh di atas, dapat dikatakan bahwa penyusunan FOR ... NEXT membutuhkan pemahaman tentang bagian yang harus di-loop. Misalnya, memilih lBaris yang diletakkan pada bagian FOR daripada lNomor.
  • Diperlukan juga pemahaman tata urutan pengubahan nilai agar bisa menyusun level nested dari loop yang dibangun. Misalnya adalah meletakkan loop kode didalam loop nomor urut karena nomor urut akan berubah ketika kode tertentu tercapai, yang dalam hal ini adalah ketika kode bernilai 10.
  • Kejelian dalam meletakkan baris-baris kode tambahan agar dapat memperoleh hasil loop yang sesuai kebutuhan dapat dilatih dengan berani mencoba memindahkan baris-baris kode yang di-loop. Tentu saja hal ini harus disertai dengan kejelian untuk melihat perubahan yang terjadi pada output akibat pemindahan, penambahan, pengurangan, atau pengubahan baris-baris kode yang dilakukan.

:)

Jika akan menjalankan ulang prosedur-prosedur contoh di atas, sebaiknya dilakukan pembersihan isi worksheet dengan memblok semua cell dalam sheet 'Dataku' dan menekan tombol Delete pada keyboard.

Blok FOR ... NEXT di atas adalah media sederhana untuk memahami logika perulangan (loop) dalam pemrograman. Pemahaman akan blok FOR ... NEXT akan memudahkan proses mempelajari statement perulangan yang lainnya.

Insya Allah, pembahasan selanjutnya adalah tentang Do ... Loop, baik yang berupa Do While|Until ... Loop ataupun Do ... Loop While|Until. Perulangan While ... Wend juga akan disinggung sedikit sebagai tambahan wacana saja, karena perulangan jenis ini sudah mulai ditinggalkan.





Saturday, August 17, 2013

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.