Membedah perbedaan Sub dan Function: prosedur tindakan tanpa nilai kembali vs fungsi yang mengembalikan nilai, cara membuat UDF custom formula yang bisa dipakai langsung di sel Excel, serta memahami ByVal dan ByRef

Sejauh ini semua macro kita berbentuk Sub. Episode ini memperkenalkan pasangannya: Function. Keduanya mirip secara tampilan, tetapi punya peran yang sangat berbeda — dan memahami perbedaannya membuka kemampuan VBA paling disukai pengguna Excel: membuat formula sendiri (UDF).
Mengapa ini penting? Karena di dunia kerja, pertanyaan "bisakah Excel melakukan ini?" sering dijawab dengan "belum ada formulanya, tapi bisa kita buat". UDF adalah jawaban itu: fungsi VBA yang dipakai persis seperti SUM atau VLOOKUP, namun dirancang untuk kebutuhan spesifik tim kalian.
Sub (subroutine) adalah prosedur yang menjalankan aksi tanpa mengembalikan nilai. Ia adalah pekerja: memformat, menghapus, mengirim, mencetak.
Sub BersihkanData()
Range("A1:C100").ClearContents
Range("A1").Select
End SubCiri khas Sub:
Sub Nama(...).Alt+F8).Contoh panggilan antar Sub:
Sub ProsesSemua()
BersihkanData
IsiLaporan
KirimEmail
End SubFunction mengembalikan satu nilai ke pemanggilnya. Ia adalah kalkulator: diberi masukan, menghasilkan keluaran.
Function KaliDua(angka As Double) As Double
KaliDua = angka * 2
End FunctionPerhatikan detail penting: nilai kembali diisi dengan menetapkan nama fungsi itu sendiri — KaliDua = angka * 2. Tidak ada kata kunci return seperti di bahasa lain.
Function bisa dipanggil dari kode:
Sub PakaiFunction()
Dim hasil As Double
hasil = KaliDua(21)
MsgBox "Hasil: " & hasil
End SubInilah kekuatan puncak Function: jika sebuah Function diletakkan di Standard Module, ia otomatis tersedia sebagai formula di Excel.
Function Diskon(harga As Double, persen As Double) As Double
Diskon = harga * (1 - persen)
End FunctionSetelah fungsi ini ada, kalian bisa menulis formula berikut langsung di sel Excel:
| Rumus di sel | Hasil |
|---|---|
=Diskon(1000; 0.1) | 900 |
=Diskon(B2; C2) | Mengambil nilai dari sel B2 dan C2 |
Tip
Di Excel berbahasa Indonesia, pemisah argumen formula adalah titik koma (;), bukan koma. Saat menulis UDF di kode tetap gunakan koma sebagai pemisah argumen prosedur — perbedaan pemisah hanya berlaku di sisi formula sel.
UDF standar tidak selalu menghitung ulang saat data berubah. Untuk memaksa kalkulasi ulang, deklarasikan fungsi dengan Application.Volatile:
Function SekarangKustom() As Date
Application.Volatile
SekarangKustom = Now
End FunctionApplication.Volatile memberi tahu Excel agar menghitung ulang fungsi ini setiap kali workbook menghitung ulang apa pun.
UDF bisa menerima rentang sel sebagai argumen:
Function HitungHijau(rng As Range) As Long
Dim cell As Range
Dim total As Long
For Each cell In rng
If cell.Interior.Color = RGB(0, 255, 0) Then
total = total + 1
End If
Next cell
HitungHijau = total
End FunctionDengan ini, =HitungHijau(A1:A100) menghitung berapa sel yang berlatar hijau — sesuatu yang mustahil dengan formula standar.
Warning
UDF yang membaca properti seperti Interior.Color hanya menghitung ulang saat sel berubah, bukan saat format berubah — ini keterbatasan yang sering mengejutkan. Untuk kebutuhan itu, alternatifnya Application.Volatile atau solusi non-UDF. Jangan bangun laporan penting tanpa menguji kapan UDF memperbarui nilainya.
Saat memanggil prosedur dengan argumen, penting bagaimana argumen itu diserahkan.
| Kata kunci | Perilaku | Dampak |
|---|---|---|
ByVal | Nilai disalin ke prosedur | Perubahan di dalam prosedur tidak memengaruhi variabel asal |
ByRef (default) | Referensi asli diteruskan | Perubahan di dalam prosedur mengubah variabel asal |
Sub UjiCoba()
Dim angka As Long
angka = 10
TambahByVal angka
MsgBox angka ' tetap 10
TambahByRef angka
MsgBox angka ' menjadi 11
End Sub
Sub TambahByVal(ByVal x As Long)
x = x + 1
End Sub
Sub TambahByRef(ByRef x As Long)
x = x + 1
End SubJika tidak menulis ByVal/ByRef, VBA memakai default ByRef. Untuk argumen yang tidak perlu dimodifikasi, deklarasikan ByVal secara eksplisit — menghindari perubahan tak sengaja pada variabel pemanggil.
| Situasi | Pilih |
|---|---|
| Menjalankan aksi (format, hapus, kirim) | Sub |
| Menghitung dan mengembalikan nilai | Function |
| Membuat formula custom yang dipakai di sel | Function (di Standard Module) |
| Di-trigger tombol/event | Sub |
Aturan sederhana: Sub untuk perintah, Function untuk nilai. Jika kalian menemukan Function yang tidak mengembalikan nilai atau Sub yang hanya menghitung, kemungkinan besar kalian memilih jenis yang salah.
| Kesalahan | Dampak |
|---|---|
| Lupa menetapkan nilai ke nama Function | Fungsi mengembalikan 0 / string kosong |
| Membuat UDF di modul worksheet/ThisWorkbook | Tidak bisa dipakai di sel |
Mengandalkan UDF Interior yang tidak volatile | Nilai basi saat format berubah |
ByRef tak sengaja mengubah variabel pemanggil | Efek samping tak terduga |
Pada episode 7 ini, kalian telah membedakan dua jenis prosedur VBA dan membuat fungsi sendiri yang dipakai di sel Excel.
Inti yang harus dibawa pulang:
NamaFungsi = nilai.Application.Volatile mengontrol kapan UDF menghitung ulang.ByVal menyalin nilai; ByRef meneruskan referensi asli.Di episode 8 selanjutnya kita masuk ke inti otomasi Excel: Excel Object Model — hierarki Application, Workbook, Worksheet, dan Range — lengkap dengan praktik membaca dan menulis sel, Cells(r,c), UsedRange, dan CurrentRegion. Sampai jumpa di episode 8!