Menghubungkan VBA ke dunia luar: membaca dan menulis file teks dengan FileSystemObject, menjalankan program dengan Shell, memanggil REST API dengan WinHTTP dan XMLHTTP, serta mengakses database lewat ADODB dan QueryTables

Selama ini macro bekerja di dalam dunia Office. Episode ini membuka pintunya: FileSystemObject untuk file dan folder, Shell untuk menjalankan program, WinHTTP/XMLHTTP untuk REST API, dan ADODB untuk database — empat senjata yang mengubah Excel dari pengolah data menjadi pusat integrasi.
Mengapa ini penting? Karena data tidak selalu ada di dalam workbook. Ia ada di file log, di API web, dan di database perusahaan. Macro yang bisa membaca sumber-sumber itu — tanpa menyalin-menempel manual — adalah macro yang benar-benar menghemat waktu.
FileSystemObject (FSO) adalah pustaka Windows untuk bekerja dengan file dan folder. Aktifkan via Tools → References → centang Microsoft Scripting Runtime, lalu:
Sub TulisFile()
Dim fso As Object
Dim teks As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set teks = fso.CreateTextFile("C:\vba-lab\log.txt", True)
teks.WriteLine "Baris pertama log"
teks.WriteLine "Waktu: " & Now
teks.Close
Set teks = Nothing
Set fso = Nothing
End SubMembaca file sebaliknya:
Sub BacaFile()
Dim fso As Object
Dim teks As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set teks = fso.OpenTextFile("C:\vba-lab\log.txt", 1) ' 1 = ForReading
Do While Not teks.AtEndOfStream
Debug.Print teks.ReadLine
Loop
teks.Close
Set teks = Nothing
Set fso = Nothing
End SubMode ForReading adalah 1, ForWriting = 2, ForAppending = 8. AtEndOfStream menandai akhir file — pasangan sempurna untuk Do While.
FSO juga memeriksa folder dan membuat direktori:
Sub PastikanFolder(path As String)
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(path) Then
fso.CreateFolder path
End If
Set fso = Nothing
End SubPola "buat folder jika belum ada" ini wajib sebelum menulis file output — menghindari error path not found.
Shell menjalankan program eksternal:
Shell "notepad.exe", vbNormalFocusUntuk menunggu program selesai, kombinasikan dengan WScript.Shell dan parameter WaitOnReturn:
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
wsh.Run "C:\scripts\proses.bat", 1, True
Set wsh = NothingParameter terakhir True berarti tunggu hingga selesai sebelum melanjutkan kode.
VBA bisa memanggil REST API — antarmuka web yang mengembalikan data JSON/XML. Dua objek yang umum: MSXML2.XMLHTTP (lebih mudah) dan WinHttp.WinHttpRequest.5.1 (lebih tangguh untuk produksi).
Sub AmbilAPI()
Dim http As Object
Dim hasil As String
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", "https://api.contoh.com/data", False
http.setRequestHeader "Accept", "application/json"
http.Send
If http.Status = 200 Then
hasil = http.responseText
Debug.Print Left(hasil, 200)
Else
MsgBox "HTTP " & http.Status
End If
Set http = Nothing
End SubOpen(method, url, async) — mode False (sinkron) membuat kode menunggu respons.Status — kode HTTP: 200 sukses, 404 tidak ditemukan, 401 tidak diotorisasi.responseText — isi respons.Warning
Untuk API berautentikasi, jangan pernah menaruh token/API key di dalam kode — kode bisa dibaca siapa pun yang membuka project. Simpan kredensial di sel terproteksi, file konfigurasi terpisah, atau tanyakan via InputBox. Kredensial yang bocor di macro adalah insiden keamanan nyata.
Excel VBA tidak punya parser JSON bawaan. Solusi cepat untuk data sederhana: pola Split/Mid pada string JSON pendek.
Sub BacaJSON()
Dim json As String
Dim nilai As String
json = "{""nama"":""Budi"",""usia"":30}"
nilai = Mid(json, InStr(json, """nama"":") + 8, 50)
nilai = Split(nilai, """")(0)
Debug.Print nilai ' Budi
End SubIni rapuh untuk JSON kompleks — untuk API yang serius, gunakan library parser VBA-JSON dari GitHub (episode 23 akan menyinggung sumbernya).
Database eksternal — SQL Server, MySQL, PostgreSQL — diakses dengan ADODB.Connection:
Sub AmbilDariDB()
Dim conn As Object
Dim rs As Object
Dim connStr As String
connStr = "Provider=SQLOLEDB;Data Source=server-01;" & _
"Initial Catalog=Laporan;Integrated Security=SSPI;"
Set conn = CreateObject("ADODB.Connection")
conn.Open connStr
Set rs = conn.Execute("SELECT Nama, Total FROM Penjualan WHERE Tahun = 2026")
Range("A1").CopyFromRecordset rs
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Subconn.Open dengan connection string menentukan server & database.conn.Execute(sql) menjalankan query dan mengembalikan recordset.Range.CopyFromRecordset — cara paling cepat menyalin seluruh hasil query ke sheet.QueryTables membuat "tabel hidup" yang menyegarkan datanya dari sumber eksternal — mirip Power Query versi klasik:
Sub BuatQuery()
Dim qt As Object
Set qt = ThisWorkbook.Worksheets("Data").QueryTables.Add( _
Connection:="OLEDB;Provider=SQLOLEDB;Data Source=server-01;" & _
"Initial Catalog=Laporan;Integrated Security=SSPI;", _
Destination:=Range("A1"))
qt.CommandText = "SELECT Nama, Total FROM Penjualan"
qt.Refresh
End SubData di sheet bisa disegarkan kapan pun dengan qt.Refresh — tanpa membuka ulang koneksi dari kode.
| Kesalahan | Dampak |
|---|---|
Lupa Set ... = Nothing pada FSO/koneksi | Proses/objek menggantung |
| Token API di dalam kode | Kredensial bocor ke pembaca kode |
http.Open mode False tapi memproses respons kosong | Error parsing |
| Connection string salah format | Error koneksi yang membingungkan |
| Path file diuji dengan asumsi | Error file not found; selalu FolderExists |
Pada episode 18 ini, kalian telah menghubungkan VBA ke dunia luar.
Inti yang harus dibawa pulang:
AtEndOfStream + Do While.Run(..., True) untuk menunggu selesai.Status, baca responseText; jangan taruh token di kode.CopyFromRecordset menyalin hasil query ke sheet.Refresh kapan saja.Di episode 19 selanjutnya kita membahas VBA 7.1 & fitur terbaru di Microsoft 365 — dukungan 64-bit dengan PtrSafe dan LongLong, kompatibilitas lintas versi Office, posisi VBA yang terus diperbarui bersama Office, serta batasannya seperti tidak adanya paralelisme modern. Sampai jumpa di episode 19!