Giới thiệu về macro và VBA

Cách bắt đầu với Excel VBA
Danh sách mã thường dùng

Chúng tôi đã tóm tắt các bước chuẩn bị để bắt đầu viết VBA và các mã cơ bản thường được sử dụng. Chúng tôi sẽ giới thiệu các ví dụ mà bạn có thể sao chép và thử, bao gồm đặc tả ô/phạm vi, biến, phân nhánh có điều kiện, lặp lại và cách viết hàm.

Nếu bạn muốn biết macro và VBA là gì, trước tiên hãy xem Bài viết giới thiệu Macro/VBA.

Chuẩn bị môi trường Nhà phát triển (Windows)

Bạn không cần bất kỳ phần mềm nào khác để viết VBA. Viết nó vào VBE(Visual Basic Editor) trong Excel và thực thi nó như cũ. Đầu tiên, chỉ chuẩn bị những thứ sau một lần.

1. Hiển thị tab nhà Nhà phát triển

Mở "Tệp" → "Tùy chọn" → "Tùy chỉnh Dải băng", chọn "Nhà Nhà phát triển" trong danh sách "Tab chính" ở bên phải và nhấn "OK". Tab “Nhà Nhà phát triển” sẽ xuất hiện trên dải băng.

2. Mở VBE

Nhấp vào "Visual Basic" trên tab "Nhà Nhà phát triển".Alt+F11Nhưng tôi có thể mở nó. Nhấn lại lần nữa sẽ đưa bạn trở lại màn hình Excel.

3. Thêm mô-đun tiêu chuẩn

Chọn "Chèn" → "Mô-đun tiêu chuẩn" từ menu VBE. "Module1" sẽ được tạo trong dự án ở bên trái và bạn sẽ có thể viết mã ở bên phải. Các macro thông thường được viết trong mô-đun tiêu chuẩn này.

4. Bật "Buộc khai báo biến"

Kiểm tra "Buộc khai báo biến" trong tab "Công cụ" → "Tùy chọn" → "Chỉnh sửa" của VBE. Dòng sau đây sẽ tự động được chèn vào đầu mô-đun mới được tạo và một thông báo lỗi sẽ được hiển thị để cho bạn biết nếu bạn gõ nhầm tên biến.

đầu mô-đun
Option Explicit   ' Đặt ở đầu mô-đun để yêu cầu khai báo biến bằng Dim.

5. Viết và thực thi

Sau khi viết mã, nhấp vào bên trong Sub ~ End Sub rồi nhấn "XXX" (Sub/Run User Form) trên thanh công cụ, hoặcF5Nhấn Từ màn hình Excel, nhấp vào "Macro" (Alt+F8) để chọn tên và thực thi nó.

Nếu bạn muốn kiểm tra các giá trị trung gian, hãy đi tới "Xem" → "Cửa sổ ngay lập tức" của VBE (Ctrl+G) và viết "Tên biến Debug.Print" vào mã, giá trị sẽ xuất hiện ở đó.

6. Lưu dưới dạng sổ làm việc hỗ trợ macro (.xlsm)

Đối với sổ làm việc mà bạn đã viết VBA, hãy chọn "Sổ làm việc hỗ trợ macro Excel (*.xlsm)" trong "Save As". Nếu bạn lưu nó dưới dạng tệp .xlsx thông thường, mã bạn đã viết sẽ bị mất.

Khi bạn mở sổ làm việc, nếu bạn nhận được thông báo có nội dung "Cảnh báo bảo mật: Macro đã bị tắt", hãy bấm vào "Bật nội dung" chỉ khi sổ làm việc là sổ làm việc bạn đã tạo hoặc bạn tin cậy. Macro có thể bị chặn trong các tệp được lưu từ email hoặc Internet. Trong trường hợp đó, nhấp chuột phải vào tệp → chọn "Thuộc tính" và chọn "Cho phép".

Không thể hoàn tác những thay đổi được thực hiện bằng macro bằng Ctrl+Z.Khi dùng thử, hãy sử dụng bản sao của sổ bài tập hoặc dữ liệu thực hành.

Đối với Mac, hiển thị tab nhà Nhà phát triển bằng cách chọn menu "Excel" → "Tùy chọn" → "Ribbon và Thanh công cụ" và mở VBE trong "Visual Basic" trên tab nhà Nhà phát triển.

