ByVal atau ByRef? Kenali Perbedaannya di VBA Excel

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

ByValByRef
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 KunciFungsi
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.

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.