Pembasahan For Next

Pada pembahasan FOR NEXT yang pertama telah saya jelaskan secara komplit bentuk dasar blok FOR NEXT, untuk kesempatan kedua ini saya akan lanjutkan pembahasan FOR NEXT lebih dalam dengan 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 pertama : 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 (klm), nomor urut di kolom K (1_Urut), dan nomor kode di kolom L (awl). 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 awl ada didalam blok FOR ... NEXT untuk menentukan nilai 1_Urut, karena 1_Urut berubah lebih lambat dari awl (tergantung pada perubahan nilai awl).

Prosedur untuk kebutuhan seperti ini akan berbunyi :
Public Sub NestedForNext_Contoh1()
Dim 1_Urut As Long, klm As Long, awl As Long

klm = 2
For 1_Urut = 1 To 3
For awl = 10 To 25 Step 5
Sheets("Databaseq").Range("K" & klm).Value = 1_Urut
Sheets("Databaseq").Range("L" & klm).Value = awl
klm = klm + 1
Next awl
Next 1_Urut
End Sub
Proses yang terjadi dalam prosedur di atas adalah :
Deklarasi variabel 1_Urut bertype Long, klm bertype Long, awl bertype Long
Menetapkan baris penulisan pertama yaitu 2 pada baris kode :
klm = 2
Menentukan nilai loop pertama 1_Urut pada baris kode :
For 1_Urut = 1 To 3
Saat 1_Urut pertama ini, akan dilakukan penentuan nilai loop pertama awl pada baris kode :
For awl = 10 To 25 Step 5
Kemudian menuliskan nilai 1_Urut dan awl pada klm saat itu, yaitu 2
Usai dilakukan penulisan awl, maka baris penulisan akan diubah menjadi nilai baru, yaitu menjadi 3 oleh baris kode :
klm = klm + 1
Proses dilanjutkan dengan menentukan awl berikutnya, yaitu awl lama (10) ditambah interval +5, sehingga awl baru menjadi 15
Karena awl yang baru (nilai 15) masih diantara nilai awal awl (10) dan nilai akhir awl (25), maka proses kembali ke baris penulisan nilai 1_Urut dan awl. Nilai 1_Urut masih tetap bernilai 1 karena belum memproses baris Next 1_Urut.
Penulisan nilai 1_Urut (1) dan awl (15) pada klm (3)
Usai dilakukan penulisan awl, maka baris penulisan akan diubah menjadi nilai baru, yaitu menjadi 4.
Proses dilanjutkan dengan menentukan awl berikutnya, yaitu awl lama (15) ditambah interval +5, sehingga awl baru menjadi 20
Karena awl yang baru (nilai 20) masih diantara nilai awal awl (10) dan nilai akhir awl (25), maka proses kembali ke baris penulisan nilai 1_Urut dan awl. Nilai 1_Urut masih tetap bernilai 1 karena belum memproses baris Next 1_Urut.
Penulisan nilai 1_Urut (1) dan awl (20) pada klm (4)
Usai dilakukan penulisan awl, maka baris penulisan akan diubah menjadi nilai baru, yaitu menjadi 5.
Proses dilanjutkan dengan menentukan awl berikutnya, yaitu awl lama (20) ditambah interval +5, sehingga awl baru menjadi 25
Karena awl yang baru (nilai 25) masih diantara nilai awal awl (10) dan nilai akhir awl (25), maka proses kembali ke baris penulisan nilai 1_Urut dan awl. Nilai 1_Urut masih tetap bernilai 1 karena belum memproses baris Next 1_Urut.
Penulisan nilai 1_Urut (1) dan awl (25) pada klm (5)
Usai dilakukan penulisan awl, maka baris penulisan akan diubah menjadi nilai baru, yaitu menjadi 6.
roses dilanjutkan dengan menentukan awl berikutnya, yaitu awl lama (25) ditambah interval +5, sehingga awl baru menjadi 30
Karena nilai awl baru (30) sudah diluar rentang nilai awl (10 sampai 25), maka blok FOR ... NEXT milik awl selesai dikerjakan dan beralih ke baris kode berikutnya yang berbunyi :
Next 1_Urut
Pada baris Next 1_Urut ini terjadi penentuan nilai 1_Urut baru, yaitu nilai 1_Urut lama (1) ditambah interval (defaultnya +1), sehingga 1_Urut yang baru menjadi bernilai 2.
Karena 1_Urut yang baru (2) masih dalam rentang interval 1_Urut (1 sampai 3), maka proses kembali ke baris setelah FOR 1_Urut blabla, yang artinya adalah memulai proses loop awl lagi dan dimulai dari awl bernilai 10.
Proses berikutnya adalah loop awl sampai awl yang baru berada diluar rentang 10 sampai 25 dengan nilai 1_Urut tetaplah 1_Urut yang baru, yaitu bernilai 2.
Ketika awl sudah diluar rentang 10 sampai 25, maka blok FOR ... NEXT awl selesai dan masuk lagi ke baris Next 1_Urut
Nilai 1_Urut yang baru akan berubah dari yang tadinya adalah 2 menjadi 3.
Karena 1_Urut yang baru (3) masih dalam rentang 1 sampai 3, maka proses loop awl (baris For awl blabla sampai Next awl) diproses kembali sampai awl mencapai nilai diluar rentang 10 sampai 25.
Ketika awl diluar rentang nilainya, baris Next 1_Urut kembali diproses.
Nilai 1_Urut akan berubah menjadi 4 dari yang tadinya bernilai 3.
Karena 1_Urut yang baru (4) diluar rentang 1 sampai 3, maka blok FOR ... NEXT 1_Urut 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 pertama 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 pertama 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 1_Urut As Long, klm As Long, awl As Long

