Saat membuat prosedur atau fungsi di VBA, kita hampir selalu mengirimkan data melalui parameter. Sebagai contoh, sebuah prosedur menerima nilai penjualan untuk dihitung diskonnya, atau sebuah fungsi menerima panjang dan lebar untuk menghitung luas.
Sekilas, cara penulisannya terlihat sederhana. Namun, ada satu hal yang sering diabaikan, yaitu bagaimana VBA mengirimkan parameter tersebut.
Apakah nilai asli tetap dipertahankan, atau justru ikut berubah setelah prosedur selesai dijalankan?
Jawabannya bergantung pada penggunaan ByVal dan ByRef.
Apa Itu Parameter?
Parameter adalah variabel yang menerima data ketika sebuah Sub atau Function dipanggil.
Contoh:
Sub Sapa(Nama As String)
MsgBox "Halo " & Nama
End Sub
Pada contoh tersebut, Nama adalah parameter.
Apa Itu ByVal?
ByVal (By Value) berarti VBA mengirim salinan nilai ke dalam prosedur.
Perubahan yang dilakukan pada parameter tidak akan memengaruhi variabel asli.
Sintaks:
Sub Contoh(ByVal Nilai As Integer)
Contoh ByVal
Sub UbahNilai(ByVal Angka As Integer)
Angka = 100
End Sub
Sub Demo()
Dim X As Integer
X = 50
UbahNilai X
MsgBox X
End Sub
Hasil:
50
Walaupun parameter diubah menjadi 100, nilai X tetap 50 karena yang dikirim hanyalah salinannya.
Apa Itu ByRef?
ByRef (By Reference) berarti VBA mengirim referensi ke variabel asli.
Perubahan yang dilakukan di dalam prosedur akan langsung memengaruhi variabel tersebut.
Sintaks:
Sub Contoh(ByRef Nilai As Integer)
Contoh ByRef
Sub UbahNilai(ByRef Angka As Integer)
Angka = 100
End Sub
Sub Demo()
Dim X As Integer
X = 50
UbahNilai X
MsgBox X
End Sub
Hasil:
100
Karena menggunakan ByRef, perubahan pada parameter langsung memengaruhi variabel X.
Perbedaan ByVal dan ByRef
| ByVal | ByRef |
|---|---|
| Mengirim salinan nilai | Mengirim referensi variabel |
| Nilai asli tidak berubah | Nilai asli dapat berubah |
| Lebih aman | Lebih efisien jika memang ingin mengubah nilai |
ByRef Merupakan Nilai Bawaan
Jika Anda tidak menuliskan ByVal atau ByRef, VBA menggunakan ByRef sebagai perilaku bawaan.
Contoh:
Sub Contoh(Angka As Integer)
Secara otomatis dianggap sebagai:
Sub Contoh(ByRef Angka As Integer)
Karena itu, banyak pemula tidak menyadari mengapa nilai variabel mereka berubah setelah memanggil sebuah prosedur.
Menggunakan ByVal pada Function
ByVal juga dapat digunakan pada Function.
Function TambahSepuluh(ByVal Nilai As Integer) As Integer
Nilai = Nilai + 10
TambahSepuluh = Nilai
End Function
Nilai variabel yang dikirim tetap tidak berubah.
Studi Kasus
Misalkan Anda memiliki prosedur untuk menambahkan bonus penjualan.
Sub TambahBonus(ByRef Penjualan As Double)
Penjualan = Penjualan + 500000
End Sub
Pemanggilan:
Dim Total As Double
Total = 2500000
TambahBonus Total
MsgBox Total
Hasil:
3000000
Karena menggunakan ByRef, nilai Total ikut berubah.
Jika parameter diubah menjadi:
ByVal Penjualan As Double
maka Total tetap bernilai 2.500.000.
Kapan Menggunakan ByVal?
Gunakan ByVal jika:
-
hanya membutuhkan nilai untuk dibaca;
-
tidak ingin variabel asli berubah;
-
membuat fungsi perhitungan;
-
ingin mengurangi risiko perubahan yang tidak disengaja.
Kapan Menggunakan ByRef?
Gunakan ByRef jika:
-
memang ingin mengubah nilai variabel;
-
ingin mengembalikan lebih dari satu hasil melalui parameter;
-
membuat prosedur yang memodifikasi data.
Kesalahan yang Sering Terjadi
Tidak Menuliskan ByVal atau ByRef
Banyak pemula menulis:
Sub Hitung(Nilai As Integer)
Padahal VBA akan menganggap parameter tersebut sebagai ByRef.
Jika tidak ingin variabel berubah, tuliskan ByVal secara eksplisit.
Menggunakan ByRef Tanpa Disadari
Sering kali sebuah prosedur hanya bertugas menghitung nilai, tetapi parameter justru menggunakan ByRef.
Akibatnya, nilai variabel asli berubah tanpa disadari.
Menggunakan ByVal Saat Ingin Mengubah Nilai Asli
Jika tujuan prosedur memang untuk memperbarui variabel yang dikirim, gunakan ByRef.
Dengan ByVal, perubahan hanya terjadi pada salinan data.
Tips Praktis
💡 Biasakan menulis ByVal atau ByRef secara eksplisit agar maksud kode lebih jelas.
💡 Gunakan ByVal sebagai pilihan utama jika prosedur tidak perlu mengubah nilai variabel.
💡 Gunakan ByRef hanya jika perubahan terhadap variabel asli memang diinginkan.
💡 Berikan komentar pada prosedur yang menggunakan ByRef, terutama jika perubahan parameter tidak terlihat secara langsung.
💡 Uji hasil prosedur dengan beberapa nilai agar lebih mudah memahami pengaruh kedua metode tersebut.
Ringkasan
| Kata Kunci | Fungsi |
|---|---|
ByVal |
Mengirim salinan nilai |
ByRef |
Mengirim referensi variabel |
| Parameter | Data yang diterima prosedur atau fungsi |
| Nilai Asli | Dapat berubah jika menggunakan ByRef |
Kesimpulan
ByVal dan ByRef menentukan cara VBA mengirimkan parameter ke dalam prosedur maupun fungsi. ByVal mengirim salinan nilai sehingga variabel asli tetap aman, sedangkan ByRef mengirim referensi sehingga perubahan di dalam prosedur akan memengaruhi variabel asal. Dengan memahami perbedaan keduanya, Anda dapat menghindari perubahan data yang tidak diinginkan serta menulis kode VBA yang lebih jelas, aman, dan mudah dipelihara.
