Excel Vba Programming For Dummies: Hướng Dẫn Toàn Diện Từ Cơ Bản Đến Nâng Cao

Mục lục bài viết

Giới thiệu chung về VBA và lý do bạn nên học

Microsoft Excel không chỉ là một công cụ tính toán đơn giản mà còn là một nền tảng mạnh mẽ cho việc tự động hoá quy trình công việc. VBA (Visual Basic for Applications) là ngôn ngữ lập trình tích hợp sẵn trong Excel, cho phép bạn viết macro, tạo giao diện người dùng, xử lý dữ liệu lớn và tương tác với các ứng dụng Office khác. Nếu bạn chưa từng viết một dòng code nào, đừng lo lắng—bài viết này được thiết kế dành cho “dummies”, tức là người mới bắt đầu, nhưng cũng cung cấp đủ chiều sâu để bạn có thể tiến tới các dự án phức tạp hơn.

Trong phần này, chúng ta sẽ:

  1. Hiểu cơ bản về môi trường VBA: Mở trình chỉnh sửa, cấu trúc một macro cơ bản.
  2. Nắm vững cú pháp và các khái niệm quan trọng: Biến, kiểu dữ liệu, vòng lặp, điều kiện.
  3. Áp dụng VBA vào các tình huống thực tế: Tự động hoá nhập liệu, tạo báo cáo, gửi email.
  4. Tối ưu hoá và bảo trì mã nguồn: Debug, comment, modularization.
  5. Mở rộng: Gọi API, làm việc với các file khác, tạo form người dùng.

Bây giờ, chúng ta sẽ đi từng bước một, bắt đầu từ cài đặt môi trường cho tới việc triển khai một dự án hoàn chỉnh.

1. Cài đặt và mở môi trường VBA trong Excel

1.1 Kích hoạt tab “Developer”

Mặc định, Excel không hiển thị tab “Developer”. Để bật:

  1. File → Options → Customize Ribbon.
  2. Trong danh sách bên phải, tích vào Developer và nhấn OK.

Mẹo: Nếu bạn dùng Excel phiên bản tiếng Anh, mục này là “Developer”. Nếu không thấy, có thể cần kiểm tra phiên bản Office của bạn có hỗ trợ VBA không (Office 365, Office 2026 đều có).

1.2 Mở Visual Basic Editor (VBE)

  • Nhấn Alt + F11 hoặc vào tab Developer → Visual Basic.
  • Giao diện VBE gồm: Project Explorer (cây thư mục), Properties Window, Code Window và Immediate Window.

1.3 Tạo một macro đầu tiên

  1. Trong VBE, Insert → Module. Một module mới sẽ xuất hiện.
  2. Gõ đoạn code sau:
Sub HelloWorld() MsgBox "Xin chào, VBA!"
End Sub
  1. Đóng VBE, quay lại Excel, nhấn Alt + F8, chọn HelloWorld, rồi nhấn Run. Bạn sẽ thấy một hộp thoại thông báo hiện ra.

Giải thích nhanh: Sub là viết tắt của subroutine (thủ tục), không trả về giá trị. MsgBox là hàm hiển thị hộp thoại.

2. Cấu trúc cơ bản của một chương trình VBA

2.1 Các thành phần chính

Thành phầnMô tảVí dụ
Procedures (Sub / Function)Đoạn mã thực thi một nhiệm vụ. Sub không trả về giá trị, Function trả về.Sub TinhTong()
Function TinhTien() As Double
VariablesLưu trữ dữ liệu tạm thời.Dim i As Integer
Data TypesXác định kiểu dữ liệu: Integer, Long, Double, String, Boolean, Variant, Object…Dim ten As String
Control StructuresVòng lặp (For, Do While), câu điều kiện (If...Then...Else).If a > b Then …
Error HandlingXử lý lỗi bằng On Error.On Error GoTo ErrHandler
CommentsGhi chú, bắt đầu bằng '.' Đây là comment

