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.





No comments:

Post a Comment