MacrowThực hành sử dụng trình duyệtThực hành từ hiển thị tab Nhà phát triển đến mã chạy →

Danh sách tham khảo nhanh các mã thường được sử dụng

Nếu đọc được đến đây thì bạn sẽ đọc được rất nhiều macro và mã được ghi lại do AI tạo ra. Hướng dẫn chi tiết cho từng phần được giới thiệu trong các phần dưới đây.

Làm thế nào để viếtý nghĩa
Sub MacroName() 〜 End SubSự bắt đầu và kết thúc của macro (thủ tục)
' Bình luận' Những ghi chú không được thực hiện từ cuối dòng
Dim item As LongChuẩn bị một biến (Long là số nguyên)
Set item = Worksheets("kiểm đếm")Đặt các trang tính, ô, v.v. vào các biến
Range("A1")Ô A1
Range("A1:C5")Phạm vi từ A1 đến C5
Cells(row, column)Chỉ định ô theo số hàng/cột
Cells(Rows.Count, 1).End(xlUp).RowHàng cuối cùng có dữ liệu trong cột A
.Valuegiá trị ô
If condition Then 〜 End IfChỉ thực hiện khi đủ điều kiện
For i = 1 To 10 〜 Next ilặp lại một số lần nhất định
For Each item In targetRange 〜 NextXử lý từng ô trong phạm vi một
Function MacroName() … End FunctionHàm tự chế trả về một giá trị
WorksheetFunction.Sum(targetRange)Sử dụng các hàm bảng tính với VBA
MsgBox "nhân vật"hiển thị tin nhắn

Dạng macro (Sub) cơ bản và chú thích

Macro bắt đầu bằng "Tên macro phụ()" và kết thúc bằng "End Sub". Các lệnh được viết trong thời gian này sẽ được thực thi theo thứ tự từ trên xuống. Tiếng Nhật cũng có thể được sử dụng trong tên macro.

Dạng macro cơ bản
Sub SayHello()
    ' Dòng này được nhận xét (không được thực thi)
    MsgBox "xin chào"
End Sub

「'” (trích dẫn đơn) cuối dòng là lời bình luận, viết ra việc bạn đang làm sẽ giúp bạn đọc sau hoặc truyền lại cho người khác.

Sử dụng "Gọi" để gọi các macro khác.

gọi macro
Sub RunAll()
    Call CheckSales     ' gọi macro khác
    Call SayHello
End Sub

Cách viết biến và hằng

Biến là các hộp lưu trữ các giá trị đang được tính toán hoặc các giá trị được sử dụng nhiều lần. Chuẩn bị nó bằng "Dim tên biến As type" và nhập giá trị bằng "=".

Chuẩn bị và sử dụng các biến
Sub VariablesExample()
    Dim total As Long        ' số nguyên
    Dim customer As String   ' chuỗi
    Dim price As Double      ' số có số thập phân
    Dim today As Date        ' Ngày
    Dim finished As Boolean  ' Đúng hay Sai

    total = 12
    customer = "Komorebi Shop"
    price = 1200.5
    today = Date
    finished = False

    Range("A1").Value = customer & ":" & total & "vấn đề"
End Sub
khuônNhững gì để đưa vào
LongSố nguyên (số hàng, số mục, v.v.)
DoubleCác số bao gồm số thập phân (số lượng, tỷ lệ phần trăm, v.v.)
Stringchuỗi
DateNgày/giờ
BooleanTrue / False
VariantCái gì cũng có thể vừa (khi bạn chưa quyết định được loại nào)
Worksheet / RangeTrang tính/ô (chèn bằng Set)

Khi lưu trữ "mọi thứ" (đối tượng) chẳng hạn như trang tính hoặc ô trong các biến, hãy thêm “Đặt” ngay từ đầu. Nếu quên đính kèm sẽ xảy ra lỗi, đó là điều mà tôi thường xuyên mắc phải.

Đặt các ô của trang tính vào các biến
Dim ws As Worksheet
Set ws = Worksheets("kiểm đếm")    ' Chèn trang tính và ô bằng Set
ws.Range("A1").Value = "Tổng doanh thu"

Dim target As Range
Set target = ws.Range("A2:C10")
target.ClearContents

Đối với các giá trị không thay đổi trong quá trình thực hiện, chẳng hạn như thuế suất tiêu dùng, nếu bạn sử dụng "Const" để biến nó thành hằng số, bạn chỉ cần thay đổi một vị trí khi thay đổi nó.