2.2 Quy tắc đặt tên và chuẩn coding

  • CamelCase hoặc PascalCase: TinhTong, tongCong.
  • Không dùng ký tự đặc biệt (ngoại trừ _).
  • Tên biến ngắn gọn nhưng có nghĩa: ws = worksheet, rng = range.
  • Sử dụng Option Explicit ở đầu mỗi module để buộc khai báo biến:
Option Explicit

Nếu không, VBA sẽ tạo biến ngầm khi bạn gõ sai tên, dẫn tới lỗi khó phát hiện.

3. Kiểu dữ liệu và biến trong VBA

3.1 Kiểu dữ liệu số

KiểuKích thướcGiá trị tối đaKhi nào dùng
Byte1 byte0 – 255Dữ liệu nhỏ, tiết kiệm bộ nhớ
Integer2 byte-32,768 – 32,767Số nguyên ngắn
Long4 byte-2,147,483,648 – 2,147,483,647Số nguyên lớn (thường dùng)
Single4 byte±3.402823E38 (6 chữ số thập phân)Số thực với độ chính xác vừa đủ
Double8 byte±1.797693134862315E308 (15 chữ số)Số thực chính xác cao
Currency8 byte±922,337,203,685,477.5807Tiền tệ, tránh lỗi làm tròn

3.2 Kiểu dữ liệu chuỗi và ngày tháng

  • String: Chuỗi ký tự, có thể khai báo cố định (Dim ten As String 20) hoặc động (Dim ten As String).
  • Date: Lưu trữ ngày và giờ. Ví dụ: Dim ngaySinh As Date.
Dim ten As String
ten = "Nguyễn Văn A"
Dim ngaySinh As Date
ngaySinh = #12/31/1990#

3.3 Kiểu Object và Variant

  • Object dùng để tham chiếu tới đối tượng Excel (Worksheet, Range, Workbook…). Ví dụ:
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Data")
  • Variant là kiểu dữ liệu “bình quân” có thể chứa bất kỳ kiểu nào. Dùng khi không chắc kiểu dữ liệu, nhưng nên tránh vì tốn bộ nhớ.

4. Câu lệnh điều kiện và vòng lặp

4.1 If…Then…Else

If score >= 90 Then grade = "A"
ElseIf score >= 80 Then grade = "B"
Else grade = "C"
End If

4.2 Select Case (thay thế nhiều If)

Select Case month Case 1, 2, 12 season = "Winter" Case 3 To 5 season = "Spring" Case 6 To 8 season = "Summer" Case 9 To 11 season = "Autumn" Case Else season = "Unknown"
End Select

4.3 Vòng lặp For…Next

Dim i As Long
For i = 1 To 10 Cells(i, 1).Value = i 2
Next i

4.4 For Each…Next (đối với collection)

Dim rng As Range
For Each rng In Selection rng.Interior.Color = vbYellow
Next rng

4.5 Do While / Do Until

Dim row As Long
row = 1
Do While Cells(row, 1).Value <> "" row = row + 1
Loop
MsgBox "Dòng cuối cùng có dữ liệu là: " & row - 1

5. Làm việc với Range và Worksheet

5.1 Tham chiếu tới ô và vùng dữ liệu

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1") ' Tham chiếu một ô
ws.Range("A1").Value = "Hello" ' Tham chiếu nhiều ô
ws.Range("A1:B10").ClearContents ' Dùng Cells(row, col)
ws.Cells(5, 3).Value = 123 ' C5

5.2 Đọc và ghi dữ liệu nhanh (Bulk)

Khi làm việc với hàng nghìn dòng, việc lặp từng ô sẽ rất chậm. Thay vào đó, dùng mảng:

Dim arr As Variant
arr = ws.Range("A1:C1000").Value ' Đọc thành mảng 2 chiều ' Xử lý trong VBA
Dim i As Long
For i = LBound(arr, 1) To UBound(arr, 1) arr(i, 2) = arr(i, 2) 2 ' Nhân cột B đôi
Next i ' Ghi lại
ws.Range("A1:C1000").Value = arr

5.3 Tìm kiếm và lọc dữ liệu

