Tuesday, September 17, 2013

Kasus 001 BelajarVBA - UpTo 011 Range 03

Keisengan Mr. Kid

Materi ini adalah contoh kasus sederhana untuk BelajarVBA sampai dengan BelajarVBA 011 - Range 03 (UsedRange,Intersect,Union). File contoh yang bisa di-unduh adalah Imp001.xlsm.
Kasus :
  • Sheet 'Sumber' di range A2:B5. Data item (kolom A) dan jumlah record yang harus ditulis (kolom B).
  • Sheet 'Output', A1:C1 adalah header tabel output. Terdiri dari Item, Waktu, dan Nomor
  • Record pertama output mulai dari A2:C2.
  • Jika nama item (range A2:A5) di-doubleclick, maka nama item akan ditulis pada sheet Output sebagai record baru (ditulis mulai baris kosong pertama di Output) sebanyak nilai kolom B di sheet Sumber.
  • Tanggal dan jam saat di-doubleclick juga ditulis di sheet Output, yaitu ke kolom B.
  • Nomor urut dari 1 sampai nilai yang di sheet Sumber pada kolom B di item yang di-doubleclick
  • Diakhiri dengan menampilkan pesan tentang nama item, waktu, dan jumlah record yang ditulis.


Langkah menyusun otomasi :
1. Menyiapkan data dan menyimpan file dengan tipe Macro Enabled Workbook (.xlsm)

  • Buat workbook baru
  • Siapkan data di sheet bernama Sumber.
  • Siapkan header data di sheet bernama Output.
  • Susun data seperti gambar.
  • Simpan file sebagai .xlsm atau .xls (lihat : BelajarVBA 001 - VBE (Visual Basic Editor) bagian akhir)
  • Ke area penulisan kode alias ke VBE dengan ALT F11
2. Mendefinisikan pemicu proses
  • Proses bekerja jika cell tertentu di sheet Sumber di-doubleclick. Artinya, Worksheet bernama Sumber harus bisa merespon kegiatan user. Hal ini berarti harus menggunakan event worksheet. Berarti ke VBE dan aktifkan code window milik sheet bernama Sumber. (lihat : BelajarVBA 007 - Property, Methods, Events bagian Events dalam object Worksheet)
  • Kegiatan yang harus dilakukan user adalah melakukan doubleclick pada sebuah cell. Artinya, sesaat sebelum proses doubleclick bekerja (yang biasanya akan membuat cell bisa diedit isinya) harus segera menjalankan proses penyelesaian kasus yang dihadapi ini. Jadi dibutuhkan event worksheet bernama BeforeDoubleClick
  • Cara membuatnya prosedur sub event worksheet bisa dilihat di BelajarVBA 007 - Property, Methods, Events bagian Events dalam object Worksheet
  • Bentuk blok prosedur sub event worksheet untuk BeforeDoubleClick adalah :
      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

      End Sub

  • Baris kosong sebelum END SUB adalah lokasi penulisan baris kode proses.
  • Variabel Target adalah range yang di-doubleclick oleh user.
  • Variabel Cancel adalah penerima data pembatalan proses doubleclick oleh user alias dipaksa tidak jadi di-doubleclick
