Macro VBA (Visual Basic for Applications) có thể tự động hóa hầu hết mọi thứ trong Excel — định dạng báo cáo, xử lý dữ liệu, gửi email, tạo file. Vấn đề là gì? Hầu hết mọi người chưa bao giờ viết một dòng code nào. Claude AI giải quyết vấn đề này bằng cách tạo ra code VBA hoàn chỉnh, sẵn sàng chạy từ mô tả bằng tiếng Anh đơn giản về những gì bạn muốn thực hiện.
Hướng dẫn này sẽ hướng dẫn bạn toàn bộ quy trình: Cách mô tả một tác vụ để Claude hiểu được, cách dán code vào trình soạn thảo VBA của Excel, cách chạy code một cách an toàn và — quan trọng nhất — cách trả về thông báo lỗi cho Claude khi có sự cố xảy ra. Bạn cũng sẽ tìm thấy 5 template macro sao chép-dán bao gồm các công việc tự động hóa Excel phổ biến nhất.
Không cần kiến thức lập trình. Nếu bạn có thể mô tả những gì mình làm thủ công trong Excel, Claude có thể tự động hóa nó.
Chu trình Prompt → Code → Dán
Mỗi phiên làm việc với Claude VBA đều tuân theo 5 bước giống nhau.
Bước 1: Mô tả nhiệm vụ một cách chính xác
Các lệnh không rõ ràng sẽ tạo ra những macro không rõ ràng. Thay vì "tự động hóa báo cáo của tôi", hãy viết một cái gì đó như sau:
Write a VBA macro that loops through all rows in column A of Sheet1. For each cell, if the value is 'Completed', colour the entire row green. If it is 'Pending', colour it yellow. If it is 'Overdue', colour it red. Data starts in row 2; row 1 is headers. Add error handling in case a cell is blank.
Viết một macro VBA lặp qua tất cả các hàng trong cột A của Trang tính 1. Đối với mỗi ô, nếu giá trị là 'Đã hoàn thành', hãy tô màu xanh lá cây cho toàn bộ hàng. Nếu là 'Đang chờ xử lý', hãy tô màu vàng. Nếu là 'Quá hạn', hãy tô màu đỏ. Dữ liệu bắt đầu từ hàng 2; hàng 1 là tiêu đề. Thêm xử lý lỗi trong trường hợp ô trống.
Càng cung cấp nhiều ngữ cảnh — tên trang tính, bố cục cột, hàng bắt đầu, các trường hợp ngoại lệ — thì kết quả đầu ra càng tốt.
Bước 2: Sao chép code của Claude
Claude sẽ trả về một Sub hoàn chỉnh kèm theo chú thích. Ví dụ về kết quả đầu ra cho lệnh trên:
Sub ColourRowsByStatus()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
On Error GoTo ErrorHandler
Set ws = ThisWorkbook.Sheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
If IsEmpty(ws.Cells(i, 1)) Then GoTo NextRow
Select Case ws.Cells(i, 1).Value
Case "Completed"
ws.Rows(i).Interior.Color = RGB(198, 239, 206)
Case "Pending"
ws.Rows(i).Interior.Color = RGB(255, 235, 156)
Case "Overdue"
ws.Rows(i).Interior.Color = RGB(255, 199, 206)
End Select
NextRow:
Next i
MsgBox "Formatting complete!", vbInformation
Exit Sub
ErrorHandler:
MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical
End Sub
Bước 3: Mở VBA Editor
- Nhấn Alt + F11 — VBA Editor sẽ mở ra.
- Trong bảng Project ở bên trái, nhấp chuột phải vào tên workbook của bạn → Insert → Module.
- Dán code vào cửa sổ mô-đun trống.
Bước 4: Chạy macro
- Nhấp chuột vào bất kỳ đâu bên trong thủ tục
Sub. - Nhấn F5 để chạy trực tiếp, hoặc đóng trình chỉnh sửa và sử dụng Alt + F8 để chọn nó từ danh sách Macros.
- Lưu lại file dưới dạng .xlsm để bảo toàn code.
Bước 5: Lặp lại với Claude
Nếu Excel hiển thị lỗi, hãy sao chép chính xác thông báo lỗi và số dòng, sau đó gửi cả hai lại cho Claude:
I got Runtime Error 9 on line 8. Here is the code: [paste]. The sheet tab is actually called 'Status Tracker'. Please fix it.
Tôi nhận được Lỗi Runtime 9 trên dòng 8. Đây là code: [dán]. Tab trang tính thực sự được gọi là 'Trình theo dõi trạng thái'. Vui lòng sửa lỗi này.
Claude sẽ sửa tham chiếu tên trang tính và trả về code đã cập nhật ngay lập tức.
5 template Macro sẵn sàng sử dụng
Yêu cầu Claude tạo các template này bằng cách dán prompt được hiển thị. Điều chỉnh tên trang tính và chữ cái cột cho phù hợp với workbook của bạn.
Template 1: Tự động định dạng hàng tiêu đề báo cáo
Prompt cho Claude:
Write a VBA macro that on Sheet1 makes row 1 bold, sets the font to 12pt, adds a thick bottom border, fills the row with a dark blue background (hex #1F3864) with white text, and auto-fits all column widths.
Viết một macro VBA trên Trang tính 1 để in đậm hàng 1, đặt cỡ chữ là 12pt, thêm đường viền dưới dày, tô nền hàng bằng màu xanh đậm (code hex #1F3864) với chữ màu trắng và tự động điều chỉnh độ rộng tất cả các cột.
Sub FormatReportHeaders()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
With ws.Rows(1)
.Font.Bold = True
.Font.Size = 12
.Font.Color = RGB(255, 255, 255)
.Interior.Color = RGB(31, 56, 100)
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeBottom).Weight = xlThick
End With
ws.Columns.AutoFit
ws.Rows(1).RowHeight = 28
MsgBox "Headers formatted.", vbInformation
End Sub
Lỗi thường gặp ở người mới bắt đầu: Nếu bạn đã hợp nhất các ô trong hàng 1, tính năng Tự động điều chỉnh kích thước (AutoFit) có thể không hoạt động chính xác. Hãy yêu cầu Claude "bỏ qua các ô đã hợp nhất khi tự động điều chỉnh kích thước".
Template 2: Xóa tất cả các hàng trống trong một tập dữ liệu
Prompt cho Claude:
Write a VBA macro that deletes every row in Sheet1 where column A is completely empty. Data starts in row 2. Loop from the bottom up so row numbers don't shift during deletion.
Hãy viết một macro VBA để xóa mọi hàng trong Trang tính 1 mà cột A hoàn toàn trống. Dữ liệu bắt đầu từ hàng 2. Lặp từ dưới lên trên để số hàng không bị thay đổi trong quá trình xóa.
Sub DeleteBlankRows()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Set ws = ThisWorkbook.Sheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' Loop from bottom to top to avoid row-shift errors
For i = lastRow To 2 Step -1
If IsEmpty(ws.Cells(i, 1).Value) Or ws.Cells(i, 1).Value = "" Then
ws.Rows(i).Delete
End If
Next i
MsgBox "Blank rows removed. " & lastRow - ws.Cells(ws.Rows.Count, "A").End(xlUp).Row & " rows deleted.", vbInformation
End Sub
Lỗi thường gặp ở người mới bắt đầu: Lặp từ trên xuống dưới và xóa hàng sẽ làm dịch chuyển tất cả những số hàng tiếp theo đi một, khiến macro bỏ qua các hàng. Luôn luôn lặp từ dưới lên trên khi xóa.
Template 3: Sao chép các hàng khớp với tiêu chí sang một trang tính mới
Prompt cho Claude:
Write a VBA macro that copies all rows from Sheet1 where column C equals 'Approved' to a new sheet called 'Approved Items'. Include the header row. If the sheet already exists, clear it first.
Viết một macro VBA sao chép tất cả các hàng từ Trang tính 1 có cột C bằng 'Đã duyệt' sang một trang tính mới có tên là 'Các mục đã duyệt'. Bao gồm cả hàng tiêu đề. Nếu trang tính đã tồn tại, hãy xóa nó trước.
Sub CopyApprovedRows()
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim lastRow As Long
Dim destRow As Long
Dim i As Long
Set wsSource = ThisWorkbook.Sheets("Sheet1")
' Create or clear destination sheet
On Error Resume Next
Set wsDest = ThisWorkbook.Sheets("Approved Items")
On Error GoTo 0
If wsDest Is Nothing Then
Set wsDest = ThisWorkbook.Sheets.Add(After:=wsSource)
wsDest.Name = "Approved Items"
Else
wsDest.Cells.Clear
End If
' Copy header row
wsSource.Rows(1).Copy Destination:=wsDest.Rows(1)
destRow = 2
lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
If wsSource.Cells(i, 3).Value = "Approved" Then
wsSource.Rows(i).Copy Destination:=wsDest.Rows(destRow)
destRow = destRow + 1
End If
Next i
MsgBox destRow - 2 & " rows copied to 'Approved Items'.", vbInformation
End Sub
Template 4: Tách dữ liệu theo giá trị duy nhất thành các trang tính riêng biệt
Prompt cho Claude:
Write a VBA macro that reads all unique values in column B of Sheet1 (starting row 2) and creates a separate worksheet for each unique value, named after that value, containing all rows with that value plus the header row.
Hãy viết một macro VBA đọc tất cả các giá trị duy nhất trong cột B của Trang tính 1 (bắt đầu từ hàng 2) và tạo một trang tính riêng biệt cho mỗi giá trị duy nhất, được đặt tên theo giá trị đó, chứa tất cả các hàng có giá trị đó cộng với hàng tiêu đề.
Sub SplitByDepartment()
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim lastRow As Long
Dim i As Long
Dim dept As String
Dim dict As Object
Set wsSource = ThisWorkbook.Sheets("Sheet1")
Set dict = CreateObject("Scripting.Dictionary")
lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
' Collect unique department names
For i = 2 To lastRow
dept = CStr(wsSource.Cells(i, 2).Value)
If dept <> "" And Not dict.Exists(dept) Then dict.Add dept, True
Next i
' Create/clear a sheet per department and copy matching rows
Dim key As Variant
For Each key In dict.Keys
On Error Resume Next
Set wsDest = ThisWorkbook.Sheets(CStr(key))
On Error GoTo 0
If wsDest Is Nothing Then
Set wsDest = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
wsDest.Name = Left(CStr(key), 31) ' Sheet names max 31 chars
Else
wsDest.Cells.Clear
End If
wsSource.Rows(1).Copy Destination:=wsDest.Rows(1) ' Header
Dim destRow As Long
destRow = 2
For i = 2 To lastRow
If CStr(wsSource.Cells(i, 2).Value) = CStr(key) Then
wsSource.Rows(i).Copy Destination:=wsDest.Rows(destRow)
destRow = destRow + 1
End If
Next i
Set wsDest = Nothing
Next key
MsgBox "Split complete. " & dict.Count & " sheets created.", vbInformation
End Sub
Lỗi thường gặp ở người mới bắt đầu: Tên trang tính Excel không được vượt quá 31 ký tự và không được chứa / \ ? * [ ]. Template sẽ tự động cắt bớt tên xuống còn 31 ký tự; hãy yêu cầu Claude loại bỏ cả các ký tự không hợp lệ nếu dữ liệu của bạn có thể chứa chúng.
Template 5: Soạn thảo email Outlook từ danh sách từng hàng
Prompt cho Claude:
Write a VBA macro that reads Sheet1 where column A is recipient name, column B is email address, and column C is a custom message. For each row, create a draft Outlook email with subject 'Follow-up from Sagnik' and body combining the name and message. Leave them as drafts — don't send.
Viết một macro VBA đọc Trang tính 1, trong đó cột A là tên người nhận, cột B là địa chỉ email và cột C là tin nhắn tùy chỉnh. Với mỗi hàng, hãy tạo một email Outlook nháp với chủ đề 'Theo dõi từ Sagnik' và nội dung kết hợp tên và tin nhắn. Hãy để chúng ở dạng bản nháp — đừng gửi.
Sub DraftOutlookEmails()
' Requires reference: Tools → References → Microsoft Outlook XX.0 Object Library
Dim ws As Worksheet
Dim outlookApp As Object
Dim mail As Object
Dim lastRow As Long
Dim i As Long
Set ws = ThisWorkbook.Sheets("Sheet1")
Set outlookApp = CreateObject("Outlook.Application")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
If ws.Cells(i, 2).Value = "" Then GoTo NextRow
Set mail = outlookApp.CreateItem(0) ' olMailItem
With mail
.To = ws.Cells(i, 2).Value
.Subject = "Follow-up from Sagnik"
.Body = "Hi " & ws.Cells(i, 1).Value & "," & vbCrLf & vbCrLf & _
ws.Cells(i, 3).Value & vbCrLf & vbCrLf & "Best regards," & vbCrLf & "Sagnik"
.Save ' Saves to Drafts — does NOT send
End With
Set mail = Nothing
NextRow:
Next i
MsgBox lastRow - 1 & " draft emails saved to Outlook Drafts.", vbInformation
End Sub
Lỗi thường gặp cho người mới bắt đầu: Macro này yêu cầu Outlook phải được cài đặt và tham chiếu Outlook Object Library phải được kích hoạt (Tools → References trong VBA Editor). Macro này chỉ hoạt động trên Windows..





