Parameter ByVal dan ByRef pada VBA Excel: Memahami Cara Data Dikirim ke Prosedur dan Fungsi

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

MenggunakanNilai SebelumNilai 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.

AspekByValByRef
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.


Hubungi Kami

Kantor Berkreasi
Alamat :
Pens Sky Venture - Sukolilo Surabaya
Karangrejo Tmur 17 Surabaya

Email : kantor.berkreasi@gmail.com
WA : wa.me/6287761589881  
(Support  Mbak Ana)

Tim Pengembang

Dr. Rojabi Azharghany, M.Si, S.Sos
Dr. H. Agus Sulthoni Imami, S.Psi. M.Pd.I.
Ali Ishaq, M.Pd.
Didik Rahwiniyanto, S.Si., M.Pd.
Mujiburrohman, M.Pd.
Mohammad Zikky, S.ST, M.T
Amien sawedi, S.Pd.
Didik P Wicaksono, M.Pd.