3. Memastikan bahwa yang di-doubleclick oleh user adalah bagian dari range yang ditentukan, yaitu range A2:A5
  • Area range yang memicu proses hanyalah A2:A5 di sheet Sumber.
  • User bisa saja melakukan doubleclick dirange selain range yang ditentukan tersebut.
  • Maka harus tahu lebih dulu, apakah range yang di-doubleclick berpotongan dengan range A2:A5 yang ditentukan. Artinya, dibutuhkan proses perpotongan antara range yang di-doubleclick oleh user (variabel Target) dengan area range tertentu (range A2:A5).
  • Proses perpotongan akan menggunaan Intersect.
  • Hasil perpotongan adalah suatu area range dan harus disimpan disuatu variabel object range. Hal ini mengindikasikan bahwa dibutuhkan deklarasi variabel object range penyimpan hasil perpotongan.
  • Kemudian variabel tersebut digunakan untuk menyimpan hasil proses perpotongan.
  • Jadi, urutannya adalah menyediakan variabel object range penyimpan hasil perpotongan lalu digunakan untuk menyimpan hasil proses perpotongan. (lihat : BelajarVBA 011 - Range 03 (UsedRange,Intersect,Union) bagian Perpotongan Range)
  • Pada baris kosong blok prosedur bisa diisi :
     Dim rngHasil As Range      
     Set rngHasil = Intersect( Target , Range("A2:A5") )      
  • Hasil perpotongan adalah berupa object (benda) Range. Untuk memeriksa benda adalah dengan pertanyaan 'Apakah ada rangenya ?'. Kata 'rangenya tidak ada' dalam VBA berbunyi Range is Nothing (karena datatype-nya object). Sedangkan 'ada rangenya' bisa dikatakan dengan 'TIDAK dari rangenya tidak ada' yang dalam VBA berbunyi Not Range is Nothing. Karena range hasil perpotongan disimpan dalam variabel bernama rngHasil, maka untuk mengatakan rngHasil ada bendanya dalam VBA bisa dikatakan dengan NOT rngHasil is Nothing.
  • Jadi, kondisi untuk memeriksa hasil perpotongan adalah berbunyi NOT rngHasil is Nothing. Pemeriksaan dengan IF. (lihat : BelajarVBA 008 - Blok IF). Bunyi blok pemeriksaan dengan IF adalah :
     IF NOT rngHasil is Nothing THEN
       'baris kode ketika rngHasil ada bendanya
     ELSE
       'baris kode ketika rngHasil tidak ada bendanya
     END IF

  • Sampai terbentuknya blok IF ini, bentuk blok prosedur sudah menjadi :
     Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
       Dim rngHasil As Range
       'tempat deklarasi variabel lainnya jika diperlukan

       'mulai baris kode proses
       Set rngHasil = Intersect( Target , Range("A2:A5") )  
       IF NOT rngHasil is Nothing THEN
         'baris kode ketika rngHasil ada bendanya
       ELSE
         'baris kode ketika rngHasil tidak ada bendanya
       END IF
     End Sub


4. Mendefinisikan isi proses disetiap keadaan dalam blok kondisi IF
Jika IF menghasilkan TRUE, artinya rngHasil ada bendanya, maka proses pengerjaan sampai penulisan ke sheet output akan dilakukan. Jika IF menghasilkan FALSE, artinya rngHasil tidak ada bendanya, maka tidak melakukan apapun. Jadi, fokus penyusunan baris kode adalah diarea blok IF yang bernilai TRUE, yaitu mengisi baris kode dibagian yang bertuliskan :
   'baris kode ketika rngHasil ada bendanya

5. Mendefinisikan nilai-nilai yang bisa didapatkan dan akan digunakan
Prosesnya adalah menulis nama item yang di-doubleclick, berarti dibutuhkan teks nama item tersebut. Nama item akan disimpan pada sebuah variabel ber-datatype String karena berupa data teks. Tentukan saja nama variabel nama item adalah sItem dengan type String. Selain itu, harus diketahui nilai Record untuk item yang di-doubleclick. Nilai record tersimpan di kolom B sheet Sumber pada baris item yang di-doubleclick. Jadi, harus tahu lebih dulu indeks baris Excel si item yang di-doubleclick.

Nilai indeks baris Excel adalah suatu bilangan yang ber-type numerik bilangan bulat. Maka variabel penyimpan indeks baris Excel bisa dipilih ber-type Long agar bisa menampung baris Excel yang sampai 1 juta. Nama variabel indeks baris Excel diberi nama saja dengan lBarisItem. Untuk bisa merujuk ke kolom B pada indeks baris Excel yang disimpan oleh lBarisItem, dibutuhkan teks alamat range si nilai record. Berarti dibutuhkan variabel ber-type String. Namakan saja variabel tersebut dengan sAlamatRecordItem.

