Trong bài viết này, Thủ Thuật sẽ hướng dẫn bạn các bước cơ bản để tạo macro Excel bằng VBA. Hãy cùng tìm hiểu qua các ví dụ thực tế và thực hành để nắm vững kiến thức nhé!
Các Thuật Ngữ Cơ Bản Trong VBA
- Macro Excel: Chuỗi các lệnh tự động hóa tác vụ trong Excel.
- VBA (Visual Basic for Applications): Ngôn ngữ lập trình dùng để tạo macro.
- Dòng mã (Line of code): Mỗi lệnh trong VBA.
- Sub: Một Sub bao gồm nhiều dòng mã. Khi chạy, VBA sẽ thực hiện từng dòng mã. Macro và Sub về cơ bản là giống nhau.
- Module: Nơi chứa các Sub. Một Workbook có thể chứa nhiều Module và một Module có thể chứa nhiều Sub.
- VBA Editor: Môi trường soạn thảo mã VBA. Nhấn
Alt + F11
để chuyển đổi giữa Excel và VBA Editor.
Hình minh họa các thành phần chính của VBA Editor.
Thủ Thuật Khi Sử Dụng VBA
Hãy đóng tất cả các Workbook khác khi thực hành theo hướng dẫn này.
Tạo Module
Trong Excel, chúng ta dùng VBA để tạo macro. Macro thực chất là một Sub. Trong VBA, ta viết các dòng lệnh cho VBA thực thi. Các dòng mã này nằm trong Sub, và các Sub được lưu trữ trong Module.
Hoạt Động 1: Tạo Module VBA
- Mở một Workbook mới trong Excel.
- Mở VBA Editor (
Alt + F11
). - Mở cửa sổ Project – VBAProject (hoặc nhấn
Ctrl + R
). - Click chuột phải vào Workbook, chọn Insert > Module.
- Click vào Module1 trong cửa sổ Project – VBAProject.
- Trong cửa sổ Properties (nhấn
F4
nếu không thấy), đổi tên Module1 thành Myfirstmodule.
Kết Thúc Hoạt Động 1
Module là nơi chứa mã VBA, giống như kệ sách chứa sách. Việc đặt tên và tổ chức các Sub trong Module giúp quản lý mã hiệu quả hơn. Cửa sổ mã là nơi viết mã VBA. DoubleClick vào Module trong cửa sổ Project – VBAProject để mở cửa sổ mã.
Hoạt Động 2: Mở Cửa Sổ Mã
- Mở một Workbook mới và tạo một Module như Hoạt động 1.
- DoubleClick vào Module trong cửa sổ Project – VBAProject để mở cửa sổ mã.
- Cửa sổ mã của Module sẽ hiện ra. Bạn sẽ thấy tên Module trên thanh tiêu đề của VBA Editor.
Kết Thúc Hoạt Động 2
Số lượng Module và Sub trong một Workbook là không giới hạn. Việc đặt tên và tổ chức chúng tùy thuộc vào bạn. Tiếp theo, chúng ta sẽ tìm hiểu cách sử dụng Sub.
Sử Dụng Sub
Mỗi dòng mã là một lệnh cho VBA thực thi. Các dòng mã được nhóm lại thành Sub và lưu trữ trong Module. Khi chạy một Sub, VBA sẽ thực hiện lần lượt từng dòng mã trong Sub đó.
Hoạt Động 3: Viết Mã VBA Trong Sub
- Tạo một Module như hướng dẫn ở trên.
- Chọn Module trong cửa sổ Project – VBAProject. Đảm bảo tên Module hiển thị trên thanh tiêu đề.
- Nhập dòng mã sau vào cửa sổ mã và nhấn Enter:
Sub MyFirstSub()
- VBA sẽ tự động thêm dòng
End Sub
. Chúng ta sẽ viết mã giữa hai dòng này. - Nhập dòng mã sau giữa
Sub MyFirstSub()
vàEnd Sub
:Range("A1").Value = 5
- Click vào Sub để đặt con trỏ vào trong Sub. Chọn Run > Run Sub/UserForm (hoặc nhấn
F5
).
Lưu ý: Nếu con trỏ không nằm trong Sub, VBA sẽ chạy Sub đang hiển thị.
- Quay lại Excel (
Alt + F11
). Bạn sẽ thấy giá trị 5 trong ô A1. - Thử thêm các dòng mã sau vào Sub, chạy Sub và kiểm tra kết quả:
Range("B1").Value = "some text"
Range("C3:E5").Value = 5.55
Range("F1").Value = Now
Kết Thúc Hoạt Động 3
Bạn đã học cách viết và chạy Sub trong VBA.
Điền Giá Trị Vào Ô
Dòng mã Range("A1").Value = 5
có thể viết gọn là Range("A1") = 5
vì Value là thuộc tính mặc định. Chúng ta dùng cách này để gán giá trị giữa các ô và biến. VBA sẽ tính toán giá trị bên phải dấu “=” và gán kết quả vào ô/biến bên trái dấu “=”.
Hoạt Động 4: Gán Giá Trị Giữa Các Ô
- Tạo một Workbook mới.
- Nhập giá trị 20 vào ô C1 và 80 vào ô C2 trên Sheet1.
- Tạo một Sub mới tên là Act4.
- Viết mã để gán giá trị từ C1 vào A1.
- Viết mã để gán kết quả của C2 + 50 vào ô A2.
- Viết mã để tính tích của C1 và C2, gán kết quả vào ô A3.
- Chạy mã. Kết quả: A1 = 20, A2 = 130, A3 = 1600.
Các Ô Trên Trang Tính Khác Nhau
Việc sao chép giá trị giữa các ô trên các trang tính khác nhau cũng tương tự như trên cùng một trang tính, chỉ khác tên trang tính trong mã.
Hoạt Động 5: Sao Chép Giá Trị Giữa Các Trang Tính
- Thêm một trang tính mới (Sheet2) vào Workbook.
- Tạo một Sub mới tên là Act5.
- Viết mã để sao chép giá trị từ C1 trên Sheet1 sang A1 trên Sheet2.
- Viết mã để gán tổng của C1 và C2 trên Sheet1 vào A2 trên Sheet2.
- Viết mã để gán tích của C1 và C2 trên Sheet1 vào A3 trên Sheet2.
- Chạy mã. Kết quả trên Sheet2: A1 = 20, A2 = 100, A3 = 1600.
Tên Mã Của Trang Tính
Trong cửa sổ Project – VBAProject, bạn thấy tên trang tính ở hai dạng: Sheet1 (tên mã) và (Sheet1) (tên hiển thị trên tab). Tên mã dùng để tham chiếu trang tính trong VBA. Nên sử dụng tên mã để mã VBA không bị ảnh hưởng khi đổi tên trang tính trên tab.
Hoạt Động 6: Sử Dụng Tên Mã Trang Tính
- Mở một Workbook mới và mở VBA Editor.
- Click vào Sheet1 trong cửa sổ Project – VBAProject.
- Mở cửa sổ Properties (nhấn F4 nếu không thấy).
- Đổi tên mã của trang tính thành shReport.
- Tạo một Module mới tên là modAct6.
- Thêm Sub sau và chạy:
Sub UseCodename()
shReport.Range("A1").Value = 66
shReport.Range("B2").Value = 55
End Sub
- Đổi tên trang tính trong Excel thành report.
- Xóa nội dung các ô và chạy lại Sub UseCodename. Mã vẫn chạy đúng.
Lệnh With
Lệnh With
giúp viết mã ngắn gọn hơn khi làm việc với cùng một đối tượng (ví dụ: trang tính).
Thụt Lề Mã
Nên thụt lề mã để dễ đọc và hiểu. Dùng phím Tab để thụt lề và Shift + Tab để bỏ thụt lề.
Sao Chép Giá Trị Giữa Nhiều Ô
Có thể sao chép giá trị giữa các vùng dữ liệu bằng cách sử dụng Range("vùng đích").Value = Range("vùng nguồn").Value
. Vùng nguồn và vùng đích phải có cùng kích thước.
Chuyển Vị Vùng Dữ Liệu
Hàm WorksheetFunction.Transpose
dùng để chuyển vị vùng dữ liệu (hàng thành cột và ngược lại).
Sử Dụng Biến
Biến dùng để lưu trữ giá trị tạm thời khi chạy mã. Nên khai báo biến trước khi sử dụng. Các kiểu biến thường dùng: Boolean
, Currency
, Date
, Double
, Long
, String
, Variant
.
Khai Báo Biến
Để bắt buộc khai báo biến, thêm dòng Option Explicit
vào đầu Module hoặc chọn Tools > Options > Require Variable Declaration trong VBA Editor. Khai báo biến theo cú pháp: Dim tên_biến As kiểu_biến
.
Immediate Window
Immediate Window (Ctrl + G) dùng để hiển thị kết quả debug. Dùng Debug.Print
để ghi giá trị ra Immediate Window.
Điền Giá Trị Giữa Biến Và Ô
Có thể gán giá trị giữa biến và ô bằng dấu “=”.
Lỗi Không Khớp Kiểu Dữ Liệu
Lỗi “Type Mismatch” xảy ra khi gán giá trị không đúng kiểu dữ liệu của biến (ví dụ: gán chuỗi vào biến số).
Discussion about this post