Friday, February 28, 2014

Membuat Laporan Pembangunan Proyek Perumahan

@infoexcel07 Membuat laporan pembangunan proyek perumahan pada sebuah pengembang industri properti di Jakarta, misalkan saja PT. XXX telah bertahun-tahun membangun proyek perumahan. periode selama delapan tahun PT. XXX telah mencerminkan perkembangan aktivitas pengembangan pembangunan proyek perumahan. pada tabel tersebut terdapat informasi detail mengenai jumlah rumah yang dibangun selama tahun 2001 sampai dengan tahun 2008. tabel data laporan pembangunan proyek perumahan sebagai berikut :


Membuat_Laporan_Pembangunan_Proyek_Perumahan_3

untuk keperluan perusahaan, sobat @infoexcel diminta untuk membuat laporan seperti yang terlihat pada tabel tersebut yang meliputi :
  1. Jumlah rumah untuk masing-masing type yang dibangun.
  2. Jumlah rata-rata masing-masing tipe yang dibangun selama periode tersebut.
  3. Jumlah minimal rumah yang dibangun untuk masing-masing tipe.
  4. Jumlah maksimal rumah yang dibangun untuk masing-masing tipe.
tampilan hasil yang diminta adalah sebagai berikut :

Membuat_Laporan_Pembangunan_Proyek_Perumahan_1

Penyelesaian
untuk menyelesaikan laporan pembangunan proyek perumahan diatas, dapat mempraktekkan langkah-langkah sebagai  berikut :
  1. Buatlah layout yang semirip mungkin (versi kamu yah), atau dapat download di file Laporan Pembangunan Proyek Perumahan.
  2. tulis rumus =SUM(C7:F7) di sel G6
  3. copy rumus tersebut ke sel G7:G13, dengan paste special – formula
  4. untuk row JUMLAH, kamu dapat menuliskan rumus =SUM(C6:C14) untuk cell C14. lakukan hal yang sama yaitu copas saja rumus yang berada pada cell C14 ke cell D14, E14, F14 dan G14 dengan menggunakan fasilitas paste special – formula.
  5. agar mengetahui berapa rata-rata rumah yang dibangun oleh PT. XXX dari tahun 2001 sampai dengan tahun 2008 dapat menggunakan rumus =AVERAGE(C6:C14) untuk cell C15. untuk mengetahui rata-rata dengan tipe lainnya cara cepat lakukan hal yang sama yaitu copas saja rumus yang berada pada cell C15 ke cell D15, E15, F15 dan G15 dengan menggunakan fasilitas paste special – formula.
  6. jumlah terkecil atau minimal rumah yang dibangun oleh PT. XXX dari tahun 2001 sampai dengan tahun 2008 dapat menggunakan rumus =MIN(C6:C14) untuk cell C17. untuk mengetahui jumlah minimal atau terkecil dengan tipe lainnya dapat melakukan hal yang sama yaitu copas rumus yang berada pada cell C17 ke cell D17, E17, F17 dan G17 dengan menggunakan fasilitas paste special – formula.
  7. Jumlah tertinggi atau terbanyak rumah (properti) yang dibangun oleh PT. XXX dari tahun 2001 sampai dengan tahun 2008 dapat menggunakan rumus =MAX(C6:C14) untuk cell C16. Dengan mengetahui jumlah terbesar atau tertinggi pada tipe lainnya dapat melakukan cara cepat copas saja rumus yang berada pada cell C16 ke cell D16, E16, F16 dan G16 dengan menggunakan fasilitas paste special – formula.
jika langkah-langkahnya di ikuti dengan benar, sehingga hasilnya dapat dilihat sebagai berikut :

Membuat_Laporan_Pembangunan_Proyek_Perumahan_2

semoga langkah-langkah dalam Membuat laporan pembangunan proyek perumahan tersebut diatas dapat bermanfaat dan membantu menyelesaikan pekerjaan ataupun tugas kuliah sobat @infoexcel07. apabila merasa kebingungan, silakan follow @infoexcel07 atau dapat berkomentar. sekian tutorial singkat dalam studi kasus Membuat laporan pembangunan proyek perumahan.

Wednesday, February 26, 2014

Membuat Laporan Penjualan Buku Pendidikan

@infoexcel07 akan membahas bermacam studi kasus untuk bidang bisnis yang sifatnya umum atau sering dijumpai dalam kehidupan sehari-hari agar mudah dalam pemahaman sehingga dalam kegiatan di lapangan akan mudah digunakan. pembahasan akan selalu dimulai dengan permasalahan, memberikan contoh layout output hasil yang diinginkan, kemudian memberikan langkah-langkah dalam pembuatannya agar dapat menyelesaikan studi kasus tersebut dibawahnya. untuk memudahkan sobat @infoexcel07 dalam mempraktikkan materi yang dibahas, akan dilengkapi dengan file dengan studi kasus tersebut.

sebagai contoh studi kasus untuk pertama akan membahas mengenai laporan penjualan buku pendidikan. ini adalah laporan yang sangat sederhana sekali. setiap orang dijamin bisa membuatnya. tapi, apakah rapi dan enak dilihatnya? tentunya jangan hanya selesai membuat laporan dan mengesampingkan kerapihan layout sehingga hanya melihat hasil akhir saja.

sebagai gambaran akhirnya telah captre dibawah ini untuk layout sederhananya.

Membuat_Laporan_Penjualan_Buku_Pendidikan_1

cara singkatnya ialah sebagai berikut :
1. buka aplikasi Microsoft Excel 2007. maaf ya soalnya yang terinstal masih versi 2007 sih dan @infoexcel07 sudah familiar sekali dengan versi office 2007 tersebut.
2. sobat @infoexcel07 buat ya seperti layoutnya. klo bisa sih semirip mungkin atau download filenya.
3. apabila mengalami kesulitan, dapat melakukan langkah-langkah berikut ini ya.
4. untuk judul (title) tuliskan dengan menekan tombol caps lock "LAPORAN BUKU PENJUALAN PENDIDIKAN"

5. pada cell A3 ketikkan BULAN, dan B3 ketikkan JUMLAH. nah pada cel A5 ketikkan rumus =NOW() diakhiri dengan tombol ENter.

Membuat_Laporan_Penjualan_Buku_Pendidikan_2

sehingga hasilnya seperti dibawah ini.

Membuat_Laporan_Penjualan_Buku_Pendidikan_3

6. klik kanan pada cell A5, pilih format cell. buka pada tab number lalu pilih custom. pada type, ubahlah ke format MMMM. mengapa begitu? agar format yang terbaca hanya bulannya saja.

Membuat_Laporan_Penjualan_Buku_Pendidikan_4

kok jadi februari doang sih? untuk mengaturnya gampang kok, tinggal cell A5 dijadikan sebagai target utama. untuk menjadikan bulan januari tinggal gunakan saja rumus =A5-30 yang dituliskan pada cell A4. sedangkan untuk menjadikan bulan maret dan seterusnya, dapat menggunakan rumus =A5+30. mengapa angka 30? karena asumsi di komputer per bulan itu ada 30 hari.

Membuat_Laporan_Penjualan_Buku_Pendidikan_5

7. kemudian untuk cell B4 ketikkan angka atau jumlah pada bulan yang terkait. agar lebih enak terlihat, lakukan trik berikut ya. blok terlebih dahulu cell B4 sampai dengan cell B15, kemudian klik kanan pada area tersebut dan pilih comma.

Membuat_Laporan_Penjualan_Buku_Pendidikan_6

8. pada cell A16 tuliskan TOTAL dan pada cell B16 tuliskan rumus =SUM(B4:B15) untuk eksekusi tekan enter yah sobat @infoexcel07. dapat juga menekan shortcut untuk sum yaitu dengan menekan tombol Alt+= (tombol Alt dengan tombol sama dengan secara bersamaan).

Membuat_Laporan_Penjualan_Buku_Pendidikan_7

9. kemudian blok cell A3:B16 (dibaca A3 sampai dengan B16). lalu klik kanan format cell, masuk tab border dan pilih garis yang diinginkan. sebagai sampel saja dengan garis lurus dan seperti contoh dibawah ini yaa.

Membuat_Laporan_Penjualan_Buku_Pendidikan_8

10. taraa,,akhirnya selesai juga dalam membuat laporan penjualan buku pendidikan secara sederhana.

Membuat_Laporan_Penjualan_Buku_Pendidikan_1

