VBA Cơ Bản Cho Người Mới Bắt Đầu: Tự Động Hoá Excel Từ Con Số 0
Chia sẻ
"Hướng dẫn VBA Excel từ A-Z cho người mới: bật Developer Tab, Macro Recorder, viết code Sub, biến, If/Else, vòng lặp, Range/Cells, và ví dụ format báo cáo tự động. Kèm file demo .xlsm."
VBA Là Gì Và Tại Sao Dân Văn Phòng Cần Học?
Bạn đã bao giờ dành cả buổi sáng để lặp đi lặp lại một thao tác trên Excel — copy dữ liệu, format bảng, tạo báo cáo — rồi tự hỏi "chắc chắn có cách nào nhanh hơn"? Câu trả lời chính là VBA (Visual Basic for Applications) — ngôn ngữ lập trình được tích hợp sẵn trong Excel, giúp bạn tự động hóa mọi thao tác chỉ với vài dòng code.
Trong bài viết này, bạn sẽ đi từ con số 0 đến viết được macro đầu tiên, hiểu cách VBA hoạt động, và áp dụng ngay vào công việc hàng ngày. Không cần kinh nghiệm lập trình — chỉ cần biết dùng Excel cơ bản là đủ.
💡 Lưu ý: Bài viết đi kèm file demo
.xlsmcó sẵn tất cả code mẫu. Bạn có thể tải về cuối bài để vừa đọc vừa thực hành.
1. VBA Là Gì? Hiểu Đúng Trong 2 Phút
VBA là viết tắt của Visual Basic for Applications — một ngôn ngữ lập trình do Microsoft phát triển, được nhúng sẵn trong bộ Office (Excel, Word, PowerPoint, Access). Khi bạn viết VBA trong Excel, bạn đang "ra lệnh" cho Excel thực hiện các thao tác tự động.
Hãy hình dung thế này:
Không có VBA: Bạn mở 50 file Excel → copy dữ liệu → paste → format → lưu. Mất 2 tiếng.
Có VBA: Bạn nhấn 1 nút → Excel tự xử lý 50 file trong 30 giây.
VBA Khác Gì Macro?
Nhiều người nhầm lẫn Macro và VBA. Thực tế:
Macro là hành động được ghi lại (record) — như ghi hình các bước bạn làm.
VBA là code đằng sau macro — bạn có thể viết, chỉnh sửa, và mở rộng.
Macro Recorder tạo ra code VBA. Nhưng VBA có thể làm nhiều hơn Record rất nhiều.
Khi Nào Nên Dùng VBA?
Thao tác lặp lại hàng ngày (format, copy, tạo báo cáo)
Xử lý dữ liệu hàng loạt (gộp file, lọc data, xuất PDF)
Tạo form nhập liệu thay vì nhập trực tiếp vào sheet
Gửi email tự động từ Excel qua Outlook
Tạo báo cáo tự động và phân phối cho team
2. Bước Đầu Tiên: Bật Tab Developer Trong Excel
Mặc định, Excel ẩn tab Developer — nơi chứa tất cả công cụ VBA. Bạn cần bật nó lên trước.
Cách Bật Developer Tab
Mở Excel → vào File → Options
Chọn Customize Ribbon ở menu bên trái
Ở cột bên phải, tích chọn Developer → nhấn OK
Sau khi bật, bạn sẽ thấy tab Developer xuất hiện trên thanh Ribbon với các nút: Visual Basic, Macros, Record Macro, Form Controls...
Lưu File Dạng .xlsm
⚠️ Quan trọng: File Excel thường (.xlsx) không lưu được VBA code. Bạn phải lưu dạng .xlsm (Excel Macro-Enabled Workbook). Khi lưu, chọn Save As → đổi định dạng thành Excel Macro-Enabled Workbook (*.xlsm).
3. Ghi Macro Đầu Tiên Bằng Macro Recorder
Trước khi viết code, hãy thử dùng Macro Recorder — công cụ "ghi hình" các thao tác Excel thành code VBA tự động. Đây là cách nhanh nhất để tạo macro mà không cần biết lập trình.
Ví Dụ: Ghi Macro Format Bảng
Giả sử bạn muốn tự động format một bảng dữ liệu: bold hàng tiêu đề, tô màu nền, căn giữa.
Vào tab Developer → nhấn Record Macro
Đặt tên:
FormatBang, nhấn OKThực hiện các thao tác: chọn hàng 1 → bold → tô nền xanh → căn giữa
Quay lại Developer → nhấn Stop Recording
Bây giờ, nhấn Alt+F11 để mở VBA Editor. Bạn sẽ thấy code được tạo tự động:
Sub FormatBang()
'
' FormatBang Macro
' Tự động format bảng dữ liệu
'
Rows("1:1").Select
Selection.Font.Bold = True
With Selection.Interior
.Color = RGB(31, 78, 121)
End With
Selection.Font.Color = RGB(255, 255, 255)
Selection.HorizontalAlignment = xlCenter
End SubTừ giờ, mỗi khi cần format bảng, bạn chỉ cần chạy macro này thay vì làm tay từng bước.
4. Làm Quen Với VBA Editor (Alt+F11)
Nhấn Alt+F11 để mở VBA Editor (hay còn gọi là VBE — Visual Basic Editor). Đây là nơi bạn viết, chỉnh sửa và debug code VBA.
Các Thành Phần Chính
Project Explorer (Ctrl+R): Hiển thị cây thư mục của workbook — gồm các Sheet, ThisWorkbook, Module, UserForm.
Code Window: Nơi viết code. Mỗi Module hoặc Sheet có một code window riêng.
Properties Window (F4): Hiển thị thuộc tính của đối tượng đang chọn.
Immediate Window (Ctrl+G): Chạy code nhanh, kiểm tra giá trị biến khi debug.
Tạo Module Mới
Để viết code VBA mới:
Trong Project Explorer, click chuột phải vào tên workbook
Chọn Insert → Module
Một Module mới xuất hiện — bạn viết code ở đây
💡 Mẹo: Luôn viết code trong Module riêng, không viết trực tiếp vào Sheet. Điều này giúp code dễ quản lý và tái sử dụng.
5. Viết Sub Đầu Tiên: MsgBox Và InputBox
Trong VBA, mỗi "chương trình con" được gọi là một Sub (Subroutine). Cú pháp cơ bản:
Sub TenMacro()
' Code của bạn ở đây
End SubMsgBox — Hiển Thị Thông Báo
MsgBox dùng để hiện hộp thoại thông báo cho người dùng:
Sub ChaoMung()
MsgBox "Xin chào! Bạn vừa chạy macro đầu tiên.", vbInformation, "Thông báo"
End SubKhi chạy, Excel sẽ hiện một popup với nội dung "Xin chào!..." và icon thông tin.
InputBox — Nhập Dữ Liệu
InputBox cho phép người dùng nhập dữ liệu vào:
Sub NhapTen()
Dim hoTen As String
hoTen = InputBox("Nhập họ tên của bạn:", "Nhập liệu")
If hoTen <> "" Then
MsgBox "Xin chào, " & hoTen & "!", vbExclamation, "Lời chào"
End If
End SubỞ đây bạn thấy lệnh Dim — dùng để khai báo biến. Chúng ta sẽ tìm hiểu chi tiết ở phần tiếp theo.
6. Biến Và Kiểu Dữ Liệu Trong VBA
Biến là "hộp chứa" để lưu trữ dữ liệu tạm thời trong quá trình chạy code. Khai báo biến bằng từ khóa Dim:
Dim tenBien As KieuDuLieuCác Kiểu Dữ Liệu Phổ Biến
Dưới đây là các kiểu dữ liệu bạn sẽ dùng nhiều nhất:
String— Chuỗi văn bản:"Nguyễn Văn A"Integer— Số nguyên nhỏ (-32,768 đến 32,767)Long— Số nguyên lớn (dùng cho dòng/cột Excel)Double— Số thập phân:3.14,1500000.50Boolean— Đúng/Sai:TruehoặcFalseDate— Ngày tháng:#12/25/2024#Variant— Tự động nhận diện kiểu (không khuyến khích vì chậm)
Ví Dụ Thực Tế
Sub TinhLuong()
Dim hoTen As String
Dim soNgayCong As Integer
Dim luongNgay As Double
Dim tongLuong As Double
hoTen = "Nguyễn Thị Lan"
soNgayCong = 22
luongNgay = 500000
tongLuong = soNgayCong * luongNgay
MsgBox hoTen & " - Tổng lương: " & Format(tongLuong, "#,##0") & " VNĐ"
' Kết quả: Nguyễn Thị Lan - Tổng lương: 11,000,000 VNĐ
End Sub💡 Best practice: Luôn khai báo
Option Explicitở đầu Module. Điều này bắt buộc bạn phải khai báo biến trước khi dùng, giúp tránh lỗi typo.
7. Câu Lệnh Điều Kiện: If...Then...Else
Giống như hàm IF trong Excel, VBA cũng có câu lệnh điều kiện. Nhưng mạnh hơn rất nhiều vì bạn có thể thực hiện nhiều hành động trong mỗi nhánh.
Cú Pháp Cơ Bản
If điều_kiện Then
' Code khi điều kiện đúng
ElseIf điều_kiện_2 Then
' Code khi điều kiện 2 đúng
Else
' Code khi tất cả sai
End IfVí Dụ: Xếp Loại Nhân Viên
Sub XepLoaiNhanVien()
Dim diem As Double
Dim xepLoai As String
diem = InputBox("Nhập điểm đánh giá (0-100):", "Xếp loại")
If diem >= 90 Then
xepLoai = "Xuất sắc"
ElseIf diem >= 75 Then
xepLoai = "Giỏi"
ElseIf diem >= 60 Then
xepLoai = "Khá"
ElseIf diem >= 50 Then
xepLoai = "Trung bình"
Else
xepLoai = "Yếu"
End If
MsgBox "Điểm: " & diem & vbNewLine & "Xếp loại: " & xepLoai
End SubSelect Case — Khi Có Nhiều Nhánh
Khi có quá nhiều ElseIf, dùng Select Case sẽ gọn hơn:
Sub XepLoaiThang()
Dim thang As Integer
thang = Month(Date) ' Lấy tháng hiện tại
Select Case thang
Case 1 To 3
MsgBox "Quý 1"
Case 4 To 6
MsgBox "Quý 2"
Case 7 To 9
MsgBox "Quý 3"
Case 10 To 12
MsgBox "Quý 4"
End Select
End Sub8. Vòng Lặp: For...Next Và Do...Loop
Vòng lặp là "siêu năng lực" của VBA — cho phép bạn lặp qua hàng ngàn dòng dữ liệu trong tích tắc.
For...Next — Lặp Với Số Lần Xác Định
Sub DanhSoThuTu()
Dim i As Long
For i = 1 To 100
Cells(i, 1).Value = "STT " & i
Next i
MsgBox "Đã đánh số từ 1 đến 100!"
End SubFor Each — Lặp Qua Tập Hợp
Sub InDanhSachSheet()
Dim ws As Worksheet
Dim danhSach As String
For Each ws In ThisWorkbook.Worksheets
danhSach = danhSach & ws.Name & vbNewLine
Next ws
MsgBox "Các sheet trong workbook:" & vbNewLine & danhSach
End SubDo While — Lặp Đến Khi Hết Dữ Liệu
Rất hữu ích khi không biết trước có bao nhiêu dòng dữ liệu:
Sub DocDuLieu()
Dim dong As Long
dong = 2 ' Bắt đầu từ dòng 2 (dòng 1 là tiêu đề)
Do While Cells(dong, 1).Value <> ""
' Xử lý từng dòng
Cells(dong, 3).Value = Cells(dong, 1).Value & " - " & Cells(dong, 2).Value
dong = dong + 1
Loop
MsgBox "Đã xử lý " & (dong - 2) & " dòng dữ liệu."
End Sub9. Thao Tác Với Range, Cells Và Worksheets
Đây là phần quan trọng nhất — vì 90% code VBA trong thực tế đều liên quan đến việc đọc/ghi dữ liệu từ các ô trong Excel.
Range — Chọn Ô/Vùng Dữ Liệu
' Ghi giá trị vào 1 ô
Range("A1").Value = "Họ Tên"
' Ghi vào vùng
Range("A1:D1").Value = Array("Họ Tên", "Phòng Ban", "Chức Vụ", "Lương")
' Bold + tô màu vùng
Range("A1:D1").Font.Bold = True
Range("A1:D1").Interior.Color = RGB(31, 78, 121)
Range("A1:D1").Font.Color = RGB(255, 255, 255)Cells — Truy Cập Theo Dòng/Cột
' Cells(dòng, cột)
Cells(1, 1).Value = "A1" ' Ô A1
Cells(2, 3).Value = "C2" ' Ô C2
' Rất hữu ích trong vòng lặp:
For i = 1 To 10
Cells(i, 1).Value = i ' Cột A
Cells(i, 2).Value = i * 100 ' Cột B
Next iWorksheets — Làm Việc Nhiều Sheet
' Truy cập sheet theo tên
Worksheets("Sheet1").Range("A1").Value = "Dữ liệu"
' Truy cập sheet theo thứ tự
Worksheets(2).Activate
' Copy dữ liệu giữa các sheet
Worksheets("Nguon").Range("A1:D100").Copy
Worksheets("DuLieu").Range("A1").PasteSpecial xlPasteValues
' Thêm sheet mới
Dim wsNew As Worksheet
Set wsNew = Worksheets.Add(After:=Worksheets(Worksheets.Count))
wsNew.Name = "BaoCao_" & Format(Date, "DDMMYYYY")10. Ví Dụ Thực Tế: Tự Động Format Báo Cáo Bán Hàng
Hãy kết hợp mọi thứ đã học để tạo một macro thực tế — tự động format bảng báo cáo bán hàng với tiêu đề đẹp, số có dấu phân cách, và tô màu xen kẽ.
Sub FormatBaoCaoBanHang()
Dim ws As Worksheet
Dim lastRow As Long
Dim lastCol As Long
Dim i As Long
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
' === 1. Format tiêu đề ===
With ws.Range(ws.Cells(1, 1), ws.Cells(1, lastCol))
.Font.Bold = True
.Font.Color = RGB(255, 255, 255)
.Font.Size = 11
.Font.Name = "Calibri"
.Interior.Color = RGB(31, 78, 121)
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.RowHeight = 25
End With
' === 2. Format dữ liệu ===
With ws.Range(ws.Cells(2, 1), ws.Cells(lastRow, lastCol))
.Font.Name = "Calibri"
.Font.Size = 11
.Borders.LineStyle = xlContinuous
.Borders.Weight = xlThin
End With
' === 3. Tô màu xen kẽ ===
For i = 2 To lastRow
If i Mod 2 = 0 Then
ws.Range(ws.Cells(i, 1), ws.Cells(i, lastCol)).Interior.Color = RGB(221, 235, 247)
End If
Next i
' === 4. AutoFit cột ===
ws.Columns.AutoFit
' === 5. Format số (giả sử cột cuối là tiền) ===
ws.Range(ws.Cells(2, lastCol), ws.Cells(lastRow, lastCol)).NumberFormat = "#,##0"
MsgBox "Đã format báo cáo thành công!" & vbNewLine & _
"Tổng: " & (lastRow - 1) & " dòng, " & lastCol & " cột.", _
vbInformation, "Hoàn tất"
End SubCode trên sẽ tự động phát hiện kích thước bảng dữ liệu và format hoàn chỉnh — bất kể bảng có bao nhiêu dòng hay cột.
11. Debug Và Xử Lý Lỗi Cơ Bản
Khi viết VBA, lỗi là chuyện bình thường. Quan trọng là biết cách tìm và sửa.
Các Phím Debug Quan Trọng
F8 — Chạy từng dòng (Step Into). Xem code thực thi dòng nào.
F5 — Chạy toàn bộ macro.
F9 — Đặt/gỡ breakpoint (điểm dừng) tại dòng hiện tại.
Ctrl+G — Mở Immediate Window để kiểm tra giá trị.
Dùng Debug.Print
Sub KiemTraGiaTri()
Dim x As Long
x = Range("A1").Value
Debug.Print "Giá trị A1 = " & x ' In ra Immediate Window
Debug.Print "Kiểu dữ liệu: " & TypeName(x)
End SubOn Error — Bắt Lỗi
Sub XuLyLoi()
On Error GoTo LoiXayRa
' Code có thể gây lỗi
Dim result As Double
result = 100 / Range("A1").Value ' Lỗi nếu A1 = 0
MsgBox "Kết quả: " & result
Exit Sub
LoiXayRa:
MsgBox "Có lỗi xảy ra: " & Err.Description, vbCritical, "Lỗi"
End Sub12. Mẹo Và Best Practices Khi Viết VBA
Luôn dùng Option Explicit — đặt ở đầu mỗi Module để tránh lỗi biến chưa khai báo.
Đặt tên biến có ý nghĩa —
tongLuongthay vìx,lastRowthay vìr.Comment code — dùng dấu nháy đơn
'để viết ghi chú. Rất quan trọng khi bạn quay lại đọc code sau vài tháng.Tắt screen updating khi xử lý lượng lớn dữ liệu để tăng tốc:
Sub MacroNhanh()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' ... code xử lý nặng ...
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End SubDùng With...End With để gom nhiều thao tác trên cùng đối tượng:
' Thay vì:
Range("A1").Font.Bold = True
Range("A1").Font.Size = 14
Range("A1").Font.Color = vbRed
' Viết gọn:
With Range("A1").Font
.Bold = True
.Size = 14
.Color = vbRed
End WithCâu Hỏi Thường Gặp (FAQ)
VBA có khó học không?
Không. VBA là một trong những ngôn ngữ lập trình dễ nhất để bắt đầu, đặc biệt nếu bạn đã quen Excel. Cú pháp gần với tiếng Anh tự nhiên và bạn thấy kết quả trực tiếp trên bảng tính.
VBA có chạy được trên Mac không?
Có, nhưng một số tính năng bị giới hạn trên Mac (ví dụ: UserForm có giao diện khác, không tương tác được với Outlook). Phần lớn code cơ bản chạy bình thường trên cả Windows và Mac.
File .xlsm có an toàn không?
File .xlsm có thể chứa code nguy hiểm nếu đến từ nguồn không đáng tin. Excel mặc định chặn macro từ file nhận qua email. Bạn chỉ nên bật macro cho file từ nguồn tin cậy.
VBA có lỗi thời không? Nên học VBA hay Python?
VBA vẫn cực kỳ hữu ích cho công việc văn phòng vì tích hợp trực tiếp trong Excel. Python mạnh hơn cho data science và automation phức tạp. Khuyến khích: Học VBA trước (nhanh, áp dụng ngay) → sau đó mở rộng sang Python khi cần.
Làm sao để chạy macro sau khi viết xong?
Có 3 cách: (1) Nhấn F5 trong VBA Editor, (2) Vào tab Developer → Macros → chọn macro → Run, (3) Gán macro vào một Button trên sheet để click chạy.
Kết Luận
VBA không phải là kỹ năng khó, mà là đòn bẩy giúp bạn từ một người dùng Excel bình thường trở thành người làm việc hiệu quả gấp 10 lần. Từ những macro đơn giản như format bảng, đến các chương trình phức tạp xử lý hàng ngàn dòng dữ liệu — tất cả đều bắt đầu từ những kiến thức cơ bản trong bài viết này.
Hãy bắt đầu bằng cách tải file demo bên dưới, mở VBA Editor, và thử chạy từng macro mẫu. Bạn sẽ bất ngờ khi thấy mình viết code nhanh hơn tưởng tượng! 🚀
Đọc Thêm
Bình luận
Đăng nhập để tham gia bình luận
Đăng nhậpNhận bài viết mới nhất
Đăng ký để nhận thông báo khi có bài viết mới. Không spam, chỉ kiến thức chất lượng.
Bài viết liên quan
Khám phá thêm các bài viết cùng chủ đề


