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.





40 komentar:

  1. Mantap
    Trims Ilmunya Mas, Semoga Kita Semua Mendapat Berkahnya N Semoga Ilmu Mas Ditambahkan n berbagi lagi ma kita-kita......
    Semoga Allah Membalas kebaikan hati mas!!!!!

    BalasHapus
    Balasan
    1. Amin.
      Semoga Anda dan seluruh pembelajar mendapatkan ilmu yang bermanfaat dan membawa berkah. Amin.
      Terimakasih.

      Hapus
  2. Balasan
    1. Sama-sama. Moga-moga terus dimanfaatkan dan dikembangkan. Jangan lupa untuk disebar luaskan ilmunya ya. Biar terasa multip liyer epek mangpaatnya.

      Hapus
  3. agar cepat mengerti materi sebaiknya dilanjutkan dengan praktek

    BalasHapus
    Balasan
    1. hehehe rencananya sih dibuat untuk learning by doing. itu sebabnya ada setahap ber-script yang siap dicoba dan ditelaah berulang-ulang. Lalu nanti tahap selanjutnya lagi dan seterusnya.

      Supaya ndak bosen om.
      Soalnya baca coretan kan gak kaya baca bab buku atau artikel umumnya. Jadi ini murni coretan. ndak pake diedit - disunting dan sebagainya. Pokoke apa adanya yang ada dikepala, itu yang ditulis.

      Hapus
  4. membantu sekali, makasih dah share..

    BalasHapus
    Balasan
    1. Sama-sama. Makasih dah nyempetin berpuyeng ria baca coretan kecil si Kid ini. Moga-moga bermangpaat ya. Sebarluasken pemahaman yang didapat ya. Kalo bingung, posting ke milis belajar-excel di belajar-excel@yahoogroups.com

      Hapus
  5. rinci dan mudah dimengerti gan
    mantab

    BalasHapus
    Balasan
    1. Alhamdulillah. Berarti ada satu pembagi ilmu lagi yang bisa menyebarluaskannya menjadi manfaat.

      Hapus
  6. Balasan
    1. Insha Allah bisa untuk Excel 2002 sampai Excel terbaru. Syaratnya, saat install office telah dipastikan tercentangnya opsi yang berbunyi VBA-VBA gitu deh, jadi bisa ke bagian Macro beserta VBE-nya.

      Pada Excel 2003 kebawah workbook akan ter-save dengan ekstensi .xls

      Hapus
  7. Balasan
    1. hehehe...
      ndak usah kuatir om...
      saya aja juga masih bingung kok ada coretan yang malah bikin bingung...

      Kalau bersedia, coba ungkapkap uneg-uneg yang masih membuat bingung tersebut. Tentu sembari membaca ulang setahap saja sampai script pertama yang ada lalu mencobanya dan di-run sampai kelihatan hasil script-nya. Baru beranjak ke tahap berikutnya (sampai script berikutnya).

      Andai masih bingung juga, sudilah kiranya berbagi kebingungan dengan rekan-rekan BeExceller yang baik hati di milis belajar-excel di belajar-excel@yahoogroups.com

      Jangan pernah merasa sendiri dalam kebingungan, karena sebenarnya ada banyak pembelajar VBA yang kebingungan. Coba silaturahmi dengan BeExceller, Insha Allah sedikit demi sedikit kebingungan Anda akan memudar dan secercah cahaya ilmu bisa mulai Anda raih.

      keep cemunguuud guys...

      Hapus
  8. Insha Allah bisa untuk Excel 2002 sampai Excel terbaru. Syaratnya, saat install office telah dipastikan tercentangnya opsi yang berbunyi VBA-VBA gitu deh, jadi bisa ke bagian Macro beserta VBE-nya.

    Pada Excel 2003 kebawah workbook akan ter-save dengan ekstensi .xls

    BalasHapus
  9. kasih gambar gan biar lebih jelas lagi

    BalasHapus
    Balasan
    1. hehehe... itu dia, dari sejak mulai ketik nih artikel sampe sekarang kalau pas dilihat-lihat ulang, masih bingung mau dikasih gambar apa ya.

      Gimana kalo sampeyan memberi saran tentang gambar-gambar yang sebaiknya disertakan.

      Kalau gambar cara menulis script-nya, bisa dilihat di artikel sebelum-sebelumnya, seperti di :
      http://b-excel.blogspot.com/2013/06/belajarvba-000-kenalan.html
      dan
      http://b-excel.blogspot.com/2013/06/belajarvba-001-vbe-visual-basic-editor.html

      Pokoke disana pulkolor dah. cakep.
      Oke. ditunggu masukan tentang gambar-gambar yang sebaiknya disertakan (selain lokasi menulisnya di lembar script ya).

      Hapus
  10. ini bisa digunakan untuk aplikasi nilai rapor anak tidak?

    BalasHapus
    Balasan
    1. hmmm...

      pada dasarnya, penggunaan loop digunakan untuk memproses kegiatan yang berulang. Jadi, ketika dalam aplikasi rapor anak tersebut ada kegiatan yang berulang, maka loop seperti dengan For Next ini bisa digunakan.

      Misal, ada 21 pelajaran akan dibaca satu persatu dari sheet A dan ditulis ke sheet B secara berurutan juga. Maka For Next bisa dimanfaatkan untuk kegiatan membaca setiap nilai di sheet A dan menulisnya di sheet B.

      Tapi, sebaiknya pemahaman tentang VBA terus diperdalam, sehingga untuk contoh seperti di atas juga bisa ditemukan berbagai cara lain selain dengan loop.

      Hapus
  11. Wah-wah-wah... yang komen dari berbagai industri.
    Semoga niat belajar dan mencari backlink tercapai sekaligus!
    Bravo Excel!

    BalasHapus
  12. mau tanya gan.. for.. next ini bisa buat apa aja? maap belum ngerti

    BalasHapus
    Balasan
    1. hmm...

      Pada dasarnya bisa untuk semua kegiatan yang dilakukan berulang-ulang.

      Contohnya :
      1. mencetak slip gaji per karyawan yang totalnya ada ratusan atau lebih karyawan
      2. menjalankan satu per satu model simulasi dari banyak model yang ingin disimulasikan dan mencetak hasilnya
      3. menggabungkan data dari berbagai workbook atau sumber data lain ke sebuah workbook.

      Masih banyak hal lain lagi yang mungkin untuk dibantu oleh blok loop seperti For Next. Dengan memahami konsep dasar loop, maka ketika bertemu kejadian bahwa proses otomasi atau alur proses aplikasi membutuhkan kegiatan berulang-ulang pada suatu penggalan proses yang tetap, maka loop seperti For Next bisa menjadi salah satu opsi dari berbagai opsi yang ada.

      Biasanya, selalu usahakanlah memiliki beberapa opsi untuk sebuah penggalan proses dalam setiap menyusun suatu otomasi atau alur aplikasi.

      Hapus
  13. Sampai saat komen ini ditulis, sudah ada 134 yang klik lihat artikel ini, tetapi belum ada yang berminat untuk mencoba meng-unduh salinan script yang ada dalam artikel. hehehe...

    Biarkan link unduhnya tetap jadi permainan hide n seek saja ya...
    Bosen kalo gak sambil bermain. hehehe...

    BalasHapus
    Balasan
    1. Komentar ini telah dihapus oleh pengarang.

      Hapus
    2. Setelah membaca komen ini saya jadi penasaran unduh filenya,
      dan saya unduh file ini setelah dilihat 1059 kali.

      Terima kasih Mr. Kid
      Hanya mau tanya, kenapa hampir semua contoh menggunakan As Long, kok tidak As Integer, atau as Single?

      Hapus
    3. :)

      Alasannya :
      1. loop dengan for next menggunakan bilangan bulat, maka datatype Single atau Double lebih tidak nyaman digunakan.
      2. menyesuaikan kebutuhan, karena loop dilakukan untuk suatu nilai yang cukup banyak atau melebihi batas Integer (loop baris Excel yang berpotensi bisa mencapai lebih dari 55K).
      3. katanya, aplikasi 32 Bit seperti MS Office yang saya gunakan, lebih native dengan datatype Long daripada Integer, sehingga bisa lebih mudah diproses oleh si komputer.
      4. kebiasaan saya saja yang suka tiru-tiru Winapi32 Function yang kebanyakan pakai datatype Long.

      Hapus
  14. Balasan
    1. Sama-sama. Moga-moga bermangpaat n disebarkan ya.

      Hapus
  15. Pembelajaran yang sangat bermanfaat buat saya yang msh awam. Saya mau tanya kode vba untuk memasukan gambar berformat png kedalam commandbutton atau image control misalnya dari folder D: ? Terimakasih banyak atas ilmunya Pak Kid.

    BalasHapus
    Balasan
    1. ops... berformat png ya...
      VB/VBA ndak native tuh dengan format png.

      Biasanya, format png nya di convert ke format jpg atau bmp dulu.
      Jika gambar dipasang saat design, berarti konversi filenya bisa dilakukan dengan aplikasi yang bisa mengolah gambar seperti xnview dan semacamnya.
      Setelah itu baru di-load ke control terkait melalui properties window pada properties bernama Picture.

      Jika ingin dilakukan on the fly dalam Excel, berarti memanfaatkan script VBA.
      Contohnya seperti file di link berikut ini :
      https://app.box.com/s/xt9m126qfn7c6znmjrv5

      :)

      Hapus
  16. mudah2an ilmunya barokah
    gan ga bikin buku ta?
    cz berapa kali beli buku vba excel tapi isinya tidak seperti yg di harapkan

    BalasHapus
    Balasan
    1. Amin.

      Moga-moga Anda dan para pembelajar lainnya mendapat berkah ilmu yang bermanfaat, serta diberi kekuatan dan kemampuan untuk berbagi.

      hehehe... ternyata menulis buku harus jadi fokus utama kalo pengen cepet selesai ya... :(
      moga-moga bentar lagi bisa kelar.

      Hapus
    2. Mr. Kids
      boleh minta kontak yg bisa di hubungi ?

      Hapus
    3. Silakan email ke mr.nmkid@gmail.com

      Hapus
  17. Terima kasih sangat membantu sekali

    BalasHapus
  18. gan, mau tanya nih....
    buat perintah di VB seperti ini

    Public Sub Format()
    If Range("F146").Value <> Range("H146").Value Then
    Range("E146:F146").Cut Range("E147"): Range("F147").Copy Range("H147")
    ElseIf Range("H147").Value <> Range("F147").Value Then
    Range("H147").Copy Range("F147")
    End If
    End Sub

    perintah itu kan berlaku hanya untuk sel yg ada tercantum di perintah tersebut....Nah, gimana caranya agar sel tersebut dapat berpindah secara otomatis? misalnya yg sel H147 biar pindah otomatis mejadi H148 sampai H2000? begitupun dengan sel yg lainnya E146, F146.... mohon bantuannya gan....
    terima kasih

    BalasHapus
  19. bang mau tanya nich...
    kalau penjumlahan seperti :
    - jumlah s/d hari lalu
    - jumlah hari ini
    - jumlah s/d hari ini
    kira2 perintahnya seperti apa y bang...terima kasih atas perhatiannya bang

    BalasHapus
    Balasan
    1. Coba kasusnya dijelaskan lebih detil di milis Belajar-Excel (Yahoogroups) di :
      https://groups.yahoo.com/neo/groups/belajar-excel/info

      Hapus