Setelah tahu alamat range yang menyimpan nilai Record, maka nilai Record bisa diambil dan disimpan dalam sebuah variabel. Nilai record selalu bilangan bulat dan diasumsikan tidak lebih dari 32,000 maka dipilih datatype Integer. Nilai Record akan menjadi nilai maksimal nomor urut yang akan ditulis dari nomor 1 untuk setiap doubleclick oleh user, maka nama variabelnya adalah iRecordMax. Karena nomor akan ditulis dari nomor 1 sampai nomor maksimumnya (yang disimpan dalam iRecordMax), maka dibutuhkan variabel nomor yang ber-datatype sama dengan iRecordMax. Nama variabel nomor dipilih iRecordAwal yang ber-datatype Integer. Salah satu data yang akan ditulis nantinya adalah waktu user melakukan doubleclick yang berisi data tanggal dan jam. Berarti data ini akan ber-datatype datetime. Variabel penyimpan nilai tersebut dipilih datatype VB/VBA bernama Date. Nama variabelnya adalah dtWaktu (lihat BelajarVBA 004 - Tipe data, Variabel, Konstanta).

Sampai disini, sudah diketahui bahwa dibutuhkan beberapa variabel. Variabel-variabel itu harus dideklarasikan lebih dulu. Deklarasi prosedur umumnya ditulis diawal blok prosedur untuk scope level procedure (lihat : BelajarVBA 003 - Scope seri 1). Bunyi baris deklarasi variabel tambahannya adalah :
   Dim sItem As String, lBarisItem As Long
   Dim sAlamatRecordItem As String
   Dim iRecordMax As Integer, iRecordAwal As Integer, dtWaktu As Date


Kemudian, variabel-variabel baru tersebut diisi nilainya. Variabel sItem diisi dengan teks item yang disimpan oleh rngHasil sebagai perpotongan range yang di-doubleclick user dengan area A2:A5. Bunyi baris kode untuk ambil nilai dari suatu variabel range (dalam hal ini dari rngHasil) adalah :
   sItem = rngHasil.Value
Variabel lBarisItem diisi dengan indeks baris Excel dari rngHasil, yang diperoleh dengan baris kode :
   lBarisItem = rngHasil.Row
Variabel sAlamatRecordItem diisi dengan teks alamat range untuk kolom B di indeks baris yang disimpan oleh lBarisItem. Maka baris kode penyusun alamat range Record adalah :
   sAlamatRecordItem = "B" & lBarisItem
Variabel iRecordMax diisi dengan nilai kolom B yang alamatnya disimpan di sAlamatRecordItem dengan baris kode :
   iRecordMax = Range( sAlamatRecordItem ).Value
Variabel iRecordAwal diisi dengan angka 1, karena harus selalu dimulai dari angka 1 setiap proses doubleclick oleh user, dengan baris kode :
   iRecordAwal = 1
Variabel dtDate akan diisi datetime saat user melakukan doubleclick, yang berarti adalah waktu saat ini (Now). Jadi beris kodenya adalah :
   dtWaktu = Now
Semua proses pengambilan nilai ini masuk ke blok IF bagian TRUE. Jadi diletakkan setelah baris keterangan berbunyi :
   'baris kode ketika rngHasil ada bendanya