Dim findRng As Range
Set findRng = ws.Columns("A").Find(What:="John", LookIn:=xlValues, LookAt:=xlWhole)
If Not findRng Is Nothing Then MsgBox "Tìm thấy tại dòng " & findRng.Row
End If

6. Tự động hoá các công việc thường gặp

6.1 Import dữ liệu từ file CSV

Sub ImportCSV() Dim filePath As String filePath = Application.GetOpenFilename("CSV Files (.csv),.csv") If filePath = "False" Then Exit Sub With ThisWorkbook.Sheets("Data").QueryTables.Add(Connection:="TEXT;" & filePath, _ Destination:=ThisWorkbook.Sheets("Data").Range("A1")) .TextFileParseType = xlDelimited .TextFileCommaDelimiter = True .Refresh BackgroundQuery:=False End With
End Sub

6.2 Tạo báo cáo tổng hợp

Giả sử bạn có bảng bán hàng và muốn tổng hợp doanh thu theo tháng:

Sub TongHopDoanhThu() Dim src As Worksheet, dst As Worksheet Set src = ThisWorkbook.Sheets("Sales") Set dst = ThisWorkbook.Sheets("Report") Dim dict As Object Set dict = CreateObject("Scripting.Dictionary") Dim lastRow As Long, i As Long lastRow = src.Cells(src.Rows.Count, "A").End(xlUp).Row For i = 2 To lastRow Dim thang As String, doanhThu As Double thang = Format(src.Cells(i, "B").Value, "yyyy-mm") doanhThu = src.Cells(i, "D").Value If dict.Exists(thang) Then dict(thang) = dict(thang) + doanhThu Else dict.Add thang, doanhThu End If Next i ' Ghi ra sheet Report dst.Range("A1:B1").Value = Array("Tháng", "Doanh thu") i = 2 Dim key As Variant For Each key In dict.Keys dst.Cells(i, 1).Value = key dst.Cells(i, 2).Value = dict(key) i = i + 1 Next key MsgBox "Hoàn thành tổng hợp!"
End Sub

6.3 Gửi email tự động bằng Outlook

Sub GuiMail() Dim OutlookApp As Object, Mail As Object Set OutlookApp = CreateObject("Outlook.Application") Set Mail = OutlookApp.CreateItem(0) ' 0 = olMailItem With Mail .To = "example@domain.com" .Subject = "Báo cáo ngày " & Format(Date, "dd/mm/yyyy") .Body = "Kính gửi, " & vbCrLf & vbCrLf & "Vui lòng xem báo cáo đính kèm." .Attachments.Add ThisWorkbook.FullName .Send ' Hoặc .Display để kiểm tra trước End With Set Mail = Nothing Set OutlookApp = Nothing
End Sub

7. Debug và xử lý lỗi

7.1 Sử dụng Breakpoints và Step Through

Excel Vba Programming For Dummies
Excel Vba Programming For Dummies
  • F9: Đặt breakpoint trên dòng code.
  • F8: Bước qua từng dòng (Step Into).
  • Shift + F8: Step Over (bỏ qua subroutine).
  • Ctrl + Shift + F9: Xóa tất cả breakpoint.

7.2 Immediate Window

Gõ lệnh trực tiếp để kiểm tra giá trị biến:

? Worksheets("Sheet1").Range("A1").Value

7.3 Xử lý lỗi cơ bản

Sub ExampleError() On Error GoTo ErrHandler Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("NonExist") ' Gây lỗi 9 ws.Range("A1").Value = "Test" Exit Sub ErrHandler: MsgBox "Đã xảy ra lỗi: " & Err.Description, vbCritical Resume Next ' Hoặc Resume để quay lại dòng lỗi
End Sub

7.4 Log lỗi vào file

Sub LogError() On Error GoTo ErrHandler ' …code… Exit Sub
ErrHandler: Dim fso As Object, txt As Object Set fso = CreateObject("Scripting.FileSystemObject") Set txt = fso.OpenTextFile(ThisWorkbook.Path & "\ErrorLog.txt", 8, True) txt.WriteLine Now & " - " & Err.Number & " - " & Err.Description txt.Close MsgBox "Lỗi đã được ghi lại.", vbExclamation
End Sub