hằng số
Const TAX_RATE As Double = 0.1   ' Giá trị không thay đổi trong quá trình

Range("C2").Value = Range("B2").Value * (1 + TAX_RATE)

Cách chỉ định ô/phạm vi

Điều phổ biến nhất để viết trong VBA là chỉ định các ô. 「Range("A1")" là địa chỉ ô và "Ô (hàng, cột)" được chỉ định theo số.Các ô có thể được chỉ định theo số, rất hữu ích khi dịch chuyển từng hàng một trong quá trình lặp lại.

Chỉ định ô/phạm vi
Range("A1").Value = 100                     ' A1
Range("A1:C3").Value = 0                    ' Được nhóm thành A1-C3
Range("A:A").Font.Bold = True               ' Toàn bộ cột A
Range("2:2").Font.Bold = True               ' toàn bộ hàng thứ hai
Cells(2, 3).Value = "C2"                     ' Hàng thứ 2/cột thứ 3 (C2)
Range(Cells(1, 1), Cells(5, 3)).Select      ' A1〜C5
Worksheets("kiểm đếm").Range("A1").Value = "Tổng cộng" ' Chỉ định trang tính

Nếu bạn không viết tên trang tính, trang tính hiện đang mở (trang tính hoạt động) sẽ được nhắm mục tiêu. Khi vận hành một trang tính khác, hãy nhấp vàoWorksheets("tên trang tính").” ở phía trước.

tìm hàng cuối cùng

Đối với các bảng có số lượng hàng thay đổi hàng tháng, hãy kiểm tra xem có bao nhiêu dữ liệu trước khi xử lý. Đây là cách viết tìm số hàng của ô đầu tiên chứa dữ liệu, bắt đầu từ ô dưới cùng ở cột A và tăng dần lên trên.

dòng cuối cùng
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row   ' Tìm từ cuối cột A lên trên

Range("A2:A" & lastRow).Font.Bold = True     ' Từ cuối tiêu đề đến dòng cuối cùng

Toàn bộ bảng/ca/mở rộng

Vùng hiện tại・Bù đắp・Thay đổi kích thước
Range("A1").CurrentRegion.Select       ' Toàn bộ bảng được kết nối với A1
Range("A1").Offset(1, 0).Value = "đáy"    ' 1 dòng bên dưới (A2)
Range("A1").Offset(0, 2).Value = "đúng"    ' Hàng thứ 2 bên phải (C1)
Range("A1").Resize(3, 2).Select         ' 3 hàng x 2 cột từ A1 (A1:B3)

Thao tác các giá trị, công thức và định dạng

Giá trị ô được đọc và ghi bằng ".Value". Đối với công thức, hãy nhập chuỗi giống như khi nhập chuỗi đó trong Excel ở ".Formula".

Giá trị/Công thức/Định dạng
Range("D2").Formula = "=B2*C2"                  ' nhập công thức
Range("A2:D10").ClearContents                   ' Chỉ xóa giá trị (định dạng vẫn còn)
Range("A1").Font.Bold = True                    ' Đậm
Range("A1").Interior.Color = RGB(255, 242, 204) ' tô màu
Range("D2:D10").NumberFormat = "#,##0"          ' dấu phân cách 3 chữ số
Range("A1:D10").Copy Destination:=Worksheets("dự trữ").Range("A1")  ' sao chép và dán

Phân nhánh có điều kiện (If · Select Case)

Sử dụng "If ~ Then" để phân tách quá trình xử lý dựa trên các điều kiện. Đừng quên "End If" ở cuối.Sử dụng "ElseIf" để chia điều kiện thành nhiều điều kiện và "Else" khi không có điều kiện nào áp dụng.

If 〜 ElseIf 〜 Else
If Range("B2").Value >= 80 Then
    Range("C2").Value = "Đã đậu"
ElseIf Range("B2").Value >= 60 Then
    Range("C2").Value = "Xác nhận lại"
Else
    Range("C2").Value = "Thất bại"
End If
Phán quyết trống/nhiều điều kiện
If Range("A2").Value = "" Then
    MsgBox "A2 trống"
End If

' Và (cả hai), Hoặc (hoặc), <> (không bằng)
If Range("B2").Value >= 60 And Range("C2").Value <> "Vắng mặt" Then
    Range("D2").Value = "OK"
End If

Khi chia thành nhiều cách dựa trên một giá trị, "Select Case" sẽ dễ đọc hơn.