sehingga event worksheet BeforeDoubleClick akan menjadi :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim rngHasil As Range, sItem As String, lBarisItem As Long
    Dim sAlamatRecordItem As String        'teks alamat si item
    Dim iRecordMax As Integer, iRecordAwal As Integer, dtWaktu As Date

    'mulai baris kode proses
    Set rngHasil = Intersect( Target , Range("A2:A5") )        

    IF NOT rngHasil is Nothing THEN
        'ambil nilai dari sheet Sumber
        sItem = rngHasil.Value
        lBarisItem = rngHasil.Row
        sAlamatRecordItem = "B" & lBarisItem
        iRecordMax = Range( sAlamatRecordItem ).Value
        iRecordAwal = 1
        dtWaktu = Now       
    ELSE
        'baris kode ketika rngHasil tidak ada bendanya
    END IF   
End Sub


6. Mendefinisikan lokasi penulisan
Penulisan dilakukan di sheet bernama 'Output'. Berarti akan bekerja pada worksheet 'Output'. Supaya lebih fleksibel, dibuat variabel penyimpan worksheet penulisan. Variabel ber-type object dari worksheet dideklarasikan dengan datatype Worksheet. Nama variabelnya adalah shtTulis.

Penulisan dilakukan di baris kosong selanjutnya. Berarti harus tahu area range yang sudah terpakai di sheet Output. Variabel object Range penyimpan area yang sudah terpakai dideklarasikan ber-type Range. Misalnya diberi nama rngTerpakai. Untuk tahu baris kosong pertama lokasi penulisan, harus diketahui jumlah baris yang sudah terpakai. Jumlah baris yang terpakai berupa bilangan bulat yang bisa sebanyak jumlah baris Excel. Datatype Long akan mampu menampungnya. Nama variabelnya adalah lBarisTerpakai.

Sampai disini, sudah ada beberapa variabel baru yang akan dideklarasikan lebih dulu. Baris-baris deklarasi tersebut adalah :
   Dim shtTulis As Worksheet, rngTerpakai As Range, lBarisTerpakai As Long
Kemudian, variabel-variabel baru tersebut diisi.
Variabel shtTulis diisi dengan worksheet Output dengan baris kode definisi variabel object :
   Set shtTulis = Sheets("Output")
Variabel rngTerpakai diisi dengan range yang sudah terpakai di sheet 'Output'. Properti UsedRange milik worksheet tersebut. Lihat BelajarVBA 011 - Range 03 (UsedRange,Intersect,Union). Baris kode pendefinisian rngTerpakai agar terisi dengan hasil properti UsedRange adalah :
   Set rngTerpakai = shtTulis.UsedRange
Variabel lBarisTerpakai diisi jumlah baris pada variabel range yang sudah terpakai yang bernama rngTerpakai dengan baris kode :
   lBarisTerpakai = rngTerpakai.Rows.Count
Baris-baris kode untuk mengisi nilai variabel-variabel baru tersebut adalah lanjutan proses kerja, jadi diletakkan setelah baris kode pengisian nilai yang nomor 5. Sampai disini, bentuk blok prosedur akan menjadi :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim rngHasil As Range, sItem As String, lBarisItem As Long
    Dim sAlamatRecordItem As String        'teks alamat si item
    Dim iRecordMax As Integer, iRecordAwal As Integer, dtWaktu As Date
    Dim shtTulis As Worksheet, rngTerpakai As Range, lBarisTerpakai As Long


    'mulai baris kode proses
    Set rngHasil = Intersect( Target , Range("A2:A5") ) 
    IF NOT rngHasil is Nothing THEN

        'ambil nilai dari sheet Sumber
        sItem = rngHasil.Value
        lBarisItem = rngHasil.Row
        sAlamatRecordItem = "B" & lBarisItem
        iRecordMax = Range( sAlamatRecordItem ).Value
        iRecordAwal = 1
        dtWaktu = Now
       
        'ambil informasi lokasi penulisan
        Set shtTulis = Sheets("Output")
        Set rngTerpakai = shtTulis.UsedRange
        lBarisTerpakai = rngTerpakai.Rows.Count       
    ELSE
        'baris kode ketika rngHasil tidak ada bendanya
    END IF   
End Sub


