Kasus-kasus pemrograman
menggunakan VBA-Excel

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.

back to: home | topic index


Ir. Djoko Luknanto, M.Sc., Ph.D.
Peneliti Sumberdaya Air
di Laboratorium Hidraulika
Departemen Teknik Sipil dan Lingkungan, Fakultas Teknik
Universitas Gadjah Mada
Jln. Grafika 2, Yogyakarta 55281, INDONESIA
Tel: +62 (274)-545675, 519788, Fax: +62 (274)-545676, 519788