Mengotomasi database desktop Access: bekerja dengan Recordsets lewat DAO dan ADODB, menjalankan SQL langsung dari VBA, memakai DoCmd dan event Form Report, serta studi kasus CRUD, import Excel, dan laporan otomatis

Setelah mengotomasi Excel dan Word, kini kita menjangkau Access — database desktop Microsoft yang sering menjadi "gudang data" untuk aplikasi perkantoran. Access VBA berbeda dari Excel/Word karena ini pertama kalinya kita berurusan dengan basis data: tabel, kueri SQL, dan recordsets.
Mengapa ini penting? Karena banyak departemen menyimpan data operasional di Access — inventaris, kepegawaian, penjualan — dan datanya harus di-import, di-CRUD, dan dilaporkan. Access VBA memberi kalian kontrol langsung: menjalankan SQL, membaca recordset, dan menautkan Form/Report ke data.
Note
Access tidak tersedia di macOS. Episode ini membutuhkan mesin Windows dengan Microsoft Access terpasang. Jika belum punya, kalian tetap bisa mengikuti konsepnya — Recordsets, DAO/ADODB, dan SQL yang dibahas di sini identik dengan yang dipakai di database lain.
Access menyediakan dua pustaka akses data:
| Pustaka | Karakter | Kapan Dipakai |
|---|---|---|
| DAO | Asli Access, efisien untuk file .accdb | Operasi pada Access itu sendiri |
| ADODB | Umum, bisa ke SQL Server, Oracle, dll. | Akses database non-Access |
Keduanya tersedia dari menu Tools → References di VBE (Microsoft DAO 3.6 Object Library, Microsoft ActiveX Data Objects). DAO sudah otomatis terreferensi di Access.
Di Access, objek kunci adalah CurrentDb — database yang sedang dibuka:
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM Penjualan")Baris SELECT * FROM Penjualan adalah SQL — bahasa query yang sama dipakai di semua database. Dengan recordset di tangan, kalian bisa berjalan di atas datanya.
Recordset ibarat tabel virtual yang bisa ditelusuri baris per baris:
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim total As Currency
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM Penjualan")
Do While Not rs.EOF
total = total + rs!Jumlah
rs.MoveNext
Loop
MsgBox "Total penjualan: " & Format(total, "#,##0")
rs.Close
Set rs = NothingPoin penting:
rs.EOF (End Of File) menandai akhir recordset — loop berjalan sampai di sini.rs!Jumlah membaca kolom Jumlah dari baris saat ini (bisa juga rs("Jumlah")).rs.MoveNext melangkah ke baris berikutnya.Set ... = Nothing) setelah dipakai.Untuk query yang hanya butuh dieksekusi — update, delete, insert — pakai db.Execute:
Dim db As DAO.Database
Set db = CurrentDb
db.Execute "UPDATE Penjualan SET Status = 'Dipesan' WHERE Tanggal < #2026-01-01#"
db.Execute "DELETE FROM Penjualan WHERE Jumlah = 0"Perhatikan notasi tanggal di SQL Access memakai pagar (#...#). db.Execute juga bisa menangkap berapa baris yang terpengaruh:
Dim db As DAO.Database
Set db = CurrentDb
db.Execute "DELETE FROM LogLama"
Debug.Print db.RecordsAffected & " baris dihapus"Mengimpor data Excel ke tabel Access bisa lewat kode VBA Access menggunakan DoCmd.TransferSpreadsheet:
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, _
"Penjualan", "C:\data\penjualan.xlsx", True, "Sheet1!A1:H500"| Parameter | Arti |
|---|---|
acImport | Mode: impor |
acSpreadsheetTypeExcel12Xml | Format .xlsx |
"Penjualan" | Tabel tujuan |
"C:\data\penjualan.xlsx" | File sumber |
True | Baris pertama adalah header |
"Sheet1!A1:H500" | Rentang sumber |
Setelah impor, data langsung bisa diquery seperti tabel lain.
Warning
Impor berulang dari file yang sama bisa menimbulkan duplikat. Biasakan menghapus data lama di tabel tujuan sebelum impor (DELETE FROM Penjualan) agar tabel menjadi snapshot bersih, bukan penumpukan.
Di Access, kebanyakan aplikasi berinteraksi dengan Form — antarmuka yang menampilkan dan mengedit data. Event VBA melekat pada kontrol form. Contoh: tombol Simpan dengan logika validasi.
Private Sub btnSimpan_Click()
If Me.txtNama.Value = "" Then
MsgBox "Nama tidak boleh kosong", vbExclamation
Exit Sub
End If
CurrentDb.Execute "INSERT INTO Penjualan (Nama, Jumlah) VALUES (" & _
"'" & Replace(Me.txtNama.Value, "'", "''") & "', " & _
Me.txtJumlah.Value & ")"
Me.Requery
End SubDua hal penting di sini:
Me merujuk ke Form tempat kode berada.Replace(..., "'", "''") mencegah SQL injection — menggandakan tanda kutip tunggal di dalam teks agar tidak merusak struktur SQL. Tanpa ini, input O'Brien memecah query dan berpotensi disalahgunakan.Event Form_Load berjalan setiap kali form dibuka — tempat ideal untuk mengisi kontrol:
Private Sub Form_Load()
Me.cboBulan.RowSource = _
"SELECT DISTINCT Bulan FROM Penjualan ORDER BY Bulan"
End SubRowSource mengisi ComboBox langsung dari SQL — pola yang membuat form tetap sinkron dengan data.
Laporan Access adalah objek Report. Membuka laporan dengan filter tertentu dilakukan dengan DoCmd:
DoCmd.OpenReport "rptPenjualan", acViewPreview, _
WhereCondition:="Bulan = 'Januari'"WhereCondition menerapkan filter sebelum laporan dirender — hasilnya laporan hanya menampilkan data Januari tanpa mengubah struktur laporan.
| Kesalahan | Dampak |
|---|---|
Lupa rs.MoveNext | Infinite loop |
| Tidak menutup/melepas recordset | Kunci database / error saat akses ulang |
Input tanpa escape ' | Error SQL atau SQL injection |
Notasi tanggal salah (pakai #...#) | Query salah / error |
CurrentDb dipakai di database tertutup | Error Not a database |
Pada episode 12 ini, kalian telah mengotomasi database Access.
Inti yang harus dibawa pulang:
References.EOF, !Kolom, dan MoveNext; selalu Close + Nothing.db.Execute menjalankan SQL update/delete/insert; tanggal pakai #...#.DoCmd.TransferSpreadsheet mengimpor Excel; OpenReport membuka laporan ber-filter.Di episode 13 selanjutnya kita akan mengotomasi Outlook dan PowerPoint — membuat email otomatis dengan CreateItem, membaca inbox, mengelola kalender, menyusun slide dari data, dan mengekspor deck. Sampai jumpa di episode 13!