Visual Basic for Applications (VBA) Notes
Bài viết tập trung tổng hợp lại 1 số thứ tác giả học được khi làm việc với Macro trên MS-Excel
VBA stands for Visual Basic for Applications, an event-driven programming language from Microsoft. It is now predominantly used with Microsoft Office applications such as MSExcel, MS-Word and MS-Access. This tutorial teaches the basics of VBA. Each of the sections contain related topics with simple and useful examples.
Note: VBA chỉ dùng cho MSExcel thôi nhé, nó sẽ không hoạt động khi bạn mở file bằng các trình chỉnh sửa văn bản khác.
1. Bật macro
Bật chế độ Developer
Chọn File => Option => Customize Ribbon và bật chế độ Developer lên :D
Enable macro
Chọn Developer => Macro Security và chọn Enable marco lên.
Chi tiết bạn có thể xem tại: https://www.tutorialspoint.com/vba/vba_excel_macros.htm
2. Hello world!
Để tạo 1 marco, bạn chọn Visual Basic, kích đúp vào sheet đó và viết các đoạn mã macro thôi.
Hoặc bạn cũng có thể nhấn vào Macro và sau đó viết các đoạn mã như bình thường.
1 | Private Sub say_helloworld() |
Một vài biến global
Khi bạn select một khoảng cell, nó sẽ được set vào biến global Application.Selection
và có thể truy cập:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18Sub Macro1()
'
' Macro1 Macro
'
'
Range("E1:E8").Select
'Khi bạn select nó sẽ lưu giá trị vào biến global Application.Selection
để foreach ở phía dưới'
Dim count As Integer
Dim valueEColumns As String
For Each cel In Application.Selection.Cells
count = count + 1
valueEColumns = postId & cel & ","
Next cel
MsgBox valueEColumns
End Sub
Còn nhiều biến global, trong phạm vi hiểu biết của tác giả thì chỉ biết global này @@
3. Debug and breakpoint
VBA có hỗ trợ breakpoint để debug.
Trước tiên bạn cần bật cửa sổ lên để xem các thông tin debug. Cửa số này trong VBA là Locals window. Bạn có thể bật nó ở tùy chọn View => Locals window.
Một cửa sổ mới sẽ xuất hiện dưới đoạn code của bạn
Và khi debug chúng ta có thể đọc đang các biến từ breakpoint
4. Record macro
Đây là một chức năng hữu ích của macro cho người mới bắt đầu. Các thao tác bạn thực hiện trong file excel sẽ được ghi lại là sinh ra đoạn mã VBA tương ứng.
Việc làm tiếp theo của bạn là đọc hiểu đoạn code này và customize lại thôi
Thao tác sẽ như sau
Bước 1: Thực hiện thao tác macro
- Bạn ấn vào Record macro. Sau đó thực hiện các hành động với file excel (tính toán tổng các cột, copy paste dữ liệu, lựa chọn cột …)
- Sau khi đã thực hiện sau chọn Stop macro và nó sẽ lưu đoạn mã macro đó cho bạn
Bước 2: Xem macro
- Để xem đoạn macro vừa sinh ra, bạn chọn Macro. Chọn tên macro đó và chọn Edit
Xem đoạn demo sau nha.
5. Cases study
Bài toán 1: Lấy ra giá trị sau khi lọc dữ liệu.
Bài toán: Cho file excel với cột A chứa id của học sinh của 1 lớp. Bài toán đặt ra là sau khi filter dữ liệu (theo lớp, theo ngày hoặc bất cứ điều gì), hãy hiển thị ra 20 student_id đầu tiên filter được.
Bước 1: Sử dụng Record macro
Nhận thấy sau khi filter các thứ, bạn chọn copy cả column đó thì nó sẽ chỉ lấy ra được các giá trị đã được filter. Do đó ta sẽ record hành động copy của cả column A này
Và đây là đoạn mã nó sinh ra:1
2
3
4
5
6
7
8
9Sub Macro1()
'
' Macro1 Macro
'
'
Columns("A:A").Select
Selection.Copy
End Sub
OK ta chỉ tận dụng được 1 dòng nhỉ =))
Bước 2: Chỉnh sửa đoạn code Record được
Như đã nói ở trên, khi dùng Select
nó được lưu giá trị vào global Application.Selection
. Việc tiếp theo là duyệt Selection
này nhỉ.
Tìm kiếm Google với cụm từ “vba for each in selection” bạn sẽ được hướng dẫn như sau:1
2
3
4
5
6
7
8
9
10
11Dim postId As String
Dim count As Integer
Columns("B:B").Select
For Each cel In Application.Selection.Cells
count = count + 1
If count > 20 Then Exit For
postId = postId & cel & ","
Next cel
MsgBox postId
Nguồn: https://stackoverflow.com/questions/21526863/excel-vba-selected-cells-loop
Nhưng khoan đã, có gì đó sai sai. Đoạn mã này có vẻ lấy cả các giá trị trống của 1 cell. Như vậy ta phải loại bỏ các giá trị trống này nữa.
Từ khóa mình tìm1
"vba get value not empty selection".
Và từ khóa cao thủ hơn tìm:1
"vba select only visible cells"
Tất nhiên từ khóa sau sẽ ra kết quả phù hợp luôn:
- https://excelribbon.tips.net/T008524_Selecting_Visible_Cells_in_a_Macro.html
- https://stackoverflow.com/questions/43065610/vba-selecting-visible-cells-after-filtering
Và đây là đoạn code cuối cùng sau khi loại bỏ các giá trị trống:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18Sub Macro1()
'
' Macro1 Macro
'
'
Dim postId As String
Dim count As Integer
Columns("B:B").Select
For Each cel In Selection.SpecialCells(xlCellTypeConstants)
count = count + 1
If count > 20 Then Exit For
postId = postId & cel & ","
Next cel
MsgBox postId
End Sub
Bài toán 2: Macro chuyển hướng đến một trang web cho trước với trình duyệt mặc định
Với từ khóa1
"vba redirect url with default browser"
và đây là kết quả mình tìm được:
https://stackoverflow.com/questions/3166265/open-an-html-page-in-default-browser-with-vba1
2
3Sub Redirect_New_URL()
ThisWorkbook.FollowHyperlink ("http://www.google.com")
End Sub
Tài liệu tham khảo
Visual Basic for Applications (VBA) Notes
http://yoursite.com/2019/12/30/Visual-Basic-for-Applications-VBA-Notes/