bagaimana sobat @infoexcel? mudah bukan dalam Membuat Laporan Penjualan Buku Pendidikan? ikuti terus ya update dari blog info excel agar tidak ketinggalan informasi. @infoexcel07 senang sih berbagi dengan hal yang sederhana dan nantinya akan lebih kompleks ya. mohon dukungan serta kerjasamanya yah sobat @infoexcel07.
















Sunday, February 23, 2014

BelajarVBA 102 - ComboBox 02

Coretan Mr. Kid

Isilah masa sehat dengan kebaikan sebelum tiba masa sakit.

Pada pembahasan tentang combobox yang lalu, sumber data merujuk ke suatu area range yang diisikan ke dalam combobox dengan memanfaatkan properti ListFillRange (combobox di dalam worksheet) atau RowSource (combobox di dalam userform). Properti ListFillRange akan membuat daftar dalam combobox menjadi terikat erat dengan sumbernya, sehingga pengubahan isi daftar tanpa mengubah sumber data tidak dimungkinkan. Pengubahan bisa dilakukan bila yang diubah adalah nilai-nilai dalam sumber data.

Bahasan kali ini masih akan menggunakan data sumber untuk combobox list dari suatu range. Hanya saja, kali ini pengisian daftar combobox dilakukan tanpa properti ListFillRange atau RowSource, tetapi menggunakan methods AddItem ataupun properti List dari combbox. Hal ini akan membuat daftar menjadi lebih terbuka untuk diubah isinya. Kadang kala pengubahan isi daftar juga dibutuhkan pada beberapa kasus.

File yang akan digunakan adalah BelajarVBA102_02.xlsm. Data yang digunakan diletakkan pada sheet bernama 'populate' dengan nama object di dalam VBProject adalah Sheet2. Data tersebut seperti gambar berikut :


ComboBox list berisi satu kolom

Kali ini, pembahasan combobox akan memanfaat userform. Pada bahasan tentang combobox berisi satu kolom ini, akan menggunakan userform bernama frmNomor2 seperti gambar berikut :
yang berisi object controls utama sebagai berikut :
  • Combobox bernama cboProd : combobox dengan list berisi satu kolom yang dibaca dari sheet bernama populate (object Sheet2) pada range A2:A5.
  • Textbox bernama txtListIndex : menampilkan nilai yang disimpan oleh properti ListIndex milik cboProd.
  • Textbox bernama txtText : menampilkan nilai yang disimpan oleh properti Text milik cboProd.
  • Textbox bernama txtValue : menampilkan nilai yang disimpan oleh properti Value milik cboProd.
Pada kasus ini, textbox digunakan untuk menampilkan data dan tidak mengijinkan user untuk bisa mengubah nilainya. Maka properti Locked milik seluruh textbox diset bernilai TRUE. Properti milik cboProd menggunakan nilai default setiap pembuatan object baru di sebuah userform, yang antara lain adalah :
  • BoundColumn dan ColumnCount bernilai 1
  • ColumnHeads bernilai FALSE
  • ColumnWidths, ControlSource, RowSource, Text, Value dalam keadaan kosong
  • ListWidth bernilai 0pt
  • TextColumn bernilai -1
Alur proses pada frmNomor2 adalah sebagai berikut :
  1. Saat frmNomor2 dimuat ke memori komputer, maka dilakukan pengisian item-item daftar pilihan combobox, yang dilanjutkan dengan manampilkan frmNomor2 kepada user. Artinya, proses pengisian dilakukan saat frmNomor2 sedang diinisialisasi ke memori komputer. Jadi, proses pengisian item ke combobox llist dilakukan pada sebuah event milik userform frmNomor2, yaitu event Initialize.
  2. Ketika user mengubah pada combobox cboProd, maka akan dilakukan proses penulisan nilai-nilai yang disimpan oleh properti ListIndex, Text, dan Value dari cboProd ke :
    • sheet bernama populate (Sheet2 di VBProject Explorer) pada range B13 sampai B15.
    • textbox control terkait, yaitu txtListIndex, txtText, dan txtValue
    Proses ini dilaksanakan saat user mengubah isi cboProd, yang berarti akan memicu event Change milik cboProd. Jadi proses dilakukan didalam event Change milik cboProd.
  3. Saat userform frmNomor2 ditutup oleh user, maka dilakukan pembersihan isi range B13 sampai B15 yang ada di sheet bernama populate. Proses ini terjadi saat ada permintaan penutupan userform oleh user, yang akan memicu event milik userform yang bernama QueryClose. Jadi, proses pembersihan isi range tertentu tersebut diletakkan di dalam event QueryClose milik userform.
Setelah desain userform frmNomor2 terbentuk dan alur proses terjabarkan dengan jelas, maka penulisan script VBA untuk setiap proses tersebut bisa dilakukan dengan tartil. Berikut ini langkah penulisan script VBA untuk contoh kasus di atas.
  1. Event Initialize milik userform frmNomor2
    Diisi dengan proses pengisian daftar untuk combobox cboProd dengan langkah penyusunan sebagai berikut :
    • Membuat blok prosedur sub event Initialize milik userform frmNomor2 dengan cara :
      • double click userform frmNomor2, sehingga muncul blok event Click milik userform frmNomor2
      • pada combobox prosedur (sudut kanan atas area penulisan script) -> pilih Initialize
      • letakkan cursor ke dalam blok prosedur sub event Initialize yang terbentuk
    • Mendeklarasikan variabel yang dibutuhkan selama proses pengisian Pengisian item list combobox cboProd bisa dilakukan dengan 2 (dua) cara, yaitu : (pilih salah satu)
      • Memanfaatkan methods AddItem dengan cara melakukan loop terhadap setiap item sumber data. Sumber data yang berada di sheet populate (object Sheet2) pada range A2:A5 membutuhkan variabel loop bertipe Range. Maka perlu pendeklarasian variabel tersebut, yang misalnya diberi nama rngCurrent. Baris kode deklarasi tersebut berbunyi :
        Dim rngCurrent As Range
      • Memanfaatkan properti List dengan cara menyediakan array seluruh item dari sumber data. Berarti, sumber data yang ada di sheet populate (object Sheet2) pada range A2:A5 dibaca dan disimpan sebagai sebuah array. Area range sebenarnya adalah suatu array dan tipe data yang memungkinkan dengan mudah untuk menyimpan array dari suatu range adalah tipe Variant. Maka perlu pendeklarasian variabel bertipe variant, yang misalnya diberi nama vSumber. Baris kode deklarasi tersebut berbunyi :
        Dim vSumber As Variant
    • Menyusun baris kode proses pengisian
      Sumber data di sheet populate (Sheet2) pada range A2:A5.
      • Jika memilih menggunakan methods AddItem, maka dibutuhkan proses loop terhadap setiap item dalam range A2:A5. Di dalam proses loop tersebut diisi proses penambahan item ke list milik combobox dengan methods AddItem. Baris-baris kode proses ini adalah :
        For Each rngCurrent In Sheet2.Range("a2:a5")
           cboProd.AddItem rngCurrent.Value
        Next rngCurrent
      • Jika memilih menggunakan properti List, maka dibutuhkan proses penyimpanan sumber data range A2:A5 menjadi array, yaitu ke dalam variabel vSumber. Kemudian array dalam variabel vSumber dimasukkan ke properti List. Baris-baris kode proses ini adalah :
        vSumber = Sheet2.Range("a2:a5")
        cboProd.List = vSumber
    • Bentuk akhir prosedur sub event Initialize menjadi :
      • Methods AddItem
        Private Sub UserForm_Initialize()
           Dim rngCurrent As Range

           For Each rngCurrent In Sheet2.Range("a2:a5")
              cboProd.AddItem rngCurrent.Value
           Next rngCurrent
        End Sub
      • Properti List
        Private Sub UserForm_Initialize()
           Dim vSumber As Variant

           vSumber = Sheet2.Range("a2:a5")
           cboProd.List = vSumber
        End Sub
  2. Event Change milik cboProd
    Diisi dengan proses penulisan ke lokasi target dengan langkah penyusunan sebagai berikut :
    • Membentuk blok prosedur sub event Change milik cboProd dengan cara double click object control combobox cboProd yang ada di dalam userform frmNomor2 dan meletakkan cursor di dalam blok prosedur yang terbentuk
    • Menulis nilai-nilai properti ListIndex, Text, dan Value secara berurutan ke :
      • Sheet populate pada range B13 sampai B15 dengan baris-baris kode :
        Sheet2.Range("b13").Value = cboProd.ListIndex
        Sheet2.Range("b14").Value = cboProd.Text
        Sheet2.Range("b15").Value = cboProd.Value
      • Object controls textbox txtListIndex, txtText, dan txtValue dengan baris-baris kode :
        txtListIndex.Text = cboProd.ListIndex
        txtText.Text = cboProd.Text
        txtValue.Text = cboProd.Value
    • Bentuk akhir blok prosedur sub event Change milik cboProd :
      Private Sub cboProd_Change()
         Sheet2.Range("b13").Value = cboProd.ListIndex
         Sheet2.Range("b14").Value = cboProd.Text
         Sheet2.Range("b15").Value = cboProd.Value

         txtListIndex.Text = cboProd.ListIndex
         txtText.Text = cboProd.Text
         txtValue.Text = cboProd.Value
      End Sub
  3. Event QueryClose milik userform frmNomor2
    Diisi dengan proses menghapus isi range B13 sampai B15 pada sheet bernama populate (object Sheet2), yang menjadi lokasi penulisan pada proses di dalam event Change milik cboProd. Langkah-langkah penyusunannya adalah sebagai berikut :
    • Membentuk blok prosedur sub event QueryClose milik userform frmNomor2 dengan cara :
      • double click userform frmNomor2
      • pada combobox daftar prosedur (pojok kanan atas area penulisan script) -> pilih QueryClose
      • letakkan cursor di dalam blok prosedur yang terbentuk
    • Menulis baris kode untuk menghapus isi range B13 sampai B15 di sheet populate (object Sheet2) yang berbunyi :
      Sheet2.Range("b13:b15").ClearContents
    • Bentuk akhir blok prosedur sub event QueryClose menjadi :
      Private Sub UserForm_QueryClose( _
                                Cancel As Integer _
                              , CloseMode As Integer)
         Sheet2.Range("b13:b15").ClearContents
      End Sub