7. Membentuk blok kerja penulisan
Penulisan akan dilakukan sebanyak nilai iRecordMax, dimulai dari iRecordAwal bernilai 1. Artinya akan ada proses penulisan berulang kali alias proses loop. Meski iRecordAwal saat ini selalu dimulai dari 1, bisa jadi nanti suatu saat akan berubah dan tidak akan lagi dimulai dari 1. Oleh sebab itu dibutuhkan variabel penyimpan baris baru lokasi penulisan, yang selalu bertambah 1 dari baris penulisan sebelumnya dalam proses loop. Artinya, sesaat sebelum memasuki proses loop, sudah harus diketahui lebih dulu lokasi baris baru penulisan untuk kegiatan tulis data yang pertama. Untuk keperluan ini, dibutuhkan penyimpan nomor baris baru penulisan yang bisa menampung nilai jumlah baris Excel seluruhnya. Datatype Long bisa menampungnya. Nama variabelnya adalah lBarisBaru. Baris deklarasinya diletakkan pada bagian deklarasi variabel dengan baris kode berbunyi :
   Dim lBarisBaru As Long
Nilai lBarisTerpakai adalah yang sudah terpakai. Maka baris baru penulisan pertama adalah 1 baris setelah lBarisTerpakai. Jadi lBarisBaru sebelum proses loop bisa ditentukan dengan baris kode :
   lBarisBaru = lBarisTerpakai + 1

Karena yang diketahui adalah nilai awal dan akhir proses loop, maka dipilih loop berupa blok FOR ... NEXT. Blok For ... Next membutuhkan variabel loop. Karena loop-nya pada nilai iRecordAwal sampai iRecordMax, maka dideklarasikan variabel loop bernama iNomor dengan datatype Integer. Baris kode deklarasinya diletakkan pada bagian deklarasi variabel. Baris kodenya berbunyi :
   Dim iNomor As Integer
Kemudian blok FOR ... NEXT dibuat dalam blok IF sebagai kelanjutan proses kerja. Bentuk blok FOR ... EACH nya adalah :
   FOR iNomor = iRecordAwal To iRecordMax

   NEXT iNomor

Blok prosedur akan menjadi :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim rngHasil As Range, sItem As String, lBarisItem As Long
    Dim sAlamatRecordItem As String        'teks alamat si item
    Dim iRecordMax As Integer, iRecordAwal As Integer, dtWaktu As Date
    Dim shtTulis As Worksheet, rngTerpakai As Range, lBarisTerpakai As Long
    Dim lBarisBaru As Long, iNomor As Integer

    'mulai baris kode proses
    Set rngHasil = Intersect( Target , Range("A2:A5") )
    IF NOT rngHasil is Nothing THEN
        'ambil nilai dari sheet Sumber
        sItem = rngHasil.Value
        lBarisItem = rngHasil.Row
        sAlamatRecordItem = "B" & lBarisItem
        iRecordMax = Range( sAlamatRecordItem ).Value
        iRecordAwal = 1
        dtWaktu = Now
       
        'ambil informasi lokasi penulisan
        Set shtTulis = Sheets("Output")
        Set rngTerpakai = shtTulis.UsedRange
        lBarisTerpakai = rngTerpakai.Rows.Count
       
        'blok kerja penulisan
        lBarisBaru = lBarisTerpakai + 1
        FOR iNomor = iRecordAwal To iRecordMax
            'detil kerja penulisan disini

        NEXT iNomor       
    ELSE
        'baris kode ketika rngHasil tidak ada bendanya
    END IF   
End Sub


8. Menulis data dibaris baru penulisan dan menentukan baris baru untuk data berikutnya
Ketika proses memasuki proses loop dan lokasi baris baru penulisan sudah diketahui, maka proses selanjutnya adalah menulis seluruh nilai yang diketahui ke baris baru penulisan pada kolom masing-masing nilai. Lihat BelajarVBA 011 - Range 01 (berdasar alamat range). Nilai item dalam sItem akan ditulis di kolom A pada lBarisBaru. Baris kode penulisannya berbunyi :
   shtTulis.Range("A" & lBarisBaru).Value = sItem
