Belajar VBA - Performance Tuning & Best Practice
Series/Belajar VBA/Episode 21
Episode 21 of 25

Belajar VBA - Performance Tuning & Best Practice

Menyetel macro sampai tingkat produksi: mematikan ScreenUpdating Calculation dan EnableEvents saat menjalankan kode, memakai array processing, serta menulis kode bersih dengan prosedur modular, naming konsisten, komentar, dan Option Explicit

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Di episode 10 kita belajar bahwa akses Excel itu mahal dan array memotong jumlah akses. Episode ini melengkapi persenjataan performa dengan tiga saklar aplikasi — ScreenUpdating, Calculation, EnableEvents — dan mengikatnya dengan disiplin menulis kode yang bisa dirawat.

Mengapa ini penting? Karena dua macro dengan logika identik bisa memiliki performa dan keterawatan yang sangat berbeda. Macro yang cepat tapi berantakan tidak bisa dipelihara; macro yang rapi tapi lambat membuat pengguna frustrasi. Episode ini menyatukan keduanya: cepat dan bersih.

Tiga Saklar Aplikasi

Sebelum kode mulai bekerja, matikan dulu tiga pekerjaan latar Excel:

SaklarFungsiDampak saat dimatikan
ScreenUpdating = FalseBerhenti menggambar layarRefresh tampilan tertunda
Calculation = xlCalculationManualFormula tidak dihitung ulangPerhitungan ditunda
EnableEvents = FalseEvent (Change, Open, dll.) tidak berjalanEvent tidak memicu
Kerangka performa standar
Sub ProsesBesar()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    On Error GoTo Selesai
 
    ' ... logika utama ...
 
Selesai:
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
End Sub

Pola di atas adalah kontrak: apa pun yang terjadi (termasuk error), ketiga saklar dikembalikan ke kondisi semula di label Selesai. Kalau salah satu lupa dikembalikan, pengguna akan bertanya-tanya mengapa Excel "aneh" — formula tidak muncul, layar tidak refresh.

Danger

Membiarkan Calculation dalam mode manual setelah macro selesai adalah bug paling umum di produksi. Selalu kembalikan ke xlCalculationAutomatic di blok Selesai — dan bila ragu, tambahkan Application.Calculate setelah mengembalikannya agar workbook tersegarkan penuh.

Saat Event Justru Perlu Berjalan

EnableEvents = False mencegah event memicu kode lain — sangat penting saat kode mengubah sel yang memicu event loop tak berujung. Tetapi:

  • Event Workbook_BeforeSave (backup otomatis) akan ikut mati.
  • Perubahan yang biasanya memicu validasi tidak terjadi.

Kapan menyalakannya kembali? Setelah pekerjaan massal selesai, kembalikan EnableEvents = True lalu jalankan apa pun yang bergantung event secara manual jika perlu.

Array Processing: Pengingat

Tuning terbaik tetap mengurangi jumlah akses — kombinasi yang ideal:

Pola gabungan: saklar + array
Sub ProsesOptimal()
    Dim data As Variant
    Dim r As Long
 
    Application.ScreenUpdating = False
    On Error GoTo Selesai
 
    data = Range("A1:C50000").Value2
    For r = 2 To UBound(data, 1)
        data(r, 3) = data(r, 1) * data(r, 2)
    Next r
    Range("A1:C50000").Value2 = data
 
Selesai:
    Application.ScreenUpdating = True
End Sub

Saklar menekan pekerjaan latar; array menekan jumlah akses. Keduanya bekerja pada lapisan yang berbeda — dan hasilnya sering 10-100 kali lebih cepat dari versi naif.

Performa tanpa keterawatan adalah utang. Enam kebiasaan berikut menjaga kode tetap bisa dipelihara:

1. Option Explicit di Setiap Modul

Sudah menjadi hukum sejak episode 5: satu baris pertama modul mencegah typo variabel menjadi bug diam-diam.

2. Prosedur Kecil dan Satu Tujuan

Contoh prosedur kecil
Sub ProsesHarian()
    AmbilData
    BersihkanData
    BangunLaporan
    KirimLaporan
End Sub

Empat prosedur kecil lebih mudah diuji dan dilacak daripada satu prosedur raksasa 300 baris.

3. Naming yang Konsisten

JenisPrefiksContoh
Variabelkata bermaknalastRow, totalNilai
ProsedurVerbaBersihkanData
KonstantaCONST_CONST_PAJAK
Kontrol formtxt, cbo, btn, lbltxtNama, btnSimpan

4. Komentar yang Menjelaskan "Mengapa"

Komentar bukan mengulang kode, melainkan menjelaskan alasan:

Komentar 'mengapa'
' Rentang statis karena kolom B dihasilkan query di atas
lastRow = 1000

5. Hindari Global yang Tak Perlu

Public variabel menciptakan dependensi tersembunyi. Serahkan data lewat parameter fungsi.

6. Dengan...End With untuk Referensi Objek

With untuk objek
With ThisWorkbook.Sheets("Data")
    .Range("A1").Value = 1
    .Range("A2").Value = 2
End With

Referensi objek ditelusuri sekali, bukan berulang — lebih cepat dan lebih bersih.

Mengukur Performa: Timer

Jangan menebak, ukur. VBA punya timer built-in:

Mengukur waktu eksekusi
Sub UkurWaktu()
    Dim mulai As Double
    mulai = Timer
 
    ' logika yang diukur...
 
    Debug.Print "Waktu: " & Format(Timer - mulai, "0.00") & " detik"
End Sub

Timer memberi resolusi seperseratus detik — cukup untuk membandingkan dua pendekatan dan membuktikan mana yang benar-benar cepat.

Kapan Cukup?

Optimisasi memiliki kurva menurun. Pedoman sederhana:

SituasiTindakan
Macro 10-60 detikSaklar aplikasi + hindari Select
Macro 1-30 menitTambahkan array processing
Macro lebih dari 30 menitPertimbangkan memecah, jalankan di luar Excel (database, Python)

Jangan menghabiskan 3 jam mengoptimasi macro yang dijalankan sekali seminggu. Ukur dulu — kalau sudah "cukup cepat", berhenti dan kerjakan hal yang lebih bernilai.

Common Pitfalls

KesalahanDampak
Lupa mengembalikan saklar setelah errorExcel "aneh" pasca-macro
EnableEvents dimatikan dan event penting hilangBackup/validasi tidak berjalan
Global berlebihanBug akibat status tersembunyi
Optimasi prematurWaktu terbuang untuk hal yang tak butuh
Mengukur performa tanpa TimerMenebak-nebak

Penutup

Pada episode 21 ini, kalian telah menyetel macro ke level produksi.

Inti yang harus dibawa pulang:

  • Matikan ScreenUpdating, Calculation, dan EnableEvents saat kode jalan; kembalikan di blok Selesai.
  • Kombinasikan dengan array processing untuk pengurangan akses maksimal.
  • Tulis kode yang bisa dirawat: Option Explicit, prosedur kecil, naming konsisten, komentar "mengapa", With.
  • Ukur dengan Timer; optimasi sampai "cukup cepat", bukan tanpa batas.

Di episode 22 selanjutnya kita merangkai semuanya: otomasi lintas aplikasi dengan OLE AutomationCreateObject dan GetObject, Early vs Late Binding, serta pipeline data nyata Excel → Access → Word → Outlook dalam satu kode. Sampai jumpa di episode 22!