Prosedur-prosedur di atas membentuk sebuah proses sederhana tentang pengisian item list combobox dan pengambilan nilai dari item terpilih ke suatu lokasi target (range tertentu ataupun object control tertentu).

ComboBox list multi kolom hanya menampilkan satu kolom

Kali ini, dibuat sebuah userform yang diberi nama frmNomor3 yang mirip dengan userform frmNomor2. Perbedaannya adalah penambahan textbox bernama txtCol2 untuk menampilkan nilai dari kolom ke-3 list combobox. Properti BoundColumn di-set bernilai 2 dan properti TextColumn di-set bernilai 1. Sedangkan properti ColumnCount tetap bernilai 1 karena hanya akan menampilkan satu kolom saja. Sumber data untuk list combobox diambil dari sheet populate (object Sheet2) pada area range A2:C5 (3 kolom). Bentuk userform frmNomor3 seperti gambar berikut :

> Proses pend-disable-an event pada userform

Kebutuhan untuk membaca nilai dari kolom list yang tidak ditunjuk oleh properti BoundColumn maupun TextColumn, seperti ingin mengambil nilai dari kolom list ke-3 [indeks kolom bernilai 2 = Column(2)] bisa memicu timbulnya error ketika nilai pada kolom yang dirujuk tersebut belum terdefinisikan. Contohnya adalah ingin mengambil nilai dari kolom ke-3, tetapi pada baris item tersebut baru 2 kolom saja yang didefinisikan.

Error seperti ini sering terjadi ketika proses pengambilan nilai pada suatu kolom list dilakukan pada event Change milik combobox terkait (misal pada event Change milik cboProd). Artinya, dibutuhkan sebuah proses untuk mengabaikan kerja prosedur sub event change pada saat mengubah isi list, karena tidak ada pengaturan untuk men-disable event milik userform. Cara men-disable event di suatu userform dalam VBA dilakukan dengan menggunakan variabel ber-scope module yang diperiksa oleh setiap prosedur sub event yang tidak ingin dijalankan dengan alasan tertentu.

Pada contoh kasus ini, proses pada event Initialize userform frmNomor3 bisa memunculkan error, karena proses pengisian list combobox akan memicu event Change milik cboProd. Untuk men-disable event, maka dibuat sebuah variabel bernama bEventTidakBolehJalan dengan scope module. Baris kode deklarasi variabel ini diletakkan pada area General Declaration (di baris pertama area penulisan script atau setelah baris berbunyi Option Explicit). Baris kode tersebut berbunyi :
   Private bEventTidakBolehJalan As Boolean

Pada event Change milik cboProd, yaitu dibaris pertama setelah baris deklarasi variabel diberi proses cek terhadap nilai variabel bEventTidakBolehJalan dengan bentuk baris kode :
   If bEventTidakBolehJalan Then
      Exit Sub
   End If
yang berarti, jika variabel bEventTidakBolehJalan sedang bernilai TRUE, maka proses langsung keluar dari prosedur alias tidak ada proses dalam prosedur event tersebut yang dilakukan.

Cara menggunakannya, pada prosedur yang salah satu prosesnya bisa memicu si event Change milik cboProd untuk dijalankan, seperti pada event Initialize milik userform frmNomor3, diberi baris kode untuk mengubah nilai variabel bEventTidakBolehJalan menjadi TRUE. Penempatannya adalah tepat sebelum proses yang memicu berjalannya event Change milik cboProd. Pada kasus ini, berarti baris kode berbunyi :
   bEventTidakBolehJalan = TRUE
diletakkan tepat sebelum proses pengisian item list cboProd di dalam prosedur sub event Initialize. Pada bagian akhir event Initialize, yaitu tepat sebelum keluar dari prosedur atau sebelum baris End Sub, diberi baris kode untuk mengembalikan nilai variabel bEventTidakBolehJalan menjadi FALSE. Baris kode tersebut berbunyi :
   bEventTidakBolehJalan = FALSE

> Proses pengisian multi kolom list dengan methods AddItem

Cara mengisi multi kolom list menggunakan methods AddItem memerlukan sebuah variabel penyimpan indeks baris list yang akan ditambahkan. Misalkan variabel ini diberi nama lCboIndex. Maka pada event Initialize diberi penambahan deklarasi variabel tersebut. Maka baris deklarasi variabel pada event Initialize menjadi :
   Dim rngCurrent As Range, lCboIndex As Long

Kemudian nilai lCboIndex di-set dengan nilai awal indeks baris list yang base-0, yaitu dengan nilai 0 seperti dengan baris berbunyi :
   lCboIndex = 0

Proses loop yang tadinya berbentuk :
   For Each rngCurrent In Sheet2.Range("a2:a5")
      cboProd.AddItem rngCurrent.Value
   Next rngCurrent

diubah menjadi :
   For Each rngCurrent In Sheet2.Range("a2:a5")
      cboProd.AddItem rngCurrent.Value  'pembuat item baru


      'pengisi kolom list ke-2 dan seterusnya
      cboProd.List(lCboIndex, 1) = rngCurrent.Offset(0, 1).Value
      cboProd.List(lCboIndex, 2) = rngCurrent.Offset(0, 2).Value

      'set nilai indeks baris list berikutnya yang akan diisi

      lCboIndex = lCboIndex + 1
   Next rngCurrent


> Proses pengisian multi kolom list dengan properti List

Jika menggunakan properti List, maka yang diubah adalah rujukan range yang tadinya merujuk ke A2:A5 menjadi merujuk ke A2:C5 (lihat bagian yang di-merah).
   vSumber = Sheet2.Range("a2:c5")

> Penambahan baris penulisan pada event Change cboProd

Pengambilan nilai kolom ke-3 (indeks kolom ke-2) dapat dilakukan dengan properti Column maupun properti List seperti yang telah dijelaskan pada coretan tentang combobox sebelum ini. Penulisan ke sheet populate pada kasus multi kolom list ini dilakukan ke range H18:H21, sehingga baris kode bagian penulisan ke sheet populate menjadi :
   Sheet2.Range("h18").Value = cboProd.ListIndex
   Sheet2.Range("h19").Value = cboProd.Text
   Sheet2.Range("h20").Value = cboProd.Value

   Sheet2.Range("h21").Value = cboProd.List(, 2)  'atau cboProd.Column(2)

Sedangkan pada penulisan ke textbox txtCol2 adalah dengan menambahkan baris kode :
   txtCol2.Text = cboProd.List(, 2)  'atau cboProd.Column(2)

Hasil akhir penyusunan script untuk userform frmNomor3 dapat dilihat pada file BelajarVBA102_02.xlsm.

Tambah, ubah, dan hapus item list combobox

> menambah sebuah item ke list combobox

