Belajar VBA - Access VBA: Recordsets, SQL & Form
Series/Belajar VBA/Episode 12
Episode 12 of 25

Belajar VBA - Access VBA: Recordsets, SQL & Form

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

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

Pendahuluan

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.

Dua Teknologi Data: DAO vs ADODB

Access menyediakan dua pustaka akses data:

PustakaKarakterKapan Dipakai
DAOAsli Access, efisien untuk file .accdbOperasi pada Access itu sendiri
ADODBUmum, 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.

Database dan CurrentDb

Di Access, objek kunci adalah CurrentDb — database yang sedang dibuka:

Buka database dan siapkan recordset DAO
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.

Membaca Recordset

Recordset ibarat tabel virtual yang bisa ditelusuri baris per baris:

Menghitung total dengan recordset
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 = Nothing

Poin 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.
  • Recordset harus ditutup dan dilepaskan (Set ... = Nothing) setelah dipakai.

SQL Langsung dari VBA

Untuk query yang hanya butuh dieksekusi — update, delete, insert — pakai db.Execute:

Menjalankan SQL tanpa hasil
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:

Menghitung baris yang terpengaruh
Dim db As DAO.Database
Set db = CurrentDb
 
db.Execute "DELETE FROM LogLama"
Debug.Print db.RecordsAffected & " baris dihapus"

Import Excel ke Access

Mengimpor data Excel ke tabel Access bisa lewat kode VBA Access menggunakan DoCmd.TransferSpreadsheet:

Import dari file Excel
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, _
    "Penjualan", "C:\data\penjualan.xlsx", True, "Sheet1!A1:H500"
ParameterArti
acImportMode: impor
acSpreadsheetTypeExcel12XmlFormat .xlsx
"Penjualan"Tabel tujuan
"C:\data\penjualan.xlsx"File sumber
TrueBaris 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.

CRUD Lewat Form

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.

Event tombol Simpan pada Form
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 Sub

Dua 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: Form_Load

Event Form_Load berjalan setiap kali form dibuka — tempat ideal untuk mengisi kontrol:

Mengisi ComboBox saat form dibuka
Private Sub Form_Load()
    Me.cboBulan.RowSource = _
        "SELECT DISTINCT Bulan FROM Penjualan ORDER BY Bulan"
End Sub

RowSource mengisi ComboBox langsung dari SQL — pola yang membuat form tetap sinkron dengan data.

Report Otomatis

Laporan Access adalah objek Report. Membuka laporan dengan filter tertentu dilakukan dengan DoCmd:

Membuka laporan dengan filter
DoCmd.OpenReport "rptPenjualan", acViewPreview, _
    WhereCondition:="Bulan = 'Januari'"

WhereCondition menerapkan filter sebelum laporan dirender — hasilnya laporan hanya menampilkan data Januari tanpa mengubah struktur laporan.

Common Pitfalls

KesalahanDampak
Lupa rs.MoveNextInfinite loop
Tidak menutup/melepas recordsetKunci database / error saat akses ulang
Input tanpa escape 'Error SQL atau SQL injection
Notasi tanggal salah (pakai #...#)Query salah / error
CurrentDb dipakai di database tertutupError Not a database

Penutup

Pada episode 12 ini, kalian telah mengotomasi database Access.

Inti yang harus dibawa pulang:

  • DAO untuk Access, ADODB untuk database lain; keduanya via References.
  • Recordset ditelusuri dengan 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.
  • Escape tanda kutip tunggal pada input untuk mencegah SQL injection.

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!

Belajar VBA - Access VBA: Recordsets, SQL & Form | Belajar VBA