Nilai waktu dalam dtWaktu akan ditulis di kolom B pada lBarisBaru. Baris kode penulisannya berbunyi :
   shtTulis.Range("B" & lBarisBaru).Value = dtWaktu
Nilai nomor urut dalam iNomor (yang dipakai oleh loop) akan ditulis di kolom C pada lBarisBaru. Baris kode penulisannya berbunyi :
   shtTulis.Range("C" & lBarisBaru).Value = iNomor

Setelah seluruh data ditulis, maka nilai baris baru untuk proses penulisan pada loop berikutnya harus ditentukan.
Artinya, lBarisBaru harus bertambah 1. Jadi, saat proses loop mengolah iNomor berikutnya, baris penulisannya sudah dibaris yang baru lagi. Penambahan 1 untuk lBarisBaru adalah dengan baris kode :
   lBarisBaru = lBarisBaru + 1
Sampai disini, blok prosedur akan menjadi :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim rngHasil As Range, sItem As String, lBarisItem As Long
    Dim sAlamatRecordItem As String        'teks alamat si item
    Dim iRecordMax As Integer, iRecordAwal As Integer, dtWaktu As Date
    Dim shtTulis As Worksheet, rngTerpakai As Range, lBarisTerpakai As Long
    Dim lBarisBaru As Long, iNomor As Integer

    'mulai baris kode proses
    Set rngHasil = Intersect( Target , Range("A2:A5") ) 
    IF NOT rngHasil is Nothing THEN
        'ambil nilai dari sheet Sumber
        sItem = rngHasil.Value
        lBarisItem = rngHasil.Row
        sAlamatRecordItem = "B" & lBarisItem
        iRecordMax = Range( sAlamatRecordItem ).Value
        iRecordAwal = 1
        dtWaktu = Now
       
        'ambil informasi lokasi penulisan
        Set shtTulis = Sheets("Output")
        Set rngTerpakai = shtTulis.UsedRange
        lBarisTerpakai = rngTerpakai.Rows.Count
       
        'blok kerja penulisan
        lBarisBaru = lBarisTerpakai + 1
        FOR iNomor = iRecordAwal To iRecordMax
            'detil kerja penulisan disini
            shtTulis.Range("A" & lBarisBaru).Value = sItem
            shtTulis.Range("B" & lBarisBaru).Value = dtWaktu
            shtTulis.Range("C" & lBarisBaru).Value = iNomor
           
            'membuat baris baru penulisan untuk loop berikutnya
            lBarisBaru = lBarisBaru + 1
        NEXT iNomor       
    ELSE
        'baris kode ketika rngHasil tidak ada bendanya
    END IF   
End Sub


9. Membuat proses akhir
Seluruh proses pokok penulisan data telah selesai. Karena proses dijalankan saat cell di-doubleclick, maka harus dipastikan bahwa proses doubleclick tidak membuat cell masuk ruang edit data cell. Hal ini dilakukan dengan membuat variabel Cancel milik event worksheet BeforeDoubleClick harus bernilai TRUE. Baris kodenya adalah :
   Cancel = TRUE
Proses pembatalan terhadap dampak doubleclick yang akan masuk ruang edit data cell dilakukan tepat setelah proses loop. Tahapan berikutnya adalah proses akhir yang biasanya diisi dengan penampilan pesan selesai dan sebagainya. Pesan kepada user bisa disampaikan setelah blok loop dengan FOR ... NEXT. Misalnya dengan menggunakan kotak pesan (MsgBox) seperti baris kode berikut :
MsgBox "Selesai." & vbcrlf & "Item : " & sItem & vbcrlf & _
    "Pada : " & dtWaktu & vbcrlf & "Jumlah record : " & iRecordMax _
    ,vbInformation,"Contoh Kasus Belajar VBA 001"