Misalkan ada sebuah combobox bernama cboProd. Penambahan item list dilakukan dengan menggunakan methods AddItem dengan susunan :
   cboProd.AddItem nilai_baru, [indeks_posisi_penambahan]
Jika ingin menambahkan pada baris baru adalah dengan mengabaikan bagian [indeks_posisi_penambahan] seperti :
   cboProd.AddItem nilai_baru
Bagian nilai_baru adalah teks (bertipe String) yang akan menjadi nilai baru di kolom ke-1 (indeks kolom ke-0).
Contohnya adalah ingin menambahkan item baru 'X' di baris baru, maka baris kodenya adalah :
   cboProd.AddItem "X"
Jika item baru 'Y' ingin ditambahkan pada baris ke-1 list (indeks baris ke-0), maka baris kodenya adalah :
   cboProd.AddItem "Y", 0

Pada combobox dengan multi kolom list, maka bisa jadi dibutuhkan juga pengisian pada kolom ke-2 dan seterusnya (penambahan pada indeks kolom ke-1 dan seterusnya). Pengisian tersebut bisa dilakukan setelah ada penambahan item baru dengan methods AddItem di atas. Susunan penulisan item di kolom lain tersebut secara umum adalah :
   cboProd.List(idxrow, idxcol) = nilai_kolom_baru

Misalkan ingin menambahkan item 'Z' pada baris baru dengan nilai kolom ke-2 bernilai 'Z01' dan nilai kolom ke-3 bernilai 'ZZ11P001', maka baris-baris kode penambahan tersebut adalah :
   cboProd.AddItem "Z"
   cboProd.List( cboProd.ListCount-1 , 1) = "Z01"
   cboProd.List( cboProd.ListCount-1 , 2) = "ZZ11P001"
Properti ListCount dipergunakan untuk mendapatkan jumlah item dalam list. Karena properti ListIndex menggunakan base 0 (indeks baris item pertama bernilai 0), maka nilai properti ListCount - 1 adalah indeks baris item terakhir yang ada. Pada kasus di atas, berarti pada baris item 'Z' yang baru saja ditambahkan di baris baru.

Sedangkan jika ingin menyisipkan (menambah item pada baris tertentu) item 'M' pada baris ke-1 (indeks baris 0) dengan nilai kolom ke-2 bernilai 'M78' dan nilai kolom ke-3 bernilai 'KL98P113', maka baris-baris kode penambahan tersebut adalah :
   cboProd.AddItem "M", 0
   cboProd.List( 0 , 1) = "M78"
   cboProd.List( 0 , 2) = "KL98P113"
Kadangkala, pemeriksaan posisi penyisipan perlu dilakukan, sehingga dapat dipastikan bahwa indeks baris penyisipan tidak lebih dari nilai properti ListCount. Nilai properti ListCount bisa diartikan juga sebagai indeks baris baru jika akan dilakukan penambahan data. Bentuk pemeriksaan tersebut adalah sebagai berikut :
'0 adalah indeks baris lokasi penyisipan dan bisa diganti dengan variabel tertentu
If cboProd.ListCount >= 0 Then 
   'proses penyisipan diletakkan disini
   cboProd.AddItem "M", 0
   cboProd.List( 0 , 1) = "M78"
   cboProd.List( 0 , 2) = "KL98P113" 
End If

> mengubah isi sebuah item yang ada di list combobox

Misalkan ada sebuah combobox bernama cboProd. Pengubahan isi sebuah kolom dalam list combobox dilakukan dengan memanfaatkan propeti List. Bentuk umum beris kodenya adalah :
   cboProd.List(idxrow, idxcol) = nilai_kolom_baru
dengan syarat bahwa idxrow (indeks baris yang akan diubah isinya) kurang dari jumlah item (nilai properti ListCount). Biasanya, bentuk diatas disertai pemeriksaan terhadap indeks baris yang akan diubah isinya. Bentuk lengkapnya menjadi :
'idxrow adalah indeks baris yang akan diubah isinya
If idxrow < cboProd.ListCount Then
   cboProd.List(idxrow, idxcol) = nilai_kolom_baru
End If

Misalkan akan mengubah isi kolom ke-3 (indeks kolom ke-2) pada item di baris pertama (indeks baris ke-0) menjadi 'GJ71P123', maka baris kodenya adalah :
If 0 < cboProd.ListCount Then
   cboProd.List(0, 2) = "GJ71P123"
End If

> menghapus isi list combobox

Misalkan ada sebuah combobox bernama cboProd. Jika akan menghapus seluruh isi list combobox, maka dapat menggunakan methods Clear. Baris kodenya adalah :
   cboProd.Clear

Jika yang akan dihapus adalah sebuah item di baris tertentu, maka dilakukan dengan menggunakan methods RemoveItem disertai indeks baris (base 0) yang akan dihapus. Bentuk umum baris kodenya adalah :
   cboProd.RemoveItem indeks_baris_yang_dihapus
Biasanya, penghapusan sebuah baris item dilakukan setelah diperiksa bahwa baris yang akan dihapus ada didalam list. Artinya, indeks baris yang akan dihapus (indeks_baris_yang_dihapus) kurang dari jumlah item list (nilai properti ListCount). Jadi bentuk umum menghapus sebuah item list combobox yang disertai pemeriksaan keberadaan baris yang akan dihapus adalah :
   If indeks_baris_yang_dihapus < cboProd.ListCount Then
      cboProd.RemoveItem indeks_baris_yang_dihapus
   End If
Misalkan ingin menghapus item di baris ke-4 (indeks baris ke-3), maka baris kodenya adalah :
   If 3 < cboProd.ListCount Then
      cboProd.RemoveItem 3
   End If

Contoh tentang penerapan penambahan item, pengubahan isi, dan penghapusan item bisa dilihat di file BelajarVBA102_02.xlsm pada userform bernama frmNomor4 yang bisa diaktifkan melalui tombol di sheet bernama 'sisip_ubah_buang'. Pada userform tersebut juga disertakan contoh pemanfaatan event Click milik object control Label yang bisa menjadi alternatif sebuah tombol seperti object control CommandButton.

:)

Insya Allah pembahasan berikutnya tentang object control ListBox pada properti yang tidak dimiliki oleh ComboBox, yaitu properti MultiSelect. Selain itu, juga akan dibahas tentang object control Label, khususnya pada pemanfaatan properti Caption dan MultiLine. Object control textbox juga memiliki properti MultiLine, tetapi ada properti PasswordChar yang bisa digunakan untuk me-masking inputan user pada control tersebut. Event KeyDown acapkali terasa bermanfaat ketika digunakan oleh textbox, seperti membatasi inputan untuk numerik saja atau karakter tertentu saja dan sebagainya. Event KeyDown pada textbox juga akan dibahas disana.


Saturday, February 22, 2014

BelajarVBA 102 - ComboBox 01

Coretan Mr. Kid

Sempatkan berbagi sebelum sempit.

Setelah sekian lama tak sempat, Alhamdulillah tiba juga masa sempat tersebut. Bahasan kali ini tentang ActiveX ComboBox. ActiveX Controls memiliki banyak properti dan event yang memudahkan pengaturan alur proses menampilkan sesuatu. Salah satu ActiveX Controls yang sering digunakan adalah ComboBox. File yang digunakan mendampingi coretan kali ini adalah BelajarVBA102_01.xlsm.



ComboBox

Object control ini dapat digunakan untuk menampilkan daftar pilihan kepada user. Daftar pilihan bisa disertai beberapa kolom tambahan yang dapat dijadikan sebagai informasi tambahan bagi user. Object control ini dapat digunakan di dalam Worksheet maupun di dalam UserForm.

Selain dengan cara memilih dari pilihan yang tersedia, user juga bisa menuliskan nama item yang dibutuhkannya pada suatu area penulisan layaknya menulis pada sebuah textbox. Jika yang ditulis user ada dalam daftar pilihan, maka combobox akan segera memilihkan item tersebut untuk user.

Jadi, combobox memiliki 2 bagian utama, yaitu :
  1. daftar pilihan
    • Pada umumnya, daftar ini ditampilkan bila user meng-click dropdown, tetapi pengaturan properti untuk hal ini bisa dilakukan pada properti bernama ShowDropButtonWhen
    • Daftar pilihan ditampilkan sebagai sebuah list yang mirip dengan control ListBox dan memiliki karakteristik (properti, methods, events) yang sebagian besar sama dengan listbox.
  2. penulisan nama item
    • Area penulisan ini memiliki karakteristik (properti, methods, events) yang sebagian besar sama dengan control TextBox.
    • Teks yang di-input akan membuat combobox berusaha mencari dan memilihkan item dari dalam daftar pilihan. Karakteristik pencarian dan pemilihan item yang dilakukan oleh combobox akibat inputan dapat diatur pada properti MatchEntry dan MatchRequired.
