Coretan Mr. Kid
Selesai satu urusan, kerjakan urusan lainnya dengan sungguh-sungguh
Bahasan kali ini adalah tentang tipe data (datatype), variabel, dan konstanta. Pemrograman tidak akan bisa lepas dari penggunaan variabel ataupun konstanta. Sulit sekali menggunakan variabel ataupun konstanta secara efisien jika tidak mengenal datatype.
Bahasan kali ini tampaknya akan lebih mudah dipahami jika mencoba langsung dikomputer. File yang bisa dijadikan media uji coba bisa dibuat sendiri atau mengunduh file BelajarVBA003.xlsm yang ada disini.
Datatype
Apa yang dapat dapat dimengerti oleh manusia tentang nilai-nilai seperti '123,000,000.25' atau '99%' atau 'Sabtu, 22 Juni 2013' atau 'A' ? Yang paling sederhana, manusia akan mengatakan bahwa 123,000,000.25 adalah angka yang memiliki 2 digit dibelakang koma. Nilai 99% akan dikatakan sebagai angka persentase sesuatu. Sedangkan 'Sabtu, 22 Juni 2013' adalah suatu tanggal tertentu. Untuk nilai 'A', manusia bisa mengatakan bahwa itu adalah sebuah huruf yang bisa menjadi kata atau bahkan kalimat ketika bersama huruf-huruf lain.Di alam bawah sadarnya, manusia sebenarnya sedang mengelompokkan nilai-nilai yang dilihatnya seperti nilai-nilai di atas tadi. Dari pengelompokan itu, manusia bisa mengetahui apa yang bisa dan apa yang tidak bisa dilakukan antar nilai tersebut. Misal, manusia segera tahu bahwa nilai 'Sabtu, 22 Juni 2013' tidak bisa dikalikan dengan nilai '99%'. Bahkan manusia bisa mengetahui juga bahwa tidak akan ada nilai '34 Juni 2013', karena Juni 2013 hanya sampai '30 Juni 2013' sedangkan 4 angka setelah 30 dari '34 Juni 2013' harus ditulis sebagai '4 Juli 2013'. Jika manusia kemudian diberi nilai '35.72%' pun akan segera tahu bahwa nilai tersebut seperti nilai '99%', yaitu sebagai angka persentase sesuatu.
Komputer tidak memiliki kemampuan seperti yang terjadi dialam bawah sadar manusia tersebut. Untuk itulah dibentuk datatype. Jadi, secara garis besar, datatype adalah sebuah karakteristik dari suatu nilai data yang memberikan informasi bagi komputer agar bisa mengetahui :
- cara menggunakan nilai data tersebut
- batasan-batasan penyusunan pengelompokan nilai data
- cara menyimpannya dalam memori komputer
Gambar di atas bisa digunakan untuk membantu menentukan datatype suatu nilai data. Jika data berisi :
- TRUE atau FALSE -> gunakan Boolean
- Angka selalu pasti bilangan bulat -> gunakan :
- Byte bila antara 0 sampai 255
- Integer bila antara -32,768 sampai 32,767 atau maksimal 4 digit
- Long bila antara -2,147,483,648 sampai 2,147,483,647 atau maksimal 9 digit
- Angka memiliki jumlah digit yang harus dijaga tepat apa adanya dan bisa berupa pecahan -> gunakan :
- Currency bila berupa nilai uang dengan ketepatan 4 digit dibelakang koma atau maksimal 14 digit
- Variant bila nilai tidak boleh berubah (apa adanya) yang bisa mencapai 28 digit agar bisa diisi nilai bertipe Decimal (tipe data diwarna merah)
- Angka tidak harus dijaga ketepatan jumlah digitnya dan bisa berupa pecahan -> gunakan Single atau Double karena keduanya memiliki rentang yang sangat luas
- Tanggal saja atau waktu saja atau tanggal disertai waktu -> gunakan Date
- Teks atau setidaknya ada 1 karkater yang bukan angka -> kondisi :
- bila jumlah karakter tidak tetap maka gunakan String dengan deklarasi biasa
- bila jumlah karakter harus dijaga tetap N karakter maka gunakan String dengan deklarasi String * Jumlah_karakter
- Object (benda) -> kondisi :
- bila tahu nama objectnya, gunakan nama objectnya (misal range, worksheet, pivottable, dsb)
- bila tidak tahu nama objectnya, gunakan kata Object
- Elemen array untuk kegiatan perulangan (loop) -> gunakan Variant karena bisa berubah menjadi datatype sesuai datatype si elemen array
- Tidak pasti datatype-nya (hal ini harus dihindari) -> gunakan Variant karena bisa berubah menjadi datatype sesuai dengan nilai datanya.
- Jika nilai data yang akan disimpan melebihi batas datatype yang ditentukan atau malah berbeda datatype-nya, maka akan menghasilkan error
- Penulisan number dalam VBA selalu menggunakan format English atau menggunakan karakter titik ( . ) sebagai tanda desimal
- Penulisan date dalam VBA sebaiknya menggunakan format universal YYYY-MM-DD HH:mm:ss meskipun VBA kadang kala mengubah formatnya menjadi yang digunakannya
- VB/VBA akan berusaha mengkonversi datatype inputan menjadi sesuai dengan yang dideklarasikan
- Untuk dapat menggunakan datatype Decimal, maka variabel atau prosedur jenis function harus menggunakan datatype Variant yang diisi dengan menggunakan fungsi CDec.
Variabel
Variabel adalah nama lokasi penyimpanan data tertentu, yang memiliki datatype tertentu, di dalam memori komputer dengan kemampuan read (baca atau ambil nilainya) dan write (tulis atau ubah nilai yang tersimpan). Cara mendeklarasikan variabel adalah :scope nama_variabel AS datatype
contoh :
Public sNamaCust As String
Public lQtyJual As Long, lQtyStock As Long
Private dtTglTransaksi As Date
Pemberian prefix yang mencerminkan datatype yang digunakan, seperti s atau str untuk datatype String, i atau int untuk datatype Integer, dan sebagainya adalah salah satu kaidah yang disepakati kebanyakan pemrogram. Secara umum, nama variabel diawali dengan huruf dan bersifat unique.
Mengisi nilai ke dalam variabel (mengubah nilai) dilakukan dengan meletakkan variabel secara mandiri disisi kiri tanda sama dengan dalam sebuah baris kode program. Kaidah ini juga berlaku untuk pengubahan sebuah nilai properti dari suatu object. Syntax pengisian nilai ke dalam variabel adalah :
- Selain variabel ber-datatype object
- Khusus variabel ber-datatype object
Ekspresi nilai yang akan disimpan bisa berupa sebuah nilai tetap, nilai dari suatu variabel atau properti, proses komputasi, nilai balik dari suatu fungsi. Pengisian variabel ber-datatype object harus didahului dengan keyword Set.
Contoh mengisi variabel dengan suatu nilai tetap : (fokus pada biru)
Public Sub VariabelDiisiNilaiTetap()
Dim bStatus As Boolean
Dim btGrup As Byte, iItem As Integer, lRow As Long
Dim curJual As Currency, decDesimal As Variant
Dim sngSingle As Single, dblDouble As Double
Dim dtTgl As Date, dtJam As Date, dtTglJam As Date
Dim sNama As String, sID As String, sInfo As String
Dim sSelalu7Char As String * 7
Dim rngData As Range
'isi variabel dengan nilai tetap
bStatus = True
btGrup = 13
iItem = 4700
lRow = 89000
curJual = 120000.2571535
'fungsi CDec digunakan untuk membuat datatype Variant menjadi Decimal
decDesimal = CDec("12345678901234567.12345678901")
'sekedar pesan
MsgBox "Datatype CURRENCY" & vbCrLf & "curJual diisi 120000.2571535" & vbCrLf & _
"secara real berisi nilai " & curJual & vbCrLf & vbCrLf & "Datatype DECIMAL" & vbCrLf & _
"decDesimal diisi nilai 12345678901234567.12345678901" & vbCrLf & "secara real berisi nilai " & _
decDesimal & vbCrLf & "decDesimal dideklarasikan ber-datatype : Variant" & vbCrLf & _
"decDesimal berubah menjadi ber-datatype : " & TypeName(decDesimal)
sngSingle = 5765.123456782
dblDouble = 5765.123456782
'sekedar pesan
MsgBox "Datatype SINGLE" & vbCrLf & "sngSingle diisi nilai 5765.123456782" & vbCrLf & _
"secara real berisi nilai " & sngSingle & vbCrLf & vbCrLf & "jika sngSingle ditambah 0.0006" & _
vbCrLf & "akan menjadi " & sngSingle + 0.0006 & vbCrLf & vbCrLf & "Datatype DOUBLE" & vbCrLf & _
"dblDouble diisi nilai 5765.123456782" & vbCrLf & "secara real berisi nilai " & dblDouble & _
vbCrLf & vbCrLf & "jika dblDouble ditambah 0.0006" & vbCrLf & "akan menjadi " & dblDouble + 0.0006
dtTgl = #6/22/2013# 'dari tulisan #2013-06-22#
dtJam = #5:30:00 PM# 'dari tulisan #17:30#
dtTglJam = #6/22/2013 5:30:00 PM# 'dari tulisan #2013-06-22 17:30#
'input string selalu diapit petik dua
sNama = "Kid"
sID = "9877-234-7733-12-25412-1" 'ada 24 karakter, 19 angka dan 5 dash
'menulis "Jamrud" dalam data string
'setiap karakter petik dua harus ditulis dua kali ( "" )
sInfo = "Indonesia ""Jamrud"" Khatulistiwa"
'sekedar pesan
MsgBox "Datatype STRING" & vbCrLf & "jenis : Variable Length" & vbCrLf & "sNama berisi teks berbunyi '" & sNama & _
"'" & vbCrLf & "sID berisi teks berbunyi '" & sID & "'" & vbCrLf & "sInfo berisi teks berbunyi '" & sInfo & "'"
'fixed length 7 char hanya diisi 3 char,
'maka 4 char sisanya diisi spasi dengan nomor ASCII 32
sSelalu7Char = "123"
'sekedar pesan
MsgBox "Datatype STRING" & vbCrLf & "jenis : Fixed Length" & vbCrLf & "deklarasi :" & vbCrLf & vbTab & _
"Dim sSelalu7Char As String * 7" & vbCrLf & "arti : selalu berisi 7 karakter" & vbCrLf & _
"sSelalu7Char diisi teks berbunyi '123' (3 karakter)" & vbCrLf & "secara real akan berisi teks berbunyi '" & _
sSelalu7Char & "'" & vbCrLf & "dengan jumlah karakter adalah " & Len(sSelalu7Char) & " karakter"
'mengisi ber-datatype object selalu butuh keyword Set
Set rngData = Range("a1:c2,a5:a7,d1:f1,a1")
End Sub
Beberapa hal yang perlu diperhatikan dalam contoh-contoh di atas adalah :
- Penulisan suatu nilai tetap berupa number tidak perlu menyertakan pemisah ribuan
- Penulisan suatu nilai tetap untuk yang ber-datatype Date harus diapit karakter ( # )
- Penulisan suatu nilai tetap untuk yang ber-datatype String harus diapit karakter petik dua ( " )
- Penulisan setiap karakter petik dua di dalam nilai tetap teks harus ditulis sebanyak 2 (dua) kali ( "" )
Contoh mengisi variabel dengan suatu nilai dari variabel atau properti lain :
(fokus pada biru)
Public Sub VariabelDiisiDariVariabelLain()
Dim lSumber As Long, lTarget As Long
Dim sAwal As String, sAkhir As String
Dim rngData As Range, rngOutput As Range
'isi nilai tetap
lSumber = 10
sAwal = "Kid"
Set rngData = Range("b2")
'isi nilai dari variabel lSumber dan sAwal yang juga
'sebagai contoh membaca nilai dari variabel lain,
'yaitu dari lSumber, sAwak, dan rngData
lTarget = lSumber 'lTarget akan bernilai 10
sAkhir = sAwal 'sAkhir akan bernilai Kid
Set rngOutput = rngData 'rngOutput akan berisi Range("b2")
'-------------------------------------
'isi nilai dari suatu proses komputasi
'-------------------------------------
'lTarget akan berisi 15, yaitu lSumber + 5 = 10 + 5 = 15
lTarget = lSumber + 5
'sAkhir akan berisi Kid Belajar VBA, yaitu
'sAwal disambung dengan teks berbunyi ' Belajar VBA'
sAkhir = sAwal & " Belajar VBA"
'--------------------------------------------------------------
'isi nilai dari dirinya yang lama yang dikenai proses komputasi
'untuk menghasilkan nilai dirinya yang baru
'--------------------------------------------------------------
'lTarget bernilai 25, yaitu
'lTarget yang lama (bernilai 15 hasil lSumber + 5)
'ditambah dengan nilai
'lSumber (bernilai 10 dari baris lSumber = 10)
lTarget = lTarget + lSumber
'sAkhir bernilai teks yang berbunyi 'KidKid Belajar VBA',
'yaitu 'Kid' (dari sAwal = "Kid")
'diimbuhi teks dari sAkhir yang lama
'yang bernilai teks berbunyi 'Kid Belajar VBA'
'(baris sAkhir = sAwal & " Belajar VBA")
sAkhir = sAwal & sAkhir
End Sub
Variant
Hal-hal yang perlu diketahui tentang datatype Variant antara lain :- Datatype Variant adalah datatype default dalam VB/VBA.
- Setiap deklarasi variabel atau prosedur Function yang tidak menegaskan datatype-nya akan menjadi ber-datatype Variant.
- Datatype Variant membutuhkan ruang memori yang luas (minimal 16 byte).
- Datatype Variant akan selalu mengikuti datatype yang sesuai dengan nilai yang disimpannya.
- Proses yang didalamnya memanfaatkan datatype Variant relatif lebih lambat dibanding yang memanfaatkan datatype yang sesuai yang selain Variant.
- & untuk datatype Long
- @ untuk datatype Currency
- ! untuk datatype Single
- # untuk datatype Double
Public Sub LiteralVariabelVariant()
Dim vLong As Variant, vCur As Variant
Dim vSingle As Variant, vDouble As Variant
'menggunakan literal datatype
vLong = 5762&
vCur = 5762@
vSingle = 5762!
vDouble = 5762#
'sekedar pesan
MsgBox "Datatype VARIANT" & vbCrLf & "vLong dari Variant menjadi " & TypeName(vLong) & vbCrLf & _
"vCur dari Variant menjadi " & TypeName(vCur) & vbCrLf & "vSingle dari Variant menjadi " & _
TypeName(vSingle) & vbCrLf & "vDouble dari Variant menjadi " & TypeName(vDouble)
End Sub
Pada umumnya, penentuan datatype pada variabel ber-datatype variant adalah dengan menggunakan fungsi-fungsi konversi datatype seperti CBool, CByte, CInt, CLng, CCur, CDec, CSng, CDbl, CDate, CStr, CVar, CVErr, dan CType. Fungsi-fungsi ini bisa digunakan untuk nilai tetap maupun untuk nilai dari suatu ekspresi lainnya. Contohnya seperti penggunaan CDec untuk membentuk datatype Decimal.
Variabel dengan datatype variant akan memiliki isi Empty ketika pertama kali terbentuk. Jika kemudian datatype-nya telah berubah, maka nilai kosongnya adalah 0 untuk perubahan ke datatype jenis numerik dan berupa nilai NULLSTRING ( "" ) untik perubahan ke datatype jenis text. Variabel ber-datatype variant bisa menyimpan nilai NULL (tidak terdefinisi) ketika digunakan sebagai wadah untuk menampung data dari database yang bisa berupa NULL. Selain itu, variabel ber-datatype variant juga bisa menerima datatype khusus bernama error hasil fungsi CVErr. Konstanta CVErr untuk menghasilkan Excel error value adalah :
- xlErrNull -> #NULL!
- xlErrDiv0 -> #DIV/0!
- xlErrValue -> #VALUE!
- xlErrRef -> #REF!
- xlErrName -> #NAME?
- xlErrNum -> #NUM!
- xlErrNA -> #N/A
'error value xlErrValue (setara 2015)
'akan menghasilkan nilai Error 2015 (description)
'berupa #VALUE! bila ditampilkan di sebuah cell
Dim vXLErr As Variant
vXLErr = CVErr(xlErrValue)
Kesalahan dalam deklarasi variabel
Satu baris deklarasi variabel bisa digunakan untuk mendeklarasikan banyak variabel. Misal ingin mendeklarasikan 2 buah variabel, katakanlah iNilai1 dan iNilai2, yang ber-datatype Integer. Kesalahan deklarasi yang sering terjadi adalah :Dim iNilai1, iNilai2 As Integer
karena sebenarnya variabel Nilai1 akan memiliki datatype Variant dan variabel Nilai2 memiliki datatype Integer. Jadi hanya variabel Nilai2 yang sesuai keinginan. Jalankan prosedur berikut ini untuk membuktikannya : (fokus pada biru)
Public Sub KesalahanDeklarasi()
Dim iNilai1, iNilai2 As Integer
iNilai1 = 123.45678
iNilai2 = 123.45678
MsgBox "Deklarasi variabel :" & vbCrLf & vbTab & "Dim iNilai1, iNilai2 As Integer" & vbCrLf & vbCrLf & _
"iNilai1 dan iNilai2 diisi nilai yang sama," & " yaitu 123.45678" & vbCrLf & vbCrLf & "iNilai1 ber-datatype " & _
TypeName(iNilai1) & " dengan nilai " & iNilai1 & vbCrLf & "iNilai2 ber-datatype " & TypeName(iNilai2) & _
" dengan nilai " & iNilai2
End Sub
Static
Keyword Static adalah sebuah statement yang dikhususkan untuk variabel dengan scope level Procedure. Tujuannya untuk memperpanjang usia pakai variabel. Seperti dibahas dalam kisah tentang keyword Dim, usia pakai variabel dengan scope level Procedure akan dibuang dari memori komputer ketika prosedur tersebut telah selesai diproses. Penggunaan keyword Static untuk menggantikan keyword Dim akan mencegah variabel tersebut dibuang dari memori ketika prosedur tempat tinggalnya selesai diproses. Hal ini bisa berguna untuk proses yang membutuhkan nilai dari proses terakhir, seperti membuat counter. Jalankan prosedur berikut ini lebih dari satu kali : (fokus pada biru)Public Sub PakaiVariabelStatic()
Dim lUmurPendek As Long
Static lPanjangUmur As Long
lUmurPendek = lUmurPendek + 5
lPanjangUmur = lPanjangUmur + 5
MsgBox "Nilai lUmurPendek sekarang " & lUmurPendek & vbCrLf & "Nilai lPanjangUmur sekarang " & lPanjangUmur
End Sub
Jika seluruh variabel dalam sebuah prosedur akan dibuat static seluruhnya, maka keyword Static diletakkan pada baris deklarasi prosedur. Seluruh variabel dideklarasikan dengan keyword Dim. Jalankan prosedur berikut ini berulang kali : (fokus pada biru)
Public Static Sub SemuaVariableStatic()
Dim lUmur As Long, lNilai As Long
lUmur = lUmur + 5
lNilai = lNilai + 5
MsgBox "Nilai lUmur sekarang adalah " & lUmur & vbCrLf & "Nilai lNilai sekarang adalah " & lNilai
End Sub
Cara me-reset variabel-variabel static adalah dengan menu Run pilih Reset dari VBE. Jika melalui kode program, maka dibutuhkan variabel dengan scope level Module yang bertugas sebagai status penghapusan. Kemudian sebuah prosedur bertugas untuk mengubah nilai variabel status penghapusan tersebut, yang disertai dengan menjalankan prosedur yang berisi variabel static yang akan di-reset. Variabel static harus dibuat bekerja dalam suatu kondisi tergantung nilai yang disimpan oleh variabel status penghapusan. Contohnya sebagai berikut :
- Buat variabel ber-scope level module (tulis di bawah Option Explicit) :
- Buat prosedur yang berisi proses yang membutuhkan variabel static :
Static lVarStatic As Long 'deklarasi variabel static
'cek status penghapus
If bHapusStatic Then 'jika HapusStatic adalah TRUE
lVarStatic = 0 'reset variabel static
Else 'jika FALSE
lVarStatic = lVarStatic + 5 'kerja seperti biasa
End If 'selesai cek status penghapus
'tampilkan (anggap saja output)
MsgBox "Nilai lVarStatic sekarang " & lVarStatic
End Sub
- Buat prosedur penghapus variabel static yang ada di dalam prosedur bernama ProsedurBerStaticVariabel :
'set status hapus dengan TRUE untuk hapus static
bHapusStatic = True
'jalankan prosedur yang memiliki variabel static yang akan dihapus
'untuk melakukan reset nilai variabel static
ProsedurBerStaticVariabel
'kembalikan status hapus ke FALSE (tidak perlu hapus static lagi)
bHapusStatic = False
End Sub
- Jalankan prosedur ProsedurBerStaticVariabel berkali-kali, kemudian jalankan prosedur PenghapusStatic.
Konstanta
Konstanta dibentuk dengan keyword Const dengan scope level minimal adalah scope level Module. Konstanta bersifat read only ketika sedang digunakan. Nilai dalam konstanta ditetapkan saat deklarasi konstanta. Deklarasi konstanta diletakkan pada area General Declaration.Syntax deklarasi-nya adalah :
scope CONST nama_konstanta AS datatype = nilai_konstanta
Contoh deklarasi konstanta :
Public Const sUser As String = "Kid"
Private Const curPersen As Currency = 0.15
Private Const lBlokData As Long = 3
Sifat read only membuat nilai dalam konstanta bernama sUser, curPersen, lBlokData tidak dapat diubah dalam proses layaknya sebuah variabel.
User Defined Type (UDT)
User Defined Type (UDT) adalah datatype yang dibentuk oleh pemrogram. Sebuah UDT bisa berisi banyak elemen variabel dengan datatype setiap elemen bisa berbeda-beda. Keyword yang digunakan adalah Type. Deklarasi UDT diletakkan di area General Declaration sebelum baris-baris deklarasi variabel yang menggunakan UDT tersebut sebagai datatype-nya.Syntax deklarasi pembuatan UDT adalah :
Public|Private TYPE nama_udt
variabel1 AS datatype
.
.
variabelN AS datatype
End Type
Contoh deklarasi UDT (letakkan di area general declaration sebelum baris-baris deklarasi variabel) :
Public Type uCustomer
sNama As String
sAlamat As String
lPoint As Long
dtJoin As Date
End Type
Variabel yang akan menggunakan UDT harus dideklarasikan dengan datatype berupa nama UDT yang ada. Scope level dari variabel pengguna UDT sama seperti variabel lainnya. Contoh deklarasi variabel dengan datatype menggunakan UDT uCustomer :
Public udtCustAktif As uCustomer
Contoh prosedur yang menggunakan variabel udtCustAktif yang ber-datatype UDT uCustomer : (fokus pada biru)
Public Sub PakaiUDT()
'isi nilai udtCustAktif
udtCustAktif.sNama = "Kid"
udtCustAktif.sAlamat = "Jakarta"
udtCustAktif.dtJoin = #6/22/2013#
udtCustAktif.lPoint = 100
'gunakan nilai dalam udtCustAktif
MsgBox "udtCustAktif" & vbCrLf & String(23, "-") & vbCrLf & "Nama" & _
vbTab & vbTab & ": " & udtCustAktif.sNama & _
vbCrLf & "Tanggal Join" & vbTab & ": " & udtCustAktif.dtJoin & vbCrLf & "Alamat" & vbTab & vbTab & _
": " & udtCustAktif.sAlamat & vbCrLf & "Poin sampai saat ini" & vbTab & ": " & udtCustAktif.lPoint
End Sub
Script di atas sengaja tidak menggunakan blok With ... End With agar lebih mudah dipelajari. Cara menghapus nilai yang ada didalam sebuah UDT adalah dengan menghapus setiap nilai dalam elemen penyusunnya. Hal ini kadang terasa tidak praktis. Jika diperhatikan secara seksama, penggunaan UDT secara sekilas akan tampak seperti menggunakan sebuah object. Maka UDT bisa jadi langkah awal untuk mengarah ke penggunaan Class yang berfungsi sebagai blueprint sebuah object.
Insya Allah pembahasan berikutnya adalah tentang prosedur.
No comments:
Post a Comment