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
2
3
Private Sub say_helloworld()
MsgBox "Hello world! I am Minh"
End Sub

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
18
Sub 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
9
Sub 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
11
Dim 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ìm

1
"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:

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
18
Sub 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óa

1
"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-vba
1
2
3
Sub Redirect_New_URL()
ThisWorkbook.FollowHyperlink ("http://www.google.com")
End Sub

Tài liệu tham khảo

VBA Tutorial

Author

Ming

Posted on

2019-12-30

Updated on

2021-04-10

Licensed under

Comments