Data yang akan digunakan sebagai daftar pilihan dalam combobox adalah seperti gambar berikut :

Properti ListFillRange dan LinkedCell

Bahasan pertama adalah tentang combobox yang diletakkan di dalam sebuah worksheet (misal worksheet bernama list_fill_range). Ketika daftar item yang akan dipasang pada combobox berada di suatu area range, sebut saja pada range A2:A5 (lihat gambar data di atas dan anggap saja data tersebut ada di sheet list_fill_range), maka properti ListFillRange bisa memberi kemudahan. Pengisian daftar item dalam combobox bisa dilakukan dengan mengisi properti ListFillRange. Isi properti ListFillRange adalah alamat area range dari daftar item, seperti menuliskan teks berbunyi A2:A5. Properti dari combobox bisa dimunculkan ketika dalam keadaan Design Mode (lihat di ribbon Developer dan klik Design Mode). Cara menampilkan window properties dari si object adalah dengan klik kanan si object dan pilih Properties.

Setelah daftar terisi dan Design Mode telah di-off-kan, maka user bisa memilih sebuah item dari daftar yang ada. Pilihan user ini bisa dituliskan ke sebuah cell tanpa perlu script VBA dengan memanfaatkan properti bernama LinkedCell. Isian properti LinkedCell juga berupa alamat sebuah range. Misalkan, pada properti LinkCell diisi alamat range berbunyi B10. Setiap kali user memilih sebuah item dari combobox, maka pada cell B10 akan tertulis pilihan user tersebut. Ketika user mengosongkan pilihan atau menulis sesuatu dalam combobox yang tidak ada di dalam daftar, maka cell B10 akan berisi error value #N/A.

Gambar berikut ini adalah cuplikan dari sheet bernama list_fill_range pada file yang disebutkan di atas.

Jadi, properti :
  • ListFillRange : untuk mengisi daftar combobox atau listbox dari suatu area range.
  • LinkedCell : untuk mengikatkan properti Value milik object ke sebuah range.

Multiple Column dan Event Change

Pengaturan yang dilakukan pada properti combobox agar bisa menampilkan banyak kolom informasi tambahan adalah sebagai berikut :
  • ColumnCount : jumlah kolom yang ditampilkan pada list. Jadi, list bisa berisi lebih banyak kolom dibanding yang ditampilkan. Misalkan list berisi 8 kolom, tetapi hanya ditampilkan 5 kolom saja dengan mengisi ColumnCount dengan nilai 5.
  • ColumnHeads : status menampilkan header atau tidak (TRUE/FALSE) ketika sumber data dari suatu area range.
  • ColumnWidths : pengaturan lebar masing-masing kolom dalam satuan point (pt) yang dipisah karakter titik koma ( ; ), seperti 60pt;80pt;80pt untuk 3 kolom yang ditampilkan.
  • ListWidth : lebar list keseluruhan dalam satuan point (pt) ketika dimunculkan atau saat user mengklik dropdown combobox. Jika total lebar setiap kolom lebih dari ListWidth, maka akan dimunculkan horisontal scrollbar, seperti 220pt.
  • BoundColumn : indeks kolom yang akan dijadikan nilai bagi properti Value (base 1 -> kolom ke-1 mendapat nomor indeks kolom 1). Nilai 0 berarti menampilkan nilai ListIndex atau indeks baris item (base 0).
  • TextColumn : indeks kolom yang akan dijadikan nilai bagi properti Text (base 1 dan defaultnya -1 yang berarti sama dengan BoundColumn). Nilai 0 berarti menampilkan nilai ListIndex atau indeks baris item (base 0).
Properti LinkedCell (jika digunakan) hanya bisa mengambil sebuah nilai yang dimiliki oleh properti Value yang terikat dengan kolom yang ditentukan pada properti BoundColumn. Sedangkan jumlah kolom dalam list ada lebih dari satu, maka sangat besar kemungkinan akan menggunakan script VBA untuk mendapatkan nilai dari kolom-kolom yang ada. Beberapa properti yang bermanfaat dalam pengambilan nilai dari kolom-kolom yang ada dalam list sebuah combobox antara lain adalah :
  • ListIndex : indeks baris list yang terpilih dengan nilai -1 yang berarti tidak ada yang terpilih dan nilai 0 sebagai item di baris pertama dalam list (base 0 -> item ke-1 diberi indeks bernilai 0).
  • Text : nilai yang ditampilkan oleh combobox yang berasal dari indeks kolom yang ditentukan pada properti TextColumn (base 1 -> kolom ke-1 dalam list diberi indeks kolom bernilai 1)
  • Value : nilai yang disimpan oleh combobox yang berasal dari indeks kolom yang ditentukan pada properti BoundColumn (base 1).
  • Column( idxcol ) : merujuk pada indeks kolom ke-idxcol (base 0), seperti Column(1) merujuk ke indeks kolom 1 yang berarti merujuk pada kolom ke-2 dalam list.
  • List( idxrow , idxcol ) : merujuk pada baris item dengan indeks baris ke-idxrow (base 0) dan kolom dengan indeks kolom ke-idxcol (base 0). Nilai idxrow pada baris terpilih adalah sebesar nilai properti ListIndex.
Pada saat user memilih sebuah item dari list, maka event yang bekerja adalah event Change. Jadi, jika diharapkan agar setiap user mengganti pilihan akan terjadi suatu proses tertentu seperti penulisan nilai-nilai ke suatu lokasi target, maka event change bisa diisi dengan script VBA tentang alur proses tersebut. Event Change milik combobox dapat dibuat dengan melakukan double click pada object control ketika dalam keadaan Design Mode. Gambar berikut ini adalah cuplikan dari sheet bernama list_fill_range yang menjadi contoh combobox dengan multiple column dan disertai dengan proses penulisan nilai ke suatu range.
Pada gambar, properti ListFillRange diisi dengan A2:C5 dengan jumlah kolom yang ditampilkan adalah 3 (isi ColumnCount) diisi 3. Jadi, sumber data list adalah range A2:C5 (3 kolom) ditampilkan dalam list sebanyak 3 kolom juga (ditampilkan seluruhnya). Properti LinkedCell juga digunakan dengan merujuk ke range B30 yang akan mengambil nilai di kolom ke-2 karena isi properti BoundColumn adalah 2 yang berarti properti Value akan mengambil nilai yang ada di kolom ke-2.

Pemanfaatan event Change milik combobox adalah untuk menulis beberapa informasi tentang nilai-nilai properti tertentu dari item yang terpilih, seperti properti ListIndex yang ditulis pada cell B33, Text pada cell B34 yang nilainya berasal dari kolom ke-1 berdasar isi properti TextColumn yang bernilai 1, Value yang nilainya berasal dari kolom ke-2 dan menghasilkan nilai yang sama dengan cell B30 yang diisi oleh properti LinkedCell. Juga nilai dari kolom ke-3 yang diambil dari list combobox menggunakan properti Column dengan idxcol bernilai 2 (cell B36) atau dengan properti List dengan idxrow senilai dengan nilai properti ListIndex (karena bagian idxrow dikosongkan) dan idxcol bernilai 2 (cell B37).

Prosedur Sub pada event change combobox tersebut berbunyi sebagai berikut :
Private Sub cboProd2_Change()
    'tulis informasi tentang data terpilih
    Range("b33").Value = cboProd2.ListIndex     'ListIndex
    Range("b34").Value = cboProd2.Text          'Text
    Range("b35").Value = cboProd2.Value         'Value
    Range("b36").Value = cboProd2.Column(2)     'Column indeks 2 [base 0]=kolom ke-3
    Range("b37").Value = cboProd2.List(, 2)     'List indeks kolom 2 [base 0]=kolom ke-3
End Sub


ComboBox pada sebuah UserForm

ActiveX Control memang lebih sering digunakan dalam UserForm yang tampak lebih cantik. ComboBox dalam sebuah UserForm juga bisa diisi dengan suatu data yang disimpan pada suatu area range secara mudah melalui pemanfaatan properti RowSource. Properti RowSource pada combobox di dalam UserForm setara dengan properti ListFillRange pada ComboBox yang diletakkan dalam sebuah worksheet. Properti LinkedCell di combobox dalam worksheet setara dengan properti ControlSource pada combobox di dalam sebuah UserForm.

