Sebuah Pertanyaan Sederhana
Perhatikan kode berikut.
Sub UbahNilai(ByVal Angka As Integer)
Angka = 100
End Sub
Sub Tes()
Dim Nilai As Integer
Nilai = 50
UbahNilai Nilai
MsgBox Nilai
End Sub
Menurut Anda, berapa nilai yang akan ditampilkan?
Apakah 50 atau 100?
Sekarang perhatikan jika kata ByVal diganti menjadi ByRef.
Apakah hasilnya masih sama?
Jawabannya bergantung pada cara VBA mengirim parameter, yaitu menggunakan ByVal atau ByRef.
Mengapa Perlu Memahami ByVal dan ByRef?
Saat memanggil sebuah Sub atau Function, sering kali kita mengirimkan data ke dalamnya.
Contohnya:
-
Nama pelanggan
-
Nilai penjualan
-
Harga barang
-
Nomor invoice
Pertanyaannya adalah:
Apakah prosedur hanya menerima salinan data, atau langsung menggunakan data asli?
Inilah perbedaan utama antara ByVal dan ByRef.
Mengenal ByVal
ByVal (By Value) berarti parameter dikirim berdasarkan nilainya.
Artinya, prosedur menerima salinan dari data asli.
Jika nilai parameter diubah di dalam prosedur, variabel asli tidak ikut berubah.
Ilustrasi
Bayangkan Anda memfotokopi sebuah dokumen.
Orang lain boleh mencoret hasil fotokopinya.
Namun dokumen asli tetap aman.
Begitulah cara kerja ByVal.
Contoh ByVal
Sub UbahNilai(ByVal Angka As Integer)
Angka = 100
End Sub
Pemanggilan:
Sub Tes()
Dim Nilai As Integer
Nilai = 50
UbahNilai Nilai
MsgBox Nilai
End Sub
Output:
50
Walaupun parameter diubah menjadi 100, variabel Nilai tetap bernilai 50.
Mengenal ByRef
ByRef (By Reference) berarti parameter dikirim berdasarkan referensinya.
Prosedur langsung bekerja pada variabel asli.
Jika parameter diubah, maka variabel asal juga ikut berubah.
Ilustrasi
Bayangkan Anda meminjamkan dokumen asli kepada seseorang.
Jika orang tersebut mengubah isi dokumen, maka dokumen yang Anda miliki juga berubah.
Begitulah cara kerja ByRef.
Contoh ByRef
Sub UbahNilai(ByRef Angka As Integer)
Angka = 100
End Sub
Pemanggilan:
Sub Tes()
Dim Nilai As Integer
Nilai = 50
UbahNilai Nilai
MsgBox Nilai
End Sub
Output:
100
Karena menggunakan ByRef, nilai variabel asli ikut berubah.
Melihat Perbedaannya
| Menggunakan | Nilai Sebelum | Nilai Setelah |
|---|---|---|
ByVal |
50 | 50 |
ByRef |
50 | 100 |
Apakah ByRef Wajib Ditulis?
Tidak.
Di VBA, jika Anda tidak menuliskan ByVal atau ByRef, maka VBA akan menggunakan ByRef sebagai default.
Contoh:
Sub Contoh(Angka As Integer)
Angka = 100
End Sub
Kode di atas sama dengan:
Sub Contoh(ByRef Angka As Integer)
Angka = 100
End Sub
Oleh karena itu, banyak programmer VBA tetap menuliskan ByVal atau ByRef secara eksplisit agar maksud kode lebih jelas.
Menggunakan ByVal pada Function
Function Diskon(ByVal Harga As Double) As Double
Diskon = Harga * 0.1
End Function
Pemanggilan:
Sub Tes()
Dim Harga As Double
Harga = 500000
MsgBox Diskon(Harga)
MsgBox Harga
End Sub
Nilai Harga tetap 500000.
Menggunakan ByRef untuk Mengubah Banyak Nilai
Misalnya ingin menukar isi dua variabel.
Sub Tukar(ByRef A As Integer, ByRef B As Integer)
Dim Temp As Integer
Temp = A
A = B
B = Temp
End Sub
Pemanggilan:
Sub Tes()
Dim X As Integer
Dim Y As Integer
X = 10
Y = 20
Tukar X, Y
MsgBox X
MsgBox Y
End Sub
Output:
20
10
Karena menggunakan ByRef, nilai kedua variabel benar-benar bertukar.
Studi Kasus
Menghitung Total Tanpa Mengubah Nilai Asli
Function HitungPPN(ByVal Harga As Double) As Double
HitungPPN = Harga * 0.11
End Function
Fungsi hanya menggunakan nilai Harga untuk menghitung PPN tanpa mengubah nilainya.
Menambah Saldo
Sub TambahSaldo(ByRef Saldo As Double)
Saldo = Saldo + 100000
End Sub
Setiap kali prosedur dipanggil, variabel Saldo akan bertambah.
Kapan Menggunakan ByVal?
Gunakan ByVal jika:
-
Hanya membutuhkan nilai parameter.
-
Tidak ingin data asli berubah.
-
Membuat fungsi perhitungan.
-
Melakukan validasi data.
Contoh:
-
Menghitung pajak.
-
Menghitung luas.
-
Menghitung diskon.
Kapan Menggunakan ByRef?
Gunakan ByRef jika:
-
Ingin mengubah nilai variabel asli.
-
Mengembalikan lebih dari satu hasil.
-
Menukar isi variabel.
-
Memperbarui data melalui prosedur.
Tips Praktis
✅ Biasakan menuliskan ByVal atau ByRef secara eksplisit.
✅ Gunakan ByVal sebagai pilihan utama jika parameter tidak perlu diubah.
✅ Gunakan ByRef hanya ketika memang diperlukan untuk mengubah data asli.
✅ Berikan nama parameter yang jelas agar kode mudah dipahami.
Kesalahan yang Sering Terjadi
1. Tidak Menyadari Default VBA adalah ByRef
Sub Ubah(Data As Integer)
Data = 100
End Sub
Banyak pemula mengira nilai asli tidak berubah, padahal parameter dikirim menggunakan ByRef.
2. Menggunakan ByRef Padahal Tidak Diperlukan
Jika parameter hanya digunakan untuk perhitungan, gunakan ByVal agar data asli tetap aman.
3. Bingung Mengapa Nilai Variabel Berubah
Sering kali penyebabnya adalah prosedur menerima parameter menggunakan ByRef.
Periksa kembali deklarasi parameter sebelum melakukan proses debugging.
Ringkasan
Berikut perbedaan utama antara ByVal dan ByRef.
| Aspek | ByVal | ByRef |
|---|---|---|
| Data yang dikirim | Salinan nilai | Referensi ke data asli |
| Nilai asli berubah | Tidak | Ya |
| Aman untuk perhitungan | Ya | Tidak selalu |
| Cocok untuk | Function dan validasi | Memperbarui data |
Kesimpulan
ByVal dan ByRef menentukan bagaimana data dikirim ke dalam prosedur atau fungsi. ByVal mengirim salinan nilai sehingga data asli tetap aman, sedangkan ByRef mengirim referensi ke variabel asli sehingga perubahan di dalam prosedur akan memengaruhi data tersebut.
Dengan memahami perbedaan keduanya, Anda dapat menghindari perubahan data yang tidak diinginkan dan menulis kode VBA yang lebih jelas, aman, serta mudah dipelihara.
