Mini Project: Membuat Aplikasi Rekap Penjualan
Bayangkan ketika sedang mengembangkan aplikasi rekap penjualan di Excel.
Agar project mudah dikelola, kita dapat membagi kode ke dalam beberapa module.
ModuleData
- AmbilData()
- SimpanData()
ModulePerhitungan
- HitungTotal()
- HitungDiskon()
ModuleLaporan
- CetakLaporan()
Kemudian muncul pertanyaan:
Bagaimana cara prosedur di ModuleData menjalankan prosedur yang berada di ModulePerhitungan?
Jawabannya adalah dengan memanggil procedure antar module.
Mengapa Project Perlu Dibagi ke Dalam Module?
Saat project masih kecil, semua prosedur mungkin dapat ditempatkan dalam satu module.
Namun, ketika jumlah prosedur terus bertambah, struktur project akan menjadi sulit dipahami.
Contoh yang kurang baik:
Module1
Sub InputData()
Sub HitungTotal()
Sub CetakLaporan()
Sub BackupData()
Sub KirimEmail()
Sub HapusData()
Sub ImportExcel()
Sub ExportPDF()
...
Sebuah module yang berisi puluhan bahkan ratusan prosedur akan menyulitkan proses pencarian maupun pemeliharaan kode.
Solusinya adalah mengelompokkan prosedur berdasarkan fungsinya.
Mengenal Standard Module
Di VBA Editor, Anda dapat membuat beberapa Standard Module.
Contohnya:
ModuleData
ModulePerhitungan
ModuleLaporan
ModuleUtilitas
Setiap module dapat berisi beberapa Sub maupun Function.
Walaupun berada pada module yang berbeda, prosedur tersebut tetap dapat saling berkomunikasi selama memiliki ruang lingkup (scope) yang sesuai.
Cara Memanggil Procedure Antar Module
Misalkan terdapat prosedur berikut pada ModulePerhitungan.
Sub HitungTotal()
MsgBox "Menghitung total penjualan..."
End Sub
Kemudian pada ModuleUtama.
Sub JalankanProgram()
HitungTotal
End Sub
Saat JalankanProgram() dijalankan, VBA akan mencari prosedur HitungTotal meskipun prosedur tersebut berada pada module yang berbeda.
Memanggil dengan Kata Kunci Call
Selain menuliskan nama prosedur secara langsung, Anda juga dapat menggunakan kata kunci Call.
Sub JalankanProgram()
Call HitungTotal
End Sub
Kedua cara tersebut menghasilkan proses yang sama.
Memanggil Procedure dengan Parameter
Misalkan pada ModuleLaporan terdapat prosedur berikut.
Sub CetakLaporan(Judul As String)
MsgBox Judul
End Sub
Prosedur tersebut dapat dipanggil dari module lain.
Sub Proses()
CetakLaporan "Laporan Penjualan Bulanan"
End Sub
Output:
Laporan Penjualan Bulanan
Memanggil Function Antar Module
Hal yang sama juga berlaku untuk Function.
Pada ModulePerhitungan.
Function HitungPPN(Harga As Double) As Double
HitungPPN = Harga * 0.11
End Function
Pada ModuleUtama.
Sub HitungTagihan()
Dim Pajak As Double
Pajak = HitungPPN(500000)
MsgBox Pajak
End Sub
Karena HitungPPN bersifat umum, fungsi tersebut dapat digunakan oleh banyak prosedur tanpa perlu menulis ulang logika perhitungannya.
Memanggil Procedure Berdasarkan Nama Module
Jika terdapat dua prosedur dengan nama yang sama pada module yang berbeda, Anda dapat menyebutkan nama modulenya.
Misalnya:
ModuleData
Sub Bersihkan()
ModuleLaporan
Sub Bersihkan()
Pemanggilan dapat dilakukan seperti berikut.
Call ModuleData.Bersihkan
atau
ModuleLaporan.Bersihkan
Cara ini membantu VBA mengetahui prosedur mana yang harus dijalankan.
Pengaruh Scope terhadap Pemanggilan Procedure
Tidak semua prosedur dapat dipanggil dari module lain.
Perhatikan contoh berikut.
Private Sub HitungTotal()
End Sub
Karena menggunakan Private, prosedur tersebut hanya dapat dipanggil dari module yang sama.
Sebaliknya:
Public Sub HitungTotal()
End Sub
Prosedur di atas dapat dipanggil dari module lain dalam project.
Studi Kasus
Misalkan Anda membuat aplikasi inventaris barang.
Struktur project:
ModuleData
│
├── InputBarang()
├── EditBarang()
└── HapusBarang()
ModulePerhitungan
│
├── HitungStok()
└── HitungNilaiPersediaan()
ModuleLaporan
│
└── CetakLaporan()
ModuleUtama
│
└── JalankanAplikasi()
Isi JalankanAplikasi().
Sub JalankanAplikasi()
InputBarang
HitungStok
CetakLaporan
End Sub
Dengan struktur seperti ini, setiap module memiliki tanggung jawab yang jelas sehingga project lebih mudah dikembangkan.
Tips Mengelola Banyak Module
Jika project mulai berkembang, buatlah pengelompokan module berdasarkan fungsi.
Contoh:
| Module | Isi |
|---|---|
ModuleData |
Input, edit, hapus data |
ModulePerhitungan |
Seluruh proses perhitungan |
ModuleLaporan |
Cetak dan ekspor laporan |
ModuleUtilitas |
Fungsi umum yang sering digunakan |
ModuleUtama |
Titik awal menjalankan aplikasi |
Struktur seperti ini akan sangat membantu ketika jumlah prosedur terus bertambah.
Kesalahan yang Sering Terjadi
1. Procedure Bertipe Private
Private Sub SimpanData()
End Sub
Jika dipanggil dari module lain, VBA akan menampilkan error karena prosedur tersebut tidak dapat diakses.
2. Nama Procedure Ganda
Misalnya terdapat dua prosedur bernama Cetak() pada module yang berbeda.
Untuk menghindari kebingungan, gunakan nama yang lebih spesifik atau panggil dengan format:
ModuleLaporan.Cetak
3. Semua Procedure Diletakkan dalam Satu Module
Walaupun program tetap berjalan, struktur seperti ini akan menyulitkan proses pengembangan dan pemeliharaan.
Biasakan mengelompokkan prosedur berdasarkan tanggung jawabnya.
Praktik Terbaik
✅ Pisahkan prosedur berdasarkan fungsi.
✅ Gunakan Public hanya untuk prosedur yang memang perlu dipanggil dari module lain.
✅ Berikan nama module yang mencerminkan isi atau tanggung jawabnya.
✅ Hindari membuat satu module berisi terlalu banyak prosedur.
✅ Gunakan Function untuk logika perhitungan yang digunakan oleh banyak prosedur.
Ringkasan
| Konsep | Penjelasan |
|---|---|
| Procedure antar module | Prosedur pada satu module dapat dipanggil dari module lain jika memiliki scope yang sesuai. |
Public Sub |
Dapat dipanggil dari seluruh module dalam project. |
Private Sub |
Hanya dapat dipanggil dari module tempat prosedur tersebut berada. |
Call |
Digunakan untuk memanggil prosedur, tetapi bersifat opsional. |
NamaModule.NamaProcedure |
Digunakan jika ingin memperjelas module tujuan atau menghindari konflik nama. |
Kesimpulan
Kemampuan memanggil procedure antar module merupakan dasar penting dalam membangun aplikasi VBA yang terstruktur. Dengan membagi kode ke dalam beberapa module dan menghubungkannya melalui pemanggilan prosedur, program menjadi lebih rapi, mudah dibaca, serta lebih mudah dipelihara.
Gunakan Public untuk prosedur yang memang perlu diakses dari module lain, sedangkan Private untuk prosedur yang hanya digunakan secara internal. Pengelompokan module yang baik juga akan memudahkan pengembangan project seiring bertambahnya fitur.
Latihan Mandiri
Latihan 1
Buat dua module:
-
ModuleData -
ModuleUtama
Pada ModuleData, buat prosedur InputData() yang menampilkan pesan "Data berhasil disimpan.". Panggil prosedur tersebut dari ModuleUtama.
Latihan 2
Buat sebuah Function bernama HitungDiskon() pada ModulePerhitungan, kemudian panggil fungsi tersebut dari ModuleUtama untuk menghitung diskon sebuah produk.
Latihan 3
Buat sebuah prosedur Private pada satu module, lalu coba panggil dari module lain. Amati pesan kesalahan yang muncul. Setelah itu ubah menjadi Public dan jalankan kembali untuk melihat perbedaannya.