Misalkan dibuat sebuah UserForm bernama frmNomor1 yang diberi combobox dengan nama cboProd. Pada cboProd, diatur dengan properti :
  • RowSource : berisi teks berbunyi list_fill_range!A2:C5
  • ColumnCount : berisi 3
  • ColumnHeads : TRUE
  • BoundColumn : berisi 2
  • ControlSource : berisi teks berbunyi list_fill_range!B57
  • TextColumn : berisi 1
Saat userform ditampilkan, maka cboProd akan berisi daftar yang bersumber dari sheet bernama list_fill_range pada area range A2:C5. Ketika user mengganti pilihan, maka cell B57 di sheet list_fill_range akan terisi dengan nilai dari kolom ke-2 dari list setelah combobox tidak lagi dalam keadaan aktif (kursor telah berpindah ke control lainnya). Hal ini diakibatkan oleh pengaturan properti ControlSource yang merujuk ke range di sheet tersebut. Sedangkan nilai yang diambil oleh ControlSource berasal dari properti Value yang diatur mengikuti isi properti BoundColumn yang merujuk pada kolom ke-2 dari list.

Event change pada cboProd bisa dimanfaatkan untuk menulis ke suatu range ataupun ke control lain saat user mengubah pilihan. Misalkan, saat user mengubah pilihan maka akan terjadi proses penulisan ke range tertentu seperti contoh prosedur sub pada event change cboProd berikut :
Private Sub cboProd_Change()
    'tulis informasi tentang data terpilih
   
    '>> ke worksheet 'Sheet1 (list_fill_range)'
    Sheet1.Range("b61").Value = cboProd.ListIndex   'ListIndex
    Sheet1.Range("b62").Value = cboProd.Text        'Text
    Sheet1.Range("b63").Value = cboProd.Value       'Value
    Sheet1.Range("b64").Value = cboProd.Column(2)   'Column indeks 2 [base 0]=kolom ke-3
    Sheet1.Range("b65").Value = cboProd.List(, 2)   'List indeks kolom 2 [base 0]=kolom ke-3

End Sub

Properti ControlSource juga dimiliki oleh control lain seperti TextBox. Misalnya di frmNomor1 tersebut juga ditambahkan 2 buah textbox. Textbox pertama diberi nama txtBound1 untuk terikat dengan range B57 (yang diisi oleh ControlSource milik combobox) dan textbox kedua diberi nama txtListIndex1 yang terikat dengan range B61. Isi properti ControlSource pada textbox txtBound1 berbunyi list_fill_range!B57 dan pada textbox txtListIndex1 berbunyi list_fill_range!B61. Setiapkali ada perubahan pada cell B57 dan B61, maka textbox juga akan berubah isinya ketika terjadi pembaruan tampilan frmNomor1. Pembaruan tampilan frmNomor1 bisa dipicu dengan mengganti control yang aktif melalui methods SetFocus. Jadi, pada event change milik cboProd juga bisa disertakan proses pembaruan tampilan ini dengan menambahkan baris-baris script berikut yang diletakkan pada bagian tepat sebelum End Sub setelah baris terakhir penulisan yang sudah ada.
    '>> supaya textbox control yang menggunakan properti ControlSource terupdate
    txtBound1.SetFocus      'salah satu control di-set focus
    'jika ingin dikembalikan ke combobox cboProd, maka set focus ke cboprod
    cboProd.SetFocus


Penulisan item terpilih ke control yang ada dalam userform juga bisa dilakukan dengan script VBA dan tanpa properti ControlSource milik control yang menjadi target. Misalnya pada frmNomor1 diberi textbox berikut :
  • txtListIndex : diisi dengan nilai properti ListIndex dari cboProd
  • txtValue : diisi dengan nilai yang disimpan oleh properti Value milik cboProd
  • txtText : diisi dengan nilai yang disimpan oleh properti Text milik cboProd
  • txtCol2 : diisi dengan nilai yang diambil dari kolom ke-3 list yang berindeks kolom senilai 2
maka pada event change milik cboProd bisa tambahkan script penulisan tersebut yang berbunyi :
    '>> ke TextBox di frame fraScript dalam userform frmNomor1
    txtListIndex.Text = cboProd.ListIndex   'ListIndex
    txtValue.Text = cboProd.Value           'Value -> tergantung BoundColumn
    txtText.Text = cboProd.Text             'Text  -> tergantung TextColumn
   
    'mengambil nilai dari kolom tertentu bisa dengan
    'properti Column(indeks kolom) atau properti List( nilai list index , indeks kolom )
    'seperti :
    txtCol2.Text = cboProd.Column(2)        'Column(2) -> column(0) adalah kolom ke-1
    'atau
    txtCol2.Text = cboProd.List(, 2)        'List(,2) -> column(0) adalah kolom ke-1


Berikut ini adalah cuplikan gambar bentuk userform bernama frmNomor1 :
Contoh tampilan hasil penulisan yang dilakukan oleh proses yang ada dalam prosedur sub event change milik cboProd adalah :

Script lengkap dari prosedur sub event change milik cboProd berbunyi :
Private Sub cboProd_Change()
    'tulis informasi tentang data terpilih
   
    '>> ke worksheet 'Sheet1 (list_fill_range)'
    Sheet1.Range("b61").Value = cboProd.ListIndex   'ListIndex
    Sheet1.Range("b62").Value = cboProd.Text        'Text
    Sheet1.Range("b63").Value = cboProd.Value       'Value
    Sheet1.Range("b64").Value = cboProd.Column(2)   'Column indeks 2 [base 0]=kolom ke-3
    Sheet1.Range("b65").Value = cboProd.List(, 2)   'List indeks kolom 2 [base 0]=kolom ke-3
   
    '>> supaya textbox control yang menggunakan properti ControlSource terupdate
    txtBound1.SetFocus      'salah satu control di-set focus
    'jika ingin dikembalikan ke combobox cboProd, maka set focus ke cboprod
    cboProd.SetFocus
   
    '>> ke TextBox di frame fraScript dalam userform frmNomor1
    txtListIndex.Text = cboProd.ListIndex   'ListIndex
    txtValue.Text = cboProd.Value           'Value -> tergantung BoundColumn
    txtText.Text = cboProd.Text             'Text  -> tergantung TextColumn
   
    'mengambil nilai dari kolom tertentu bisa dengan
    'properti Column(indeks kolom) atau properti List( nilai list index , indeks kolom )
    'seperti :
    txtCol2.Text = cboProd.Column(2)        'Column(2) -> column(0) adalah kolom ke-1
    'atau
    txtCol2.Text = cboProd.List(, 2)        'List(,2) -> column(0) adalah kolom ke-1
End Sub


:)

Insya Allah pembahasan tentang combobox akan dilanjutkan pada coretan berikutnya. Pembahasan combobox yang akan dibahas berikutnya antara lain tentang pengisian list dengan script VBA memanfaatkan methods AddItem maupun properti List yang diletakkan pada prosedur sub event initialize userform. Juga dibahas tentang methods Clear untuk menghapus seluruh isi list combobox. Proses pengubahan nilai suatu item dalam list, menghapus sebuah item, menambahkan sebuah item di baris baru ataupun disisipkan pada baris tertentu juga akan dibahas disana. Dampak pengubahan isi list combobox yang memicu dijalankannya event change beserta salah satu cara menghindarinya akan disertakan pada pembahasan tersebut.




Wednesday, February 19, 2014

Permasalahan dengan Data tidak normal: Penyebab dan strategi permasalahan

Data terdistribusi secara normal adalah konsep umum yang sering salah paham oleh beberapa orang. Beberapa orang percaya bahwa semua data yang dikumpulkan dan digunakan untuk analisis harus didistribusikan secara normal. Tapi distribusi normal tidak terjadi sesering orang pikirkan , dan itu bukan tujuan utama . Distribusi normal adalah sarana untuk mencapai tujuan , bukan tujuan itu sendiri .

Data terdistribusi secara normal diperlukan untuk menggunakan sejumlah alat statistik , seperti analisis regresi, analisis Cp / Cpk , uji-t, analisis varians ( ANOVA ) dan masih banyak lagi. Jika seorang praktisi tidak menggunakan alat khusus seperti itu, bagaimanapun , tidak penting apakah data terdistribusi secara normal . Distribusi menjadi masalah hanya ketika praktisi mencapai suatu titik dalam sebuah proyek di mana mereka ingin menggunakan alat statistik yang memerlukan data terdistribusi normal dan mereka tidak memilikinya .
data tidak normal

