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.




No comments:

Post a Comment