Select Case
Select Case Range("B2").Value
    Case "Tokyo", "Yokohama"
        Range("C2").Value = "Kanto"
    Case "Osaka", "Kyoto"
        Range("C2").Value = "Kansai"
    Case Else
        Range("C2").Value = "Khác"
End Select

Lặp lại (For · For Each · Do While)

Việc thực hiện cùng một quá trình xử lý cho mỗi hàng là lúc VBA thể hiện được sức mạnh lớn nhất của nó."For ~ Next" lặp lại trong khi tăng biến i lên 1.

For … Next (2–10)
Dim i As Long
For i = 2 To 10
    Cells(i, 4).Value = Cells(i, 2).Value * Cells(i, 3).Value
Next i

Khi xử lý từng ô trong một phạm vi hoặc các trang tính trong sổ làm việc, hãy sử dụng "Dành cho từng ô".

For Each
Dim cell As Range
For Each cell In Range("A2:A10")
    If cell.Value = "" Then
        cell.Interior.Color = RGB(255, 199, 206)   ' điền vào chỗ trống bằng màu đỏ
    End If
Next cell

Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets   ' tất cả các tờ
    ws.Range("A1").Font.Bold = True
Next ws

Nếu hàng kết thúc chưa được xác định, hãy sử dụng "Do While" để lặp lại miễn là đáp ứng các điều kiện.Nếu bạn quên "r = r + 1", bạn sẽ không thể dừng lại.Khi nó không dừng lại,EscHoặcCtrl+BreakBạn có thể làm gián đoạn nó bằng .

Do While 〜 Loop
Dim r As Long
r = 2
Do While Cells(r, 1).Value <> ""   ' Cho đến khi cột A trống
    Cells(r, 5).Value = "Đã xác nhận"
    r = r + 1
Loop
Thoát cho
For i = 2 To 100
    If Cells(i, 1).Value = "Tổng cộng" Then Exit For   ' thoát ra giữa chừng
Next i

Cách viết và sử dụng hàm

Khi chúng ta nói về "hàm" trong VBA, có ba loại:

Tạo chức năng của riêng bạn (Chức năng)

Nếu bạn tạo nó bằng "Hàm", nó sẽ trở thành một hàm trả về giá trị được tính toán. Nếu bạn đặt một giá trị vào tên hàm thì đó là kết quả.Nếu viết nó trong mô-đun tiêu chuẩn, bạn có thể nhập "=Số tiền bao gồm thuế (A2)" vào một ô và sử dụng nó theo cách tương tự như một hàm trong trang tính.

Function
Function PriceWithTax(price As Double) As Double
    PriceWithTax = price * 1.1     ' Giá trị bạn đặt vào tên hàm sẽ trở thành kết quả.
End Function

Sub UseFunction()
    Range("B2").Value = PriceWithTax(Range("A2").Value)
End Sub

Sử dụng các hàm bảng tính với VBA

Các hàm được sử dụng trong các ô, chẳng hạn như SUM và COUNTIF, có thể được gọi bằng "WorksheetFunction".

WorksheetFunction
Range("C11").Value = WorksheetFunction.Sum(Range("C2:C10"))
Range("C12").Value = WorksheetFunction.Average(Range("C2:C10"))
Range("C13").Value = WorksheetFunction.CountIf(Range("B2:B10"), "Tokyo")

Hàm VBA

VBA cũng cung cấp các hàm xử lý ngày tháng và chuỗi.

Định dạng・Len・Trái・Thay thế, v.v.
Range("A1").Value = Format(Date, "yyyy-mm-dd")   ' ngày hôm nay trong văn bản
Range("A2").Value = Now                           ' ngày và giờ hiện tại
Range("A3").Value = Len("Komorebi Shop")             ' Số ký tự → 13
Range("A4").Value = Left("2026-10-06", 4)         ' 4 ký tự từ trái sang → 2026
Range("A5").Value = Replace("Tokyo chi nhánh", "chi nhánh", "") ' Thay thế → Tokyo
Range("A6").Value = Trim("  Tokyo  ")               ' Xóa khoảng trắng trước và sau

Thông báo và đầu vào (MsgBox · InputBox)

Được sử dụng để thông báo kết thúc quá trình xử lý hoặc để xác nhận trước khi thực hiện. Nếu sử dụng "InputBox", bạn có thể nhập tháng, người phụ trách, v.v. mỗi lần chạy chương trình.