8. Tối ưu hoá mã nguồn

8.1 Tránh sử dụng .Select và .Activate

' Cách không tối ưu
Sheets("Data").Select
Range("A1").Select
Selection.Value = 123 ' Cách tối ưu
Sheets("Data").Range("A1").Value = 123

8.2 Sử dụng With…End With

With Worksheets("Report") .Range("A1").Value = "Tháng" .Range("B1").Value = "Doanh thu" .Columns("A:B").AutoFit
End With

8.3 Tắt tính năng tính toán và cập nhật màn hình khi chạy macro lớn

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' …code…
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

8.4 Sử dụng mảng thay vì truy cập ô lặp lại

Xem phần 5.3 Đọc và ghi dữ liệu nhanh để hiểu rõ hơn.

9. Tạo UserForm (form giao diện người dùng)

9.1 Thêm UserForm

  • Trong VBE, Insert → UserForm.
  • Kéo các điều khiển: TextBox, ComboBox, CommandButton, ListBox…

9.2 Mã mẫu cho UserForm

Giả sử tạo form nhập thông tin nhân viên:

' Trong UserForm1
Private Sub btnOK_Click() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Employees") Dim lastRow As Long lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1 ws.Cells(lastRow, 1).Value = Me.txtID.Value ws.Cells(lastRow, 2).Value = Me.txtName.Value ws.Cells(lastRow, 3).Value = Me.cboDept.Value ws.Cells(lastRow, 4).Value = Me.txtSalary.Value MsgBox "Đã lưu thành công!", vbInformation Unload Me
End Sub Private Sub UserForm_Initialize() Me.cboDept.AddItem "Kế toán" Me.cboDept.AddItem "Bán hàng" Me.cboDept.AddItem "IT"
End Sub

9.3 Gọi UserForm từ macro

Sub ShowEmployeeForm() UserForm1.Show
End Sub

10. Giao tiếp với các ứng dụng Office khác

10.1 Đọc dữ liệu từ Word

Sub ReadWord() Dim wdApp As Object, wdDoc As Object Set wdApp = CreateObject("Word.Application") Set wdDoc = wdApp.Documents.Open("C:\Temp\Report.docx") Dim txt As String txt = wdDoc.Content.Text ThisWorkbook.Sheets("Data").Range("A1").Value = txt wdDoc.Close False wdApp.Quit
End Sub

10.2 Tạo PowerPoint slide từ Excel

Sub CreatePPT() Dim pptApp As Object, pptPres As Object, slide As Object Set pptApp = CreateObject("PowerPoint.Application") pptApp.Visible = True Set pptPres = pptApp.Presentations.Add Set slide = pptPres.Slides.Add(1, 12) ' 12 = ppLayoutTitleOnly slide.Shapes.Title.TextFrame.TextRange.Text = "Báo cáo bán hàng" ' Chèn hình ảnh từ Excel Dim rngChart As Range Set rngChart = ThisWorkbook.Sheets("Chart").ChartObjects(1).Chart rngChart.Export Filename:="C:\Temp\Chart.png", FilterName:="PNG" slide.Shapes.AddPicture "C:\Temp\Chart.png", False, True, 100, 150, -1, -1
End Sub

11. Sử dụng API và Windows DLL (nâng cao)

Đôi khi bạn cần truy cập chức năng hệ thống như lấy thông tin máy tính, clipboard, hoặc thời gian hệ thống.

11.1 Ví dụ: Lấy thời gian hệ thống bằng API GetSystemTime

Private Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer
End Type Private Declare PtrSafe Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) Sub ShowSystemTime() Dim st As SYSTEMTIME GetSystemTime st MsgBox "Thời gian hiện tại: " & st.wHour & ":" & st.wMinute & ":" & st.wSecond
End Sub

Lưu ý: Dùng PtrSafe cho phiên bản 64‑bit Office. Nếu bạn dùng 32‑bit, bỏ PtrSafe.

11.2 Gọi hàm từ DLL tùy chỉnh