Blok prosedur lengkapnya akan menjadi :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim rngHasil As Range, sItem As String, lBarisItem As Long
    Dim sAlamatRecordItem As String        'teks alamat si item
    Dim iRecordMax As Integer, iRecordAwal As Integer, dtWaktu As Date
    Dim shtTulis As Worksheet, rngTerpakai As Range, lBarisTerpakai As Long
    Dim lBarisBaru As Long, iNomor As Integer

    'mulai baris kode proses
    Set rngHasil = Intersect( Target , Range("A2:A5") )
    IF NOT rngHasil is Nothing THEN
        'ambil nilai dari sheet Sumber
        sItem = rngHasil.Value
        lBarisItem = rngHasil.Row
        sAlamatRecordItem = "B" & lBarisItem
        iRecordMax = Range( sAlamatRecordItem ).Value
        iRecordAwal = 1
        dtWaktu = Now
       
        'ambil informasi lokasi penulisan
        Set shtTulis = Sheets("Output")
        Set rngTerpakai = shtTulis.UsedRange
        lBarisTerpakai = rngTerpakai.Rows.Count
       
        'blok kerja penulisan
        lBarisBaru = lBarisTerpakai + 1
        FOR iNomor = iRecordAwal To iRecordMax
            'detil kerja penulisan disini
            shtTulis.Range("A" & lBarisBaru).Value = sItem
            shtTulis.Range("B" & lBarisBaru).Value = dtWaktu
            shtTulis.Range("C" & lBarisBaru).Value = iNomor
           
            'membuat baris baru penulisan untuk loop berikutnya
            lBarisBaru = lBarisBaru + 1
        NEXT iNomor

        'batalkan dampak doubleclick pada cell
        Cancel = TRUE
       
        'pesan untuk user
        MsgBox "Selesai." & vbcrlf & "Item : " & sItem & vbcrlf & _
            "Pada : " & dtWaktu & vbcrlf & "Jumlah record : " & iRecordMax _
            ,vbInformation,"Contoh Kasus Belajar VBA 001"
    ELSE
        'baris kode ketika rngHasil tidak ada bendanya
    END IF
End Sub


:)

Selesai sudah proses detil dalam menyelesaikan kasus sederhana ini. Setelah dipahami alurnya dan semakin terbiasa melakukan coding, biasanya prosedur akhir tersebut, dengan batasan materi sampai 011_03 dan record awal selalu mulai dari 1, bisa menjadi lebih ringkas seperti ini :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim sItem As String, iRecordMax As Integer, dtWaktu As Date
    Dim lBarisTerpakai, iNomor As Integer

    If Not Intersect(Target, Range("A2:A5")) Is Nothing Then
        'ambil nilai dari sheet Sumber
        sItem = Target.Value
        iRecordMax = Range("B" & Target.Row).Value
        dtWaktu = Now
       
        'blok kerja penulisan
        lBarisTerpakai = Sheets("Output").UsedRange.Rows.Count
        For iNomor = 1 To iRecordMax
            'detil kerja penulisan disini
            Sheets("Output").Range("A" & lBarisTerpakai + iNomor).Value = sItem
            Sheets("Output").Range("B" & lBarisTerpakai + iNomor).Value = dtWaktu
            Sheets("Output").Range("C" & lBarisTerpakai + iNomor).Value = iNomor
        Next iNomor
       
        Cancel = True   'batalkan dampak doubleclick pada cell
       
        'pesan untuk user
        MsgBox "Selesai." & vbCrLf & "Item : " & sItem & vbCrLf & _
            "Pada : " & dtWaktu & vbCrLf & "Jumlah record : " & iRecordMax _
            , vbInformation, "Contoh Kasus Belajar VBA 001"
    End If
End Sub


No comments:

Post a Comment