klm = 2
For 1_Urut = 1 To 3
Sheets("Databaseq").Range("N" & klm).Value = 1_Urut

For awl = 10 To 25 Step 5
Sheets("Databaseq").Range("O" & klm).Value = awl
klm = klm + 1
Next awl
Next 1_Urut
End Sub
Proses yang terjadi akan seperti pada Contoh pertama. Perbedaannya adalah ketika 1_Urut berubah menjadi 1_Urut yang baru atau usai memproses baris Next 1_Urut dan 1_Urut masih dalam rentang 1 sampai 3, maka proses akan kembali ke baris kode berbunyi :
Sheets("Databaseq").Range("N" & klm).Value = 1_Urut

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 1_Urut As Long, klm As Long, awl As Long

klm = 2
For 1_Urut = 1 To 3
Sheets("Databaseq").Range("Q" & klm).Value = 1_Urut
klm = klm + 1

For awl = 10 To 25 Step 5
Sheets("Databaseq").Range("R" & klm).Value = awl
klm = klm + 1
Next awl
Next 1_Urut
End Sub
Kehadiran baris kode :
klm = klm + 1
setelah baris kode :
Sheets("Databaseq").Range("Q" & klm).Value = 1_Urut
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 1_Urut, awl, klm, dibutuhkan i_2 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 1_Urut As Long, klm As Long, awl As Long, i_2 As Long

klm = 2
For 1_Urut = 1 To 3
Sheets("Databaseq").Cells(klm, 20).Value = 1_Urut

i_2 = 21
For awl = 10 To 25 Step 5
Sheets("Databaseq").Cells(klm, i_2).Value = awl
i_2 = i_2 + 1
Next awl

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

Rangkuman pembahasan For Next

Dari berbagai contoh di atas, dapat dikatakan bahwa penyusunan FOR ... NEXT membutuhkan pemahaman tentang bagian yang harus di-loop. Misalnya, memilih klm yang diletakkan pada bagian FOR daripada 1_Urut.
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 'Databaseq' 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.

Demikianlah pembahasan komplit tentang NEXT FOR atau FOR NEXT bagi anda yang ketinggalan pembahasan pertama silahkan kunjungi link ini, semoga bermanfaat
No comments