Declare PtrSafe Function AddNumbers Lib "MyMath.dll" (ByVal a As Long, ByVal b As Long) As Long Sub TestDLL() Dim result As Long result = AddNumbers(5, 7) MsgBox "Kết quả: " & result
End Sub

12. Bảo mật macro và ký số

  • Macro Security: Vào File → Options → Trust Center → Trust Center Settings → Macro Settings. Chọn Disable all macros with notification để luôn được hỏi khi mở file có macro.
  • Digital Signature: Để tránh cảnh báo “macro không đáng tin cậy”, bạn có thể ký macro bằng chứng chỉ tự ký (Self‑Signed) hoặc chứng chỉ của nhà cung cấp.
  • Protect VBA Project: Trong VBE, Tools → VBAProject Properties → Protection. Đánh dấu “Lock project for viewing” và đặt mật khẩu.

13. Triển khai dự án thực tế: “Báo cáo doanh thu tự động”

13.1 Mô tả yêu cầu

  • Thu thập dữ liệu bán hàng từ nhiều file CSV (mỗi file là một chi nhánh).
  • Gộp dữ liệu vào một sheet “RawData”.
  • Tính tổng doanh thu theo tháng và chi nhánh.
  • Tạo biểu đồ và gửi email báo cáo cho quản lý.

13.2 Kiến trúc giải pháp

  1. Module ImportData: Đọc CSV, gộp.
  2. Module Summarize: Tính tổng, tạo pivot table.
  3. Module Report: Vẽ biểu đồ, lưu file PDF.
  4. Module Email: Gửi mail kèm PDF.

13.3 Mã nguồn chi tiết (rút gọn)

'--- Module ImportData ---
Option Explicit
Public Sub ImportAllCSV() Dim folderPath As String, fileName As String Dim wsRaw As Worksheet, lastRow As Long folderPath = "C:\Data\Sales\" Set wsRaw = ThisWorkbook.Sheets("RawData") wsRaw.Cells.Clear fileName = Dir(folderPath & ".csv") Do While fileName <> "" Call ImportSingleCSV(folderPath & fileName, wsRaw) fileName = Dir Loop MsgBox "Hoàn thành import tất cả file CSV."
End Sub Private Sub ImportSingleCSV(fullPath As String, ws As Worksheet) Dim qt As QueryTable Set qt = ws.QueryTables.Add(Connection:="TEXT;" & fullPath, _ Destination:=ws.Cells(ws.Rows.Count, 1).End(xlUp).Offset(1, 0)) With qt .TextFileParseType = xlDelimited .TextFileCommaDelimiter = True .Refresh BackgroundQuery:=False .Delete End With
End Sub
'--- Module Summarize ---
Option Explicit
Public Sub CreatePivot() Dim wsRaw As Worksheet, wsRpt As Worksheet Dim pc As PivotCache, pt As PivotTable Set wsRaw = ThisWorkbook.Sheets("RawData") Set wsRpt = ThisWorkbook.Sheets("Report") wsRpt.Cells.Clear Set pc = ThisWorkbook.PivotCaches.Create( _ SourceType:=xlDatabase, _ SourceData:=wsRaw.Range("A1").CurrentRegion) Set pt = pc.CreatePivotTable( _ TableDestination:=wsRpt.Range("A3"), _ TableName:="PivotDoanhThu") With pt .PivotFields("Month").Orientation = xlRowField .PivotFields("Branch").Orientation = xlColumnField .PivotFields("Revenue").Orientation = xlDataField .PivotFields("Revenue").Function = xlSum End With MsgBox "Pivot table đã tạo."
End Sub
'--- Module Report ---
Option Explicit
Public Sub ExportPDF() Dim wsRpt As Worksheet, pdfPath As String Set wsRpt = ThisWorkbook.Sheets("Report") pdfPath = ThisWorkbook.Path & "\DoanhThu_" & Format(Date, "yyyymmdd") & ".pdf" wsRpt.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath, _ Quality:=xlQualityStandard, IncludeDocProperties:=True, _ IgnorePrintAreas:=False, OpenAfterPublish:=False MsgBox "File PDF đã lưu: " & pdfPath
End Sub
'--- Module Email ---
Option Explicit
Public Sub SendReport() Dim outlookApp As Object, mail As Object Dim pdfPath As String pdfPath = ThisWorkbook.Path & "\DoanhThu_" & Format(Date, "yyyymmdd") & ".pdf" If Dir(pdfPath) = "" Then Call ExportPDF Set outlookApp = CreateObject("Outlook.Application") Set mail = outlookApp.CreateItem(0) With mail .To = "manager@company.com" .Subject = "Báo cáo doanh thu ngày " & Format(Date, "dd/mm/yyyy") .Body = "Kính gửi Anh/Chị," & vbCrLf & vbCrLf & _ "Xin gửi kèm báo cáo doanh thu hôm nay." & vbCrLf & vbCrLf & "Trân trọng," .Attachments.Add pdfPath .Send End With MsgBox "Email đã được gửi.", vbInformation
End Sub

