Guna evaluate : mengkomputasi yang di-input-kan
Datatype hasil : VARIANT
artinya :
- jika yang diinputkan menghasilkan suatu object, maka hasilnya ber-datatype object.
- jika yang diinputkan menghasilkan suatu nilai skalar, maka hasilnya ber-datatype nilai skalar hasil tersebut
Jadi, ketika yang diinputkan adalah kegiatan pada worksheet (ndak usah membahas yang inputnya chart dulu ya), maka hasilnya bisa ada 2 datatype, yaitu :
- jika yang diinputkan menghasilkan object Range (karena kegiatan worksheet dalam hal ini artinya tulisan formula), maka hasilnya ber-datatype object Range
- jika yang diinputkan menghasilkan nilai skalar, maka hasilnya ber-datatype sesuai datatype nilai hasil tersebut.
Contoh 001 :
di cell Excel, misal di cell G7, bisa diberi formula berbunyi =A1
1. Formula tersebut, hasilnya di cell excel, menghasilkan nilai yang ada di A1 ya kan...
2. Kegiatan yang terjadi dalam formula tersebut sebenarnya suatu proses evaluate. Dalam VBA, methods evaluate bisa digunakan dengan bunyi :
Evaluate("A1")
atau
Evaluate("=A1")
atau
[A1]
(lihat lagi cara penggunaan Evaluate diatas).
3. hasil Evaluate adalah object range, karena formula di G7 yang dipakai dalam evaluate (di VBA) akan menghasilkan object range dan bukan nilai skalar.
Jadi, kaidah datatype akan berlaku dalam hal ini (sudah baca BelajarVBA tentang variabel dan datatype ?)
Mari kita buktikan.
Isi cell A1 dengan bilangan (bertype numerik) senilai 12345
Tulis disebuah prosedur (buat sendiri prosedurnya) di sebuah general module.
Jika ada variabel yang dideklarasikan dengan baris kode : (ingat ya, A1 isinya bilangan 12345)
Dim rng As Range
Dim dblNilai As Double
'definisi object range -> selalu pakai Set kan
Set rng = Range("A1") 'biasanya begini kan cara definisi sebuah variabel object range
'kalau pakai evaluate
Set rng = Evaluate("A1") 'inputnya harus teks kan (lihat cara pakai evaluate diatas)
'atau
Set rng = [A1] 'inputnya harus bunyi yang bisa dipasang sebagai formula dalam cell kan
'kedua baris diatas tidak akan menghasilkan error, karena evaluate akan menghasilkan object range
'sekarang pakai nilai skalar ada di object range
'nilai di range A1 bisa diambil dengan bunyi :
dblNilai = Range("A1").Value
'karena default properti object range adalah proeperti VALUE, maka kebanyakan pengguna VBA yang menulis :
dblNilai = Range("A1") 'tidak akan menghasilkan error, tapi tetap saja baris ini sama dengan bunyi baris Range("A1").Value
'jadi dblNilai bukan diisi oleh object range A1, tapi diisi oleh nilai yang ada dalam properti VALUE dari range A1
'kalau dblNilai akan diisi dengan object range A1,
'maka bunyi baris kodenya harus Set dblNilai = Range("A1")
'dan ini pasti error, coba aja kalo gak percaya.
'Kenapa kok error hayo ?
'mengisi variabel dblNilai yang berdatatype Double yang berisi nilai skalar bisa menggunakan evaluate seperti :
dblNilai = Evaluate("A1").Value 'bagian Evaluate("A1") menghasilkan object Range
'karena bunyi inputannya menghasilkan suatu range
'atau kebanyakan VBA yang pengen pakai default value dari object range akan menulis :
dblNilai = Evaluate("A1") 'yang sama dengan baris kode berbunyi : dblNilai = Range("A1")
'kalau pakai bracket (kurung siku) dalam menggunakan evaluate, jadinya :
dblNilai = [A1].Value 'hasil bagian [A1] adalah object range karena bunyi inputannya menghasilkan suatu range
'atau yang pengen pakai default properti object range yang berupa properti VALUE, bisa menulis :
dblNilai = [A1]
'sekali lagi, proses 4 baris diatas bukan mengisi dblNilai dengan range A1, tapi mengisi dblNilai dengan nilai properti VALUE milik range A1
Sekarang,
Contoh 002 :
di A2 diisi teks berbunyi BeExcel
1. di cell F5 bisa diberi formula berbunyi : =A2 dan akan tampak dicell isi F5 adalah sama dengan isi A2 dan ber-datatype string (teks)
2. untuk pakai evaluate seperti contoh 001, ketika memanfaatkan hasil evaluate yang ber-type Object (karena formula berbunyi =A2 menghasilkan object range), variabel object range bernama rng yang ada di contoh 001 masih bisa dipakai. Cara pakai evaluate ke variabel rng :
'definisi object range -> selalu pakai Set kan
Set rng = Range("A2") 'biasanya begini kan cara definisi sebuah variabel object range
'kalau pakai evaluate
Set rng = Evaluate("A2") 'inputnya harus teks kan (lihat cara pakai evaluate diatas)
'atau
Set rng = [A2] 'inputnya harus bunyi yang bisa dipasang sebagai formula dalam cell kan
'kedua baris diatas tidak akan menghasilkan error, karena evaluate akan menghasilkan object range
'tapi kalau untuk ambil nilai dalam object range hasil evaluate, dibutuhkan variabel ber-datatype string. Jadi harus ada deklarasi variabel seperti :
Dim sNilai As String
'lalu variabel sNilai bisa dipakai
sNilai = Range("A2").Value'atau kalau mau pakai default properti milik object range yang bernama properti VALUE,
sNilai = Range("A2")
'untuk hasil evaluate juga demikian, bisa ditulis :
sNilai = Evaluate("A2").Value
'atau kalau mau pakai default properti milik object range yang bernama properti VALUE,
sNilai = Evaluate("A2")
'pakai evaluate yang notasinya bracket (kurung siku) juga bisa,
sNilai = [A2].Value
'atau kalau mau pakai default properti milik object range yang bernama properti VALUE,
sNilai = [A2]simpulan dari contoh 001 dan contoh 002 (inputannya menghasilkan object)
1. jadi, kalau ambil hasil evaluate yang nilai skalarnya, berarti mengambil properti VALUE hasil evaluate jika inputan evaluate menghasilkan Object, bisa disimpan divariabel yang datatype-nya sesuai dengan si datatype nilai skalar yang akan diambil
2. kalau akan ambil object range hasil evaluate-nya, maka harus disimpan dalam variabel object range (variabel object juga bisa, cuma lebih lama)
Yuk mainan yang inputannya bukan object.
Contoh 003 :
di A1 sudah ada data numerik 12345
di A2 sudah ada data teks berbunyi BeExcel
di E3 bisa diberi formula berbunyi : =A1 & " milik " & A2 dan hasilnya adalah teks berbunyi '12345 milik BeExcel'
Hasil formula di E3 ini bukanlah ber-datatype object Range, tapi nilai skalar berbunyi '12345 milik BeExcel' yang ber-type String (teks)
1. menyusun bunyi formula seperti formula E3 dalam VBA, disimpan dalam variabel bernama sFormula yang ber-type String
Dim sFormula As String
'menulis petik dua (") dalam ekspresi string di VBA harus diganti dengan 2 (dua) buah petik dua ("")
'jadi, bunyi formula : A1 & " milik " & A2 harus ditulis di-VBA menjadi A1 & "" milik "" & A2
'karena ekspresi string di-VBA juga harus diapit petik dua ("), maka bentuknya menjadi :
sFormula = "A1 & "" milik "" & A2"
'cek deh hasilnya, pastikan di E3 ada formula berbunyi =A1 & " milik " & A2
msgbox "Formula di E3 : " & range("e3").formula _
& vbcrlf & "Formula di sFormula : " & sformula _
& vbcrlf & "Hanya selisih karakter sama dengan ya....",vbinformation,"Jas Inpo ajah"
2. Jadi, variabel object range bernama rng di prosedur yang ada, sudah ndak bisa dipakai untuk menyimpan nilai hasil formula yang bunyinya seperti formula di E3 atau yang disimpan dalam variabel sFormula.
'artinya, kalau baris kode berikut diaktifkan dan dijalankan prosedurnya, akan menghasilkan error
'Set rng = Range(sFormula)
'jadi kita lewatkan saja bagian yang akan menyimpan sebagai object range (soale ndak mungkin kalau langsung pakai formula)