Mengotomasi pengolahan data di Excel: sorting dengan Sort, filtering dengan AutoFilter, menghapus duplikat, find dan replace, memakai SpecialCells untuk sel kosong, serta pola membersihkan dan menormalkan data dalam jumlah besar

Setelah di episode 8 kalian menguasai Object Model — workbook, worksheet, dan range — kini kita gunakan untuk pekerjaan yang sebenarnya: mengolah data. Di dunia nyata, sebagian besar waktu analis data habis di tahap yang tidak glamor: sorting, memfilter, menghapus duplikat, dan membersihkan data yang berantakan.
Mengapa episode ini penting? Karena justru pekerjaan inilah yang paling sering diotomasi dengan VBA. Sebuah laporan mingguan yang isinya "sortir, filter, hapus duplikat, bereskan format" adalah kandidat otomasi sempurna — dan setelah episode ini, kalian bisa menuliskannya dalam satu macro.
Range.Sort mengurutkan data dengan kontrol penuh atas kolom kunci dan arahnya:
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Range("A1:D" & lastRow).Sort _
Key1:=Range("B2"), Order1:=xlAscending, _
Header:=xlYesParameter penting:
| Parameter | Fungsi |
|---|---|
Key1/Key2 | Kolom kunci pengurutan |
Order1 | xlAscending / xlDescending |
Header | xlYes jika baris pertama adalah judul |
Untuk pengurutan bertingkat, tambahkan Key2:
Range("A1:D" & lastRow).Sort _
Key1:=Range("B2"), Order1:=xlAscending, _
Key2:=Range("C2"), Order2:=xlDescending, _
Header:=xlYesAutoFilter menyaring data sesuai kriteria — setara mengeklik ikon corong:
Range("A1:D" & lastRow).AutoFilter
Range("A1:D" & lastRow).AutoFilter _
Field:=3, Criteria1:=">=75"Field:=3 berarti kolom ketiga dari rentang, Criteria1:=">=75" adalah kriteria nilainya. Untuk beberapa kriteria:
Range("A1:D" & lastRow).AutoFilter _
Field:=3, Criteria1:=">=" & 75, Operator:=xlAnd, Criteria2:="<=100"Bagaimana mengetahui berapa baris yang lolos filter? Semua Range sudah tersedia — tinggal berjalan dari baris data pertama:
Dim r As Long
Dim jumlah As Long
jumlah = 0
For r = 2 To lastRow
If Rows(r).Hidden = False Then
jumlah = jumlah + 1
End If
Next r
Debug.Print "Baris terlihat: " & jumlahPola ini juga bisa digunakan untuk menyalin hasil filter ke sheet lain dengan Range.SpecialCells(xlCellTypeVisible) — dipakai di banyak laporan.
Tip
Untuk menyalin hasil filter, jangan salin seluruh range — itu ikut menyalin baris tersembunyi. Gunakan Range.SpecialCells(xlCellTypeVisible).Copy lalu tempel ke tujuan. Hasilnya persis baris yang terlihat.
Range.RemoveDuplicates membersihkan data kembar dalam satu perintah:
Range("A1:D" & lastRow).RemoveDuplicates _
Columns:=Array(1, 2), Header:=xlYesColumns:=Array(1, 2) berarti kombinasi kolom 1 dan 2 menentukan keunikan. Baris yang muncul belakangan dibuang; baris pertama dipertahankan.
Pencarian data dengan Find mengembalikan objek Range:
Dim target As Range
Set target = Range("A1:A" & lastRow).Find(What:="Selesai", LookAt:=xlWhole)
If Not target Is Nothing Then
Debug.Print "Ditemukan di " & target.Address
Else
Debug.Print "Tidak ditemukan"
End IfPastikan selalu memeriksa Is Nothing — jika tidak ketemu, Find mengembalikan Nothing, dan memakai variabel yang Nothing memicu error.
Replace bekerja serupa dan bisa menjangkau seluruh sheet:
Cells.Replace What:="-", Replacement:="", LookAt:=xlPartSpecialCells menyeleksi sel dengan karakteristik tertentu — kosong, formula, konstanta, atau terlihat. Kasus paling umum: menghapus baris kosong.
Dim cell As Range
Dim barisHapus As String
barisHapus = ""
For Each cell In Range("A1:A" & lastRow)
If Trim(cell.Value) = "" Then
barisHapus = barisHapus & cell.Row & ","
End If
Next cell
If Len(barisHapus) > 0 Then
Range("A" & Replace(barisHapus, ",", ",A")).EntireRow.Delete
End IfWarning
Jangan menghapus baris di dalam For Each sambil menelusuri — mengubah ukuran range saat di-loop merusak urutan iterasi. Kumpulkan nomor baris dulu (seperti kode di atas), baru hapus setelah loop selesai.
Cara lebih cepat untuk menghapus semua sel kosong sekaligus:
On Error Resume Next
Range("A1:C" & lastRow).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp
On Error GoTo 0xlCellTypeBlanks gagal (melempar error) jika tidak ada satu pun sel kosong — karena itu On Error Resume Next melindungi baris ini. Pola On Error akan dibahas tuntas di episode 15.
Bersih-bersih terakhir: rapikan format agar laporan konsisten.
With Range("A1:D" & lastRow)
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlCenter
.Font.Name = "Calibri"
.Font.Size = 11
.WrapText = False
End WithBlok With...End With menghindari menulis Range("A1:D" & lastRow) berulang-ulang — objek direferensikan sekali, properti diubah banyak. Ini pola VBA yang sangat idiomatis.
Mari satukan semuanya menjadi satu macro yang meniru pekerjaan harian analis data:
Sub PipelineBersih()
Dim ws As Worksheet
Dim lastRow As Long
Dim cell As Range
Set ws = ThisWorkbook.Worksheets("Data")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
With ws
.Range("A1:D" & lastRow).RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
.Cells.Replace What:="n/a", Replacement:="", LookAt:=xlWhole
.Range("A1:D" & lastRow).AutoFilter
.Range("A1:D" & lastRow).AutoFilter Field:=3, Criteria1:="<>"
.Range("A1:D" & lastRow).Sort Key1:=.Range("B2"), Header:=xlYes
End With
End SubSetelah pipeline ini, data sudah di-deduplikasi, nilai "n/a" dibersihkan, baris tanpa nilai di kolom 3 difilter, dan diurutkan. Satu klik untuk pekerjaan 30 menit.
| Kesalahan | Dampak |
|---|---|
Sort dengan Header:=xlNo padahal ada judul | Judul ikut teracak |
| Menghapus baris dalam loop | Baris terlewat / salah hapus |
Tidak cek Is Nothing setelah Find | Error runtime saat target tak ada |
SpecialCells(xlCellTypeBlanks) tanpa On Error | Error saat tak ada sel kosong |
| AutoFilter lama tidak dimatikan sebelum filter baru | Kriteria menumpuk membingungkan |
Pada episode 9 ini, kalian telah mengotomasi pengolahan data di Excel.
Inti yang harus dibawa pulang:
Sort dengan Key1, Order1, Header untuk pengurutan 1-2 tingkat.AutoFilter dengan Field dan Criteria1 untuk menyaring; baca hasil via properti Hidden.RemoveDuplicates membersihkan data kembar; Find/Replace mencari dan mengganti nilai.SpecialCells(xlCellTypeVisible) untuk menyalin hasil filter; xlCellTypeBlanks untuk sel kosong.Di episode 10 selanjutnya kita membahas loop range & array untuk performa — membaca range ke array memori, memprosesnya di sana, dan menuliskan kembali, yang bisa membuat macro ratusan kali lebih cepat dibanding mengakses sel satu per satu. Sampai jumpa di episode 10!