Probabilitas plot pada Gambar di atas adalah contoh dari uji normalitas. Dalam hal ini , asumsi normalitas jelas tidak dapat terpenuhi, nilai p kurang dari 0,05 dan lebih dari 5 persen dari titik data berada di luar interval kepercayaan 95 persen .

Apa yang bisa dilakukan? Pada dasarnya, ada dua pilihan :

  1. Mengidentifikasi dan, jika mungkin, menentukan alasan data tidak normal dan mengatasinya atau
  2. Gunakan alat yang tidak memerlukan asumsi normalitas

Mengidentifikasi alasan data tidak normal

Ketika data tidak terdistribusi normal , penyebab non - normalitas harus ditentukan dan tindakan perbaikan yang tepat harus diambil . Ada enam alasan yang sering dialami untuk data tidak normal .

Alasan 1 : Data Ekstrim

Terlalu banyak nilai-nilai ekstrim dalam satu set data yang akan menghasilkan distribusi skewness(miring). Normalitas data dapat dicapai dengan menghilangkan data tersebut. Hal ini kemungkinan terjadi karena kesalahan menentukan pengukuran, kesalahan data-entry dan outlier dan untuk mengatasinya dengan menghapus data tersebut dari data yang digunakan untuk alasan yang masuk akal.

sangatlah penting bahwa outlier diidentifikasi sebagai penyebab yang benar-benar membuat data tidak normal sebelum mereka dieliminasi . Jangan lupa : Sifat data terdistribusi normal adalah bahwa kecil persentase dari nilai-nilai ekstrim yang diharapkan, tidak setiap outlier disebabkan oleh alasan khusus.

Alasan 2 : Tumpang tindih dari Dua atau Lebih Proses

Data tidak dapat terdistribusi secara normal karena sebenarnya berasal dari lebih dari satu proses , penjumlahan atau pergeseran, atau dari sebuah proses yang sering bergeser . Jika dua atau lebih set data yang terdistribusi secara normal yang tumpang tindih, data mungkin terlihat bimodal atau multimodal - itu akan memiliki dua atau lebih nilai yang paling sering terjadi.

Tindakan perbaikan untuk situasi ini adalah untuk menentukan X penyebab bimodal atau distribusi multimodal dan kemudian stratifikasi data . Data harus diperiksa lagi untuk normalitas dan setelah proses stratified dapat bekerja secara terpisah .

Gambar berikut menunjukkan data waktu akses website yang memiliki  data tidak normal pada sebuah website.
Website Load Time Data


Setelah stratifikasi waktu akses website antara akhir pekan dibandingkan Data hari kerja, menunjukkan kedua kelompok berdistribusi normal. sehingga bisa dijadikan perimbangan dalam analisis data yang akan.
hasil stratifikasi

Alasan 3 : Kurangnya data Diskriminasi

Round- off error atau perangkat pengukuran dengan resolusi rendah dapat membuat benar-benar data continues dan data terdistribusi normal terlihat diskrit dan tidak normal . Kurangnya data diskriminasi dan karena terbatasnya jumlah nilai yang berbeda - dapat diatasi dengan menggunakan sistem pengukuran yang lebih akurat atau dengan mengumpulkan lebih banyak data.

Alasan 4 : Data yang diurutkan

Data yang dikumpulkan tidak mungkin terdistribusi normal jika itu merupakan hanya bagian dari seluruh data dalam suatu proses. Hal ini dapat terjadi jika data dikumpulkan dan dianalisis setelah penyortiran. Data pada Gambar dibawah diperoleh dari proses produksi botol di mana target adalah untuk menghasilkan botol dengan volume 100 ml . Spesifikasi minimal dan maksimal yang dapat diterima adalah 97,5 ml dan 102,5 ml dan di luar spesifikasi tersebut dihapus dari proses analisis. Sehingga terlihat pada gambar dibawah ini. Dari data tersebut tentunya data tidak terdistribusi normal karena hanya sebagian yang dimasukkan yaitu yang masuk dalam spesifikasi.
sorted data

Alasan 5 : Nilai Mendekati Nol

Jika proses memiliki banyak nilai mendekati nol, distribusi data akan miring (skewness) ke kanan atau kiri. Dalam hal ini, transformasi seperti tenaga transformasi Box - Cox, dapat membantu membuat data normal. Dalam metode ini , semua data dinaikkan , atau diubah , dengan eksponen tertentu , ditunjukkan dengan nilai Lambda . Ketika melakukan transformasi, semua data harus dilakukan perlakuan (diubah) yang sama.

Gambar di bawah ini menggambarkan contoh dari konsep ini. Gambar menunjukkan satu set data siklus - waktu;
limited zero

menunjukkan data yang sama diubah setelah dilakukan transformasi dengan logaritma natural.
transformation box cox
Untuk bahasan transformasi box cox silahkan ke link "transormasi box cox"

Perhatikan : Metode transformasi tidak memberikan jaminan distribusi normal . Selalu periksa dengan uji normalitas untuk menentukan apakah distribusi normal dapat diterpenuhi setelah transformasi .

Alasan 6 Data Mengikuti Distribusi Berbeda

Ada banyak tipe data yang mengikuti distribusi non-normal. Contoh berikut:
  • Distribusi Weibull , ditemukan dengan data survival seperti waktu kelangsungan hidup suatu produk
  • Distribusi log - normal, ditemukan dengan panjang data seperti ketinggian
  • Distribusi Largest-extreme-value, ditemukan dengan data seperti waktu terpanjang down setiap hari
  • Distribusi eksponensial, ditemukan dengan data pertumbuhan seperti pertumbuhan bakteri
  • Distribusi Poisson, ditemukan dengan peristiwa langka seperti jumlah kecelakaan
  • Distribusi binomial, ditemukan dengan " proporsi " data seperti persen barang cacat
Jika data berikut salah satu distribusi yang berbeda , harus ditangani dengan menggunakan alat dengan menggunakan disribusi yang sama.

Alat analisis yang tidak mensyaratkan data normal

Beberapa alat statistik tidak memerlukan data terdistribusi normal . Untuk membantu para praktisi memahami kapan dan bagaimana alat ini dapat digunakan , tabel di bawah ini menunjukkan perbandingan alat yang tidak memerlukan distribusi normal dengan setara - distribusi normal.

Perbandingan alat analisis untuk data berdistribusi normal dan tidak normal
Alat analisis yang menggunakan data normalAlat analisis untuk data tidak normalDistribusi yang diperlukan
T-testMann-Whitney test; Mood’s median test; Kruskal-Wallis testAny
ANOVAMood’s median test; Kruskal-Wallis testAny
uji t berpasanganOne-sample sign testAny
F-test; Bartlett’s testLevene’s testAny
Analisis regresianalisis regresi non parametrikAny
Cp/Cpk analysisCp/Cpk analysisWeibull; log-normal; largest extreme value; Poisson; exponential; binomial

Tuesday, February 11, 2014

[Tutorial Eviews] Error Correction Mechanism (ECM)

Pada postingan sebelumnya suda dijelaskan beberapa hal mengenai Error Correction Mechanism (ECM). Nah, pada post ini akan dipaparkan praktek eviews, tahap-tahap ECM yang sudah dijelaskan sebelumnya di Teori ECM. Untuk tutorial, silahkan download datanya di sini.
Lebih jelas mengenai praktek tahap-tahap ECM tersebut dalam eviews adalah sebagai berikut:

I. Pengecekan Stasioneritas

Hal penting yang harus diingat ketika menganalisis data time series adalah mengutamakan pengecekan stasioneritas datanya sebelum diproses lebih lanjut (lebih detail mengenai uji stasioneritas menggunakan eviews bisa dilihat di postingan ini).
Khusus untuk metode ECM, pastikan seluruh variabel yang digunakan, tidak ada yang stasioner pada Level. Oleh karena itu, tahap pertama dalam tutorial ini adalah menguji stasioneritas seluruh variabel. Supaya lebih memudahkan, stasioneritasnya tidak usah dicek satu-satu tapi secara bersamaan. Caranya, pada Workfile ECM, block semua variabel yg ingin digunakan, klik kanan lalu pilih Open > as Group. Setelah itu akan muncul tampilan seperti gambar di bawah:
data lengkap

Selanjutnya, pada window baru, klik View > Unit Root Test, dan kemudian akan muncul window dengan nama "Group Unit Root Test" seperti gambar di bawah. Untuk tahap awal, set tipe data ke Level.
ecm option

Untuk uji stasioneritas kumpulan variabel ini, yang berbeda dengan 1 variabel adalah Test Type-nya (kotak hijau). Supaya stasioneritas masing-masing variabel bisa dicek, pilih Test Type yang ada kata "Individual..."-nya. Setelah itu klik OK, yang lain tidak usah diubah.
Berikutnya akan muncul window yang berisi output seperti:
philips perron


Bagian yang perlu diperhatikan adalah kolom Probability yang posisinya paling bawah output. Karena hasil pengujian yang diinginkan adalah seluruh variabel tidak stasioner pada Level, nilai probabilitas masing-masing variabel harus lebih besar dari alpha yang ditetapkan.
Misalnya kita pakai alpha=0.05, karena semua nilainya memang lebih besar dari 0.05, semua variabel tidak ada yg stasioner pada Level dan penerapan metode ECM, boleh dilanjutkan.
Agar lain kali bisa langsung dilihat, jangan lupa outputnya disimpan. Caranya, klik Freeze, setelah itu akan muncul window baru yang tampilannya sama. Di window baru, klik Name, terserah teman2 outputnya mau dinamai apa. Output yang disimpan tadi akan muncul sebagai objek baru dengan simbol simbol tabel
Untuk output2 berikutnya, kalau mau disimpan, silahkan pakai cara tersebut.

Kalau sudah dipastikan tidak ada yang stasioner di Level, ulangi langkah uji stasioneritasnya tapi dengan data 1st difference (gambar 2). Untuk contoh yg saya berikan, semua variabelnya stasioner pada tahap ini (difference pertama), sehingga pada output berikutnya, nilai kolom Probability semua variabel berada di bawah 0.05.
philips perron difference

Misalkan saja ada kasus dimana 1 saja variabel tidak stasioner pada difference pertama seperti yg lain, maka kita harus men-difference-kan semua variabel lagi ke 2nd difference dan seterusnya, sampai semuanya stasioner.

II. Estimasi persamaan jangka panjang

Variabel-variabel yang ingin digunakan dan telah memenuhi syarat pada tahap 1, pada tahap ini akan dibuat persamaan regresinya, dengan Y sebagai variabel terikat sedangkan sisanya, semua sebagai variabel bebas. Kembali ke Workfile ECM, block lagi semua variabelnya pilih Open > as Equation..., setelah itu akan akan muncul window tempat kita mengisi persamaan. Tulis persamaannya persis seperti gambar di bawah:

Pilihan yang lain tidak perlu diubah, setelah tulis persamaan langsung klik OK. Berikutnya akan muncul output yang berisi estimasi dari koefisien2 tiap variabel bebas. Perhatikan nilai2 signifikansi yang dilingkari pada gambar di bawah:
output ecm


Cek nilai F-statistic (kotak hijau) lebih dulu, kalau memang sudah lebih kecil dari alpha (0.05), barulah bisa kita cek nilai signifikansi masing2 variabel (kotak biru). Signifikansi masinng2 variabel tidak harus semuanya berada di bawah 0.05, kalau di dalam suatu penelitian, hal tersebut tergantung pada kajian teorinya. Namun, apabila nilai probabilitas suatu variabel bebas berada di bawah 0.05, maka variabel bebas tersebut dikatakan berpengaruh terhadap variabel terikatnya.

III. Pengecekan Kointegrasi

Pada teori mengenai ECM sebelumnya telah dijelaskan bahwa kointegrasi suatu persamaan regersi dapat dilihat dari residualnya. Apabila residual stasioner, terdapat kointegrasi.
Pada workfile ECM ada variabel dengan nama resid, yang merupakan tempat menyimpan residual persamaan yang baru saja diestimasi, sehingga nilainya berubah-ubah. Padahal residual persamaan jangka panjang, akan diuji stasioneritasnya dan digunakan sebagai variabel pada persamaan berikutnya. Oleh karena itu, langsung setelah estimasi persamaan jangka panjang, kita harus menyimpa residualnya dalam bentuk variabel baru yang tetap. Caranya adalah meng-generate variabel baru yg nilainya sama dengan variabel resid. Misal kita buat variabel baru tersebut dengan nama res menggunakan perintah seperti gambar di bawah lalu klik enter:

kointegrasi
Variabel baru dengan nama res tersebut kemudian kita uji stasioneritasnya seperti pada langkah pertama, klik kanan di variabelnya, Open, di window baru pilih View > Unit root test, pilih tipe data Level  lalu klik OK. Apabila kolom Prob* berisi nilai di bawah alpha (0.05), maka kita bisa lanjut ke estimasi persamaan jangka pendek.
output kointegrasi


Output di atas memberikan informasi bahwa variabel res stasioner pada Level, dan secara tersirat menyatakan bahwa Y, X1, X2, X3, X4, X5, dan X6 sailing berkointegrasi.

IV. Estimasi persamaan jangka pendek

Pada tahap ini, buat lagi persamaan regresi menggunakan variabel-variabel sebelumnya (tapi yg sudah distasionerkan) ditambah variabel res (tahun sebelumnya). Caranya, munculkan lagi window untuk memasukkan persamaan dengan memilih "Estimation Equation..." yang ada pada menu Quick (paling atas). Setelah itu akan muncul tampilan:
estimasi jangka pendek

Karena variabel Y, X1, X2, X3, X4, X5, dan X6 stasioner pada difference pertama, gunakan transformasi variabel-variabel tersebut ke bentuk difference pertama dalam persamaan. Jangan lupa menyertakan variabel res(-1) yg merupakan residual pada tahun sebelumnya. Tuliskan persamaan persis seperti pada kotak merah gambar di atas lalu klik OK. Setelah itu akan muncul output sepert ini:
hasil jangka pendek

Untuk persamaan jangka pendek, pertama-tama pastikan nilai probabilitas F-statistic berada di bawah alpha (0.05). Setelah itu, cek speed of adjustment-nya (koefisien dari res(-1)). Nilai koefisien tersebut harus negatif dan signifikan (probabilitasnya berada di bawah 0.05). Barulah kemudian kita cek probabilitas masing-masing variabel, yg mana saja yang nilainya signifikan atau berada di bawah alpha (0.05), sama seperti pada persamaan jangka panjang.

V. Pengecekan Asumsi

Tahap ini sebenarnya adalah tahap yang harus ada untuk semua metode yang menggunakan regresi dalam proses analisisnya. Pada bagian teori ECM juga hanya disinggung sedikit karena nanti akan dibahas satu-satu beserta tutorialnya pada postingan yang berbeda.

VI. Interpretasi

Setelah seluruh tahap-tahap ECM terpenuhi kita mendapatkan 2 persamaan yang menjadi inti dari digunakan metode ini. Dari sinilah pengaruh variabel-variabel bebas terhadap variabel terikat yang ingin kita teliti, dapat dijelaskan.
Berdasarkan output persamaan jangka panjang, didapatkan:

Yt = -8.0993 + 0.7422 X1t* - 0.3207 X2t* + 0.9738 X3t* + 0.4464 X4t - 0.1172 X5t* - 0.0253 X6t

ket : (*) --> variabel yang signifikan (<0.05)
        (t) --> periode atau tahun 


Persamaan ini hanya dapat memberikan kita informasi bahwa dalam jangka panjang, X1, X2, X3, dan X5 berpengaruh signifikan terhadap Y.
Sedangkan dari output persamaan jangka pendek, didapatkan:

ΔYt = 0.0025 + 0.4157 ΔX1t* - 0.3156 ΔX2t* + 1.0558 ΔX3t* + 0.0816 ΔX4t - 0.0739 ΔX5t* - 0.0741 ΔX6t - 0.6899 RESt-1

Persamaan tersebut memberikan kita informasi bahwa dalam jangka pendek, X1, X2, X3, dan X5 berpengaruh signifikan terhadap Y.
  1. Kenaikan perubahan X1 sebesar 1 unit akan menyebabkan kenaikan perubahan Y sebesar 0.42 unit,
  2. Kenaikan perubahan X2 sebesar 1 unit akan menyebabkan penurunan perubahan Y sebesar 0.32 unit,
  3. Kenaikan perubahan X3 sebesar 1 unit akan menyebabkan kenaikan perubahan Y sebesar 1.06 unit, dan
  4. Kenaikan perubahan X5 sebesar 1 unit akan menyebabkan penurunan perubahan Y sebesar 0.07 unit
Berdasarkan nilai speed of adjustment, ada sebesar 69% ketidakseimbangan, pada pengaruh jangka pendek X1, X2, X3, X4, X5, dan X6 terhadap Y, yg terkoreksi setiap periodenya.