13.4 Hướng dẫn chạy

  1. ImportAllCSV → Đọc dữ liệu.
  2. CreatePivot → Tổng hợp.
  3. ExportPDF → Lưu PDF.
  4. SendReport → Gửi email.

Bạn có thể gắn các macro này vào Button trên sheet hoặc tạo Ribbon Custom để người dùng cuối chỉ cần một cú click.

14. Thực hành: Bài tập tự luyện

Bài tậpMô tảMục tiêu học
1Tự động xoá các dòng trùng lặp trong một sheet.Sử dụng Dictionary, vòng lặp.
2Tạo UserForm để nhập danh sách khách hàng, lưu vào bảng.Thiết kế giao diện, event handling.
3Viết macro gửi email với nhiều người nhận (To, CC, BCC).Làm việc với Outlook, mảng chuỗi.
4Tích hợp API Google Maps để tính khoảng cách giữa 2 địa chỉ.Gọi API HTTP, JSON parsing.
5Tối ưu hoá macro xử lý 100.000 dòng bằng mảng.Hiểu hiệu năng, tránh Select/Activate.

15. Kết luận và các nguồn học tiếp

  • Bạn đã nắm vững: môi trường VBA, cú pháp cơ bản, cách làm việc với dữ liệu, tạo báo cáo tự động, và cách debug.
  • Tiếp theo: Hãy thực hành bằng các dự án thực tế trong công việc. Đừng ngại thử nghiệm các tính năng nâng cao như Class Modules, Event handling, hay API calls.
  • Tài liệu tham khảo:
  • Excel VBA Programming For Dummies – John Walkenbach (phiên bản tiếng Anh).
  • Microsoft Docs: https://learn.microsoft.com/office/vba/api/overview/excel.
  • Trang cộng đồng Stack Overflow, MrExcel, Excel Campus.
  • Khóa học trực tuyến: Udemy, Coursera, LinkedIn Learning (tìm “Excel VBA for Beginners”).

Hãy nhớ rằng, VBA là công cụ “cầu nối” giữa con người và dữ liệu. Khi bạn thành thạo, bạn sẽ có khả năng biến những công việc tẻ nhạt thành những quy trình nhanh gọn, tiết kiệm thời gian và giảm thiểu lỗi. Chúc bạn thành công trên hành trình trở thành “VBA Ninja”!

⚠️
LƯU Ý QUAN TRỌNG: Miễn trừ trách nhiệm: Mặc dù chúng tôi luôn nỗ lực để đảm bảo tính chính xác và cập nhật của thông tin, nhưng các quy định về giáo dục và tuyển sinh có thể thay đổi theo thời gian. BigSchool không chịu trách nhiệm về bất kỳ sai sót nào hoặc kết quả phát sinh từ việc sử dụng thông tin trên trang này. Độc giả nên liên hệ trực tiếp với nhà trường hoặc cơ quan chức năng để có thông tin mới nhất. Ngoài ra, BigSchool tuyệt đối không bán sản phẩm, khóa học hay cung cấp dịch vụ được nhắc đến trong bài.

Viết một bình luận