Kasus 1: Kesalahan argumen ByVal dan
ByRef
Dalam pemrograman, kesalahan biasanya terjadi dan kadang
tidak terduga. Di bawah ini disajikan bahasa pemrograman
VBA-Excel untuk menyelesaikan Persamaan Non-Linier dengan
Metoda Newton. Penulisan koding di bawah ini dilakukan
langsung oleh mahasiswa semester satu, langsung saya pandu
sebagai pengampu. Secara umum, jika dilihat sepintas koding
di bawah ini sudah sesuai; namun pada saat dieksekusi timbul
runtime error. Penjelasan tentang terjadinya
error maupun penyelesaiannya dijelaskan secara rinci
di bawah ini untuk pelajaran bagi para mahasiswa.
Catatan: dalam koding di bawah, bagian yang ditandai
dengan penebalan dan garis bawah merupakan
variabel/lokasi terjadinya error.
Listing VBA-Excel yang menimbulkan
error
Persamaan iteratif yang digunakan dalam Metoda Newton
Function FungsiX(X As Double) As Double
FungsiX = X - Cos(X)
End Function
Function dFungsiX(X As Double) As Double
dFungsiX = 1 + Sin(X)
End Function
Function Newton(X As Double) As Double
Dim XLama, XBaru, Penyebut, DeltaX As Double
Dim Counter As Integer
'Inisialisasi variabel
Counter = 0
XLama = X
Iterasi:
Penyebut = dFungsiX(XLama)
If Abs(Penyebut) < 0.000001 Then
'Tidak bisa dihitung
Newton = "Tidak bisa dihitung karena penyebut = 0"
Else 'Hitungan iterasi Newton
'Dicatat berapa kali iterasi
Counter = Counter + 1
'Mulai hitungan iterasi
DeltaX = FungsiX(XLama) / Penyebut
XBaru = XLama - DeltaX
If Abs(DeltaX) < 0.000001 Then
'Hitungan sudah teliti
Newton = "Hitungan sukses, X = " & XBaru & ", dengan iterasi: " & Counter
Else
'Hitungan belum teliti, dihitung kembali
XLama = XBaru
GoTo Iterasi
End If
End If
End Function
Penjelasan Penyelesaian Error: Alternatif 1
dengan ByVal
Pada Gambar 1 disajikan koreksi pada koding asli di atas.
Pada koding dalam Gambar 1, program sukses dieksekusi dan
hasilnya disajikan dalam Gambar 7.
Koding secara lengkap dapat diunduh dalam format xlsm
dan xlsb agar dapat digunakan
sebagai latihan dengan mengikuti penjelasan rinci di bawah
ini.
Gambar 1. Koding program serupa
tetapi sudah diubah sehingga dapat dieksekusi tanpa
error.
Koding yang sudah benar (pada Gambar 1) akan kita ubah
sesuai dengan koding aslinya di awal
artikel agar error yang terjadi dapat direproduksi.
Hasil dari eksekusi tentu saja menghasilkan error
seperti disajikan dalam Gambar 2.
Gambar 2. Error terjadi yaitu "ByRef
argument type mismatch".
Error ini terjadi (lihat Gambar 2) disebabkan
dalam Function Newton, XLama dideklarasikan
sebagai variabel, sedangkan menurut compiler argumen
X dalam Function FungsiX adalah nilai
(value) bukan variabel (reference). Oleh
karena itu pada saat digunakan (sebagai argumen),
compiler-nya protes karena jenis yang digunakan tidak
sama. Oleh karena itu penyelesaiannya adalah secara
eksplisit didalam Function Newton ditambah
ByVal sebelum variabel dummy X.
Kegunaan ByVal adalah memaksa agar variabel dummy
X berfungsi sebagai wadah nilai BUKAN
variabel, sehingga nilainya tidak dapat diubah
didalam Function FungsiX.
Hal yang sama diulangi untuk kasus Function
dFungsiX dan hasilnya disajikan dalam Gambar 3 dan
4.
Gambar 3. ByVal dihilangkan
dari Function dFungsiX
Gambar 4. Error serupa terjadi
yaitu "ByRef argument type mismatch"
Penjelasan Penyelesaian Error: Alternatif 2
dengan deklarasi eksplisit
Pada bagian ini disajikan penyelesaian error
dengan menggunakan cara tidak langsung yaitu menggunakan
deklarasi eksplisit. Secara rinci penjelasan deklarasi
eksplisit disajikan dalam Gambar 5 dan 6.
Pada Gambar 5 error terjadi. Hal ini disebabkan
deklarasi varabel XLama tidak secara eksplisit
dilakukan (walaupun menurut manual VBA
dari Microsoft hal ini tidak perlu dilakukan).
Gambar 5. Penjelasan rinci koreksi
dengan deklarasi eksplisit argumen dummy X
dalam FX.
Pada Gambar 5, variabel XLama akan digunakan
sebagai argumen dalam Function FX, oleh karena itu
deklarasinya akan dilakukan secara eksplisit "XLama as
double", dan hasilnya disajikan dalam Gambar
7. Pada Gambar 6 disajikan kasus serupa tetapi dengan
Function dFX; penyelesaiannya juga serupa dengan kasus di
atas.
Gambar 6. Penjelasan rinci koreksi
dengan deklarasi eksplisit argumen dummy X
dalam dFX.
Hasil Final
Hasil final untuk kedua penyelesaian error diatas
disajikan dalam Gambar 7.
Gambar 7. Hasil final dari kedua
alternatif koreksi koding yang menimbulkan
error.
Penyelesaian bagian atas menggunakan deklarasi ByVal,
sedangkan penyelesaian bagian bawah menggunakan deklarasi
eksplisit. Hasilnya persis sama.
Catatan: Terima kasih untuk Pak Akhmad
Aminullah yang banyak memberikan masukan dan melakukan
penelitian terhadap kasus error ByVal dan ByRef.
|