MsgBox · InputBox
MsgBox "Kết thúc rồi"

If MsgBox("Bạn có muốn chạy nó không?", vbYesNo) = vbNo Then Exit Sub

Dim answer As String
answer = InputBox("Bao nhiêu tháng?")
Range("A1").Value = answer & "hàng tháng"

Thao tác trên tờ/sách

cuốn sách
Worksheets("bán hàng").Activate                    ' tấm chuyển đổi
Worksheets("bán hàng").Copy After:=Worksheets(Worksheets.Count)  ' sao chép tờ
ActiveSheet.Name = "Th10"                        ' Thay đổi tên trang tính
Worksheets.Add After:=Worksheets(Worksheets.Count)          ' thêm trang tính

Dim book As Workbook
Set book = Workbooks.Open(ThisWorkbook.Path & "\Tokyo_October.xlsx")
book.Close SaveChanges:=False                    ' Đóng mà không lưu
ThisWorkbook.Save                                ' Lưu sổ làm việc này

Nếu có nhiều thao tác xử lý cần thực hiện, bạn có thể ngừng cập nhật màn hình và quá trình sẽ hoàn tất nhanh hơn. Bạn có thể viết quy trình khi xảy ra lỗi bằng cách sử dụng "On Error GoTo".

Dừng cập nhật màn hình
Sub RunFaster()
    Application.ScreenUpdating = False   ' Dừng cập nhật màn hình
    ' ...Quá trình cần có thời gian...
    Application.ScreenUpdating = True    ' trở lại cuối cùng
End Sub
Hãy chuẩn bị cho những sai sót
Sub HandleErrors()
    On Error GoTo ErrHandler
    Worksheets("kiểm đếm").Range("A1").Value = "OK"
    Exit Sub
ErrHandler:
    MsgBox "Tôi gặp lỗi:" & Err.Description
End Sub

Ví dụ kết hợp: Tính toán và tô màu bảng bán hàng

Kết hợp mã cho đến nay, chúng ta có được điều này: Trong bảng "Doanh số", trong bảng có tên sản phẩm ở cột A, số lượng ở cột B và đơn giá ở cột C, hãy tính số tiền ở cột D và tô màu xanh lục cho các hàng có giá trị từ 100.000 yên trở lên.

Kiểm tra bán hàng
Sub CheckSales()
    Dim ws As Worksheet
    Dim lastRow As Long, i As Long
    Set ws = Worksheets("bán hàng")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        ' Số tiền = Số lượng × Đơn giá
        ws.Cells(i, 4).Value = ws.Cells(i, 2).Value * ws.Cells(i, 3).Value
        ' Nếu trên 100.000 yên thì có màu xanh.
        If ws.Cells(i, 4).Value >= 100000 Then
            ws.Cells(i, 4).Interior.Color = RGB(198, 239, 206)
        Else
            ws.Cells(i, 4).Interior.ColorIndex = xlNone
        End If
    Next i

    MsgBox lastRow - 1 & "tính toán hàng"
End Sub

Chứa các biến (Dim), đặc tả trang tính (Set), hàng cuối cùng, sự lặp lại (For) và phân nhánh có điều kiện (If). Nếu bạn có thể đọc từng hàng "điều gì đang được thực hiện ở ô nào", bạn có thể thay đổi số lượng hàng và điều kiện cho phù hợp với bảng của mình.

Ngay cả khi bạn có mã tạo AI, nếu bạn có thể đọc được hình này, bạn có thể tự kiểm tra xem cột nào đang được tính toán và liệu các điều kiện có đáp ứng hay không.

Tìm hiểu thêm

Chúng tôi khuyên bạn nên kiểm tra danh sách mã để biết cách viết và sau đó dùng thử bằng tệp tài liệu giảng dạy. Cuốn sách giới thiệu từng bước này cho phép bạn thực hành mọi thứ từ ghi macro đến biến, lặp lại và phân nhánh có điều kiện với các ví dụ được kết nối.

Đối với những người cảm thấy khó khăn khi làm việc đó một mình hoặc những người muốn thảo luận về các lĩnh vực công việc của họ có thể được tự động hóa, tham gia một khóa học do người hướng dẫn giảng dạy cũng là một lựa chọn.

Cách chọn phương pháp nghiên cứu cũng được giới thiệu trong Cách nghiên cứu macro và VBA.