LẬP TRÌNH EXCEL VBA QUA CÁC VÍ DỤ (Phần cơ bản) Hướng dẫn tự học lập trình Excel VBA cho người mới bắt đầu. Từng bước làm chủ Excel VBA ứng dụng trong quản trị và khai thác dữ liệu... LỜI NÓI ĐẦU Microsoft Excel là công cụ hàng đầu trong quản lý dữ liệu, đặc biết là các tác vụ như quản kế toán, tài chính, nhân sự, … Các bạn đã được làm quen với phần mềm Excel từ. Tuy nhiên, hầu hết các bạn chưa khai thác hết sức mạnh của công cụ ngày. Cuốn sách này sẽ giúp bạn làm quen với và khai thác một chức năng nâng cao vô cùng hiệu quả trong quản lý, phân tích dữ liệu với lập trình Excel VBA. Bạn sẽ được tìm hiểu lập trình Excel VBA qua các ví dụ cụ thể, điều đó giúp các bạn có thể hình dung một cách dễ dàng.
Trang 1THANH TRAN, TRAN T X.
Copyright © 2019 by Thanh Tran
Trang 2L Ờ I NÓI Đ U ẦMicrosoft Excel là công cụ hàng đầu trong quản lý dữ liệu,đặc biết là các tác vụ như quản kế toán, tài chính, nhân sự,
… Các bạn đã được làm quen với phần mềm Excel từ Tuynhiên, hầu hết các bạn chưa khai thác hết sức mạnh củacông cụ ngày
Cuốn sách này sẽ giúp bạn làm quen với và khai thác mộtchức năng nâng cao vô cùng hiệu quả trong quản lý, phântích dữ liệu với lập trình Excel VBA
Bạn sẽ được tìm hiểu lập trình Excel VBA qua các ví dụ cụthể, điều đó giúp các bạn có thể hình dung một cách dễdàng
Trang 3Bài 6 Câu l nh If then (If Then Statement) ệ Bài 7 C u trúc l p (Loop) ấ ặ
Bài 8 L i Macro (Macro Errors) ỗ
Trang 4B ÀI 1 T Ạ O M T Ộ MACRO (C REATE A
M ACRO )
Nội dung:
Swap Values, Run Code from a Module, Macro Recorder, Use Relative References, FormulaR1C1, Add a Macro to the Toolbar, Macro Security, Protect Macro
TRAO Đ IỔ GIÁTRỊ (SWAP VALUES)
Ví d này h ụ ướ ng d n cho b n cách trao đ i hai giá tr trong ẫ ạ ổ ị Excel VBA B n th ạ ườ ng sẽ c n c u trúc này trong các ch ầ ấ ươ ng trình ph c t p h n ứ ạ ơ
Tình hu ng: ố
Cho 2 giá tr ị
Trong commandButton1 b n vi t code nh sau: ạ ế ư
1 Khai báo bi n ế temp ki u Double.ể
Dim temp As Double
2 Kh i t o giá tr ban đ u cho bi n temp t ô A1, lúc này ở ạ ị ầ ế ừ temp là bi n trung gian ế
Trang 5Ví dụ này hướng dẫn bạn cách chạy mã từ một mô-đun.
1 Mở Visual Basic Editor.
Trang 62 Click Insert, Module.
3 Tạo một thủ tục (macro) tên là Cyan.
Cells.Interior.ColorIndex = 28
Chạy thủ tục để thực hiện bước tiếp theo
5 Click Macros
Trang 76 Chọn Cyan và click Run.
Kết quả:
Trang 8Lưu ý: mã được đặt vào một mô-đun có sẵn cho toàn bộ sổ
làm việc Điều đó có nghĩa là, bạn có thể chọn Sheet2 hoặc Sheet3 và thay đổi màu nền của các trang tính này Chươngtrình thêm Macro vào thanh công cụ minh họa cách cung cấp macro cho tất cả các sổ làm việc của bạn (tệp Excel) Hãy nhớ rằng, mã được đặt trên một trang tính (được gán cho nút lệnh) chỉ khả dụng cho trang tính cụ thể đó
BẢNGHI MACRO (MACRO RECORDER)
Trình bản ghi Macro, một công cụ rất hữu ích có trong
Excel VBA, ghi lại mọi tác vụ bạn thực hiện với Excel Tất
cả bạn phải làm là ghi lại một nhiệm vụ cụ thể một lần Tiếp theo, bạn có thể thực hiện nhiệm vụ nhiều lần với một nút bấm Trình ghi Macro cũng là một trợ giúp tuyệt vời khi bạn không biết cách lập trình một tác vụ cụ thể trong Excel VBA Chỉ cần mở Trình soạn thảo Visual Basic sau khi ghi tác vụ để xem cách lập trình
Thật không may, có rất nhiều điều bạn không thể làm với Trình ghi Macro Ví dụ: bạn không thể lặp qua một vùng
Trang 9hay một phạm vi dữ liệu với Trình bản ghi Macro Hơn nữa, Trình bản ghi Macro sử dụng nhiều mã hơn mức cần thiết, điều này có thể làm chậm quá trình của bạn.
Trang 10Lưu ý: nếu bạn lưu trữ macro của bạn trong Personal
Macro Workbook, macro sẽ có sẵn cho tất cả các sổ làm việc của bạn (tệp Excel) Nếu bạn lưu trữ macro của bạn trong New Workbook, macro sẽ chỉ khả dụng trong một sổ làm việc mới được mở tự động
4 Click OK
5 Nhấp chuột phải vào ô hành động (ô đã chọn) Hãy chắc chắn không chọn bất kỳ ổ nào khác! Tiếp theo, nhấp vào Format Cells
6 Chọn Percentage
Trang 117 Click OK.
8 Cuối cùng, click Stop Recording
Xin chúc mừng Bạn vừa ghi một macro với Trình bản ghi Macro!
Trang 12C H Y Ạ TRÌNH B N Ả GHI M ACRO (R UN A R ECORDED M ACRO )
Bây giờ chúng tôi sẽ kiểm tra macro để xem liệu nó có thể thay đổi định dạng số thành Phần tram (Percertage) hay không
1 Nhấp số bất ký trong khoảng tử 0 đến 1
2 Chọn các số
3 Trên tab Developer, click Macros
4 Click Run
Trang 13Kết quả:
X EM M ACRO
Để xem macro, hãy mở Visual Basic Editor
Trang 14Lưu ý: macro đã được đặt vào mô-đun có tên Module1
Mã được đặt vào một mô-đun có sẵn cho toàn bộ bảng tính.Điều đó có nghĩa là, bạn có thể chọn Sheet2 hoặc Sheet3 vàthay đổi định dạng số lượng ô trên các trang tính này Hãy nhớ rằng, mã được đặt trên một trang tính (được gán cho nút lệnh) chỉ khả dụng cho trang tính cụ thể đó
SỬ D NGỤ TÀILI UỆ THAM KH OẢ TƯƠNGĐ IỐ(USE RELATIVE REFERENCES)
Theo mặc định, Excel ghi lại các macro ở chế độ tuyệt
đối Tuy nhiên, đôi khi rất hữu ích khi ghi macro ở chế độ
tương đối Chương trình này hướng dẫn bạn làm thế nào
để làm điều này Nếu bạn không biết cách ghi macro, chúngtôi khuyên bạn nên đọc ví dụ này trước
G HI Ở CHẾ ĐỘ TUY T Ệ Đ I Ố
Để ghi lại một macro trong chế độ tuyệt đối, thực hiện các bước sau
1 Đầu tiên, click Record Macro.
2 Tiếp theo, chọn ô B3 Nhập Sales và nhấn enter
Trang 16Một macro được ghi ở chế độ tuyệt đối luôn tạo ra kết quả tương tự.
Trang 176 Nhập Logistics và nhấn enter.
Kết quả:
7 Click Stop Recording.
8 Chọn ổ bất kỳ (ví dụ, ô D4) và chạy macro đã tạo.Kết quả:
Trang 18Excel đặt các từ liên quan đến ô được chọn ban đầu Đó là
lý do tại sao nó được gọi là ghi âm ở chế độ tương đối
FORMULAR1C1
Ví dụ này minh họa sự khác biệt giữa A1, R1C1 và
R[1]C[1] trong Excel VBA.
1 Tại một câu lệnh button trên bảng tính của bạn, biết các dòng code (kiểu A1)
Trang 19Giải thích: ô D4 tham chiếu ô B3 (dòng (row) 3, cột
(column) 2) Đây là một tham chiếu tuyệt đối (ký hiệu $ ở phía trước số hàng và ký tự cột)
3 Thêm dòng code (kiểu R[1]C[1]):
Range("D4").FormulaR1C1 = "=R[-1]C[-2]*10"Kết quả:
Giải thích: ô D4 tham chiếu ô B3 (dòng dịch 1 lên phía trên, cột dịch 2 sang trái) Đây là một tài liệu tham khảo tương đối Dòng mã này cho kết quả chính xác giống như dòng mã được sử dụng ở bước 1
4 Tại sao học về điều này? Bởi vì Trình bản ghi Macro sử dụng thuộc tính FormulaR1C1 (kiểu R [1] C [1]) Trình ghi Macro tạo các dòng mã sau nếu bạn nhập công thức = B3 *
10 vào ô D4
Giải thích: bạn có thể thấy rằng đây là cùng một dòng mã được sử dụng ở bước 3
Trang 20THÊMM TỘ MACROVÀOTOOLBAR
Nếu bạn sử dụng một Excel macro thường xuyên, bạn có thể thêm nó vào Quick Access Toolbar
1 Trên tab Developer, click Record Macro.
2 Tên macro MyName Chọn macro trong Personal
Macro Workbook Bằng cách này, macro sẽ có sẵn cho tất
cả các sổ làm việc của bạn (tệp Excel) Điều này là có thể bởi vì Excel lưu trữ macro của bạn trong một sổ làm việc
ẩn tự động mở khi Excel khởi động
Trang 213 Click Stop Recording.
4 Mở Visual Basic Editor.
5 Tạo một macro:
Trong macro này bạn đặt tên của bạn trong ActiveCell
6 Bây giờ chúng ta có thể bổ sung them macro này vào
Quick Access Toolbar Click phải Quick Access Toolbar
và chọn Customize Quick Access Toolbar
Trang 227 Dưới Choose commands, chọn Macros.
8 Chọn macro và click Add
9 Bạn có thể sửa đổi nút sẽ được thêm vào Quick Access Toolbar bằng cách nhấp vào Modify Ví dụ, chọn một nụ cười
Trang 24Save để lưu macro này trong sổ làm việc ẩn tự động mở khiExcel khởi động Bằng cách này, macro sẽ có sẵn cho tất cảcác sổ làm việc của bạn (tệp Excel).
B OẢ M TẬ MACRO (MACRO SECURITY)
Để thiết lập cài đặt bảo mật macro trong Excel, hãy thực hiện các bước sau
1 Tên tab Developer, click Macro Security.
2 Ở đây bạn có bốn lựa chọn Tùy chọn đầu tiên sẽ vô hiệuhóa tất cả các macro Tùy chọn thứ hai sẽ luôn yêu cầu bạn kích hoạt macro Tùy chọn thứ ba sẽ chỉ cho phép các macro có chữ ký số chạy và yêu cầu bạn kích hoạt các macro khác Tùy chọn thứ tư sẽ kích hoạt tất cả các macro
Trang 25Lời khuyên của chúng tôi là sử dụng cấp bảo mật thứ hai nếu bạn đang tải xuống nhiều tệp Excel từ Internet Với mức bảo mật này, bạn luôn có thể vô hiệu hóa macro nếu bạn không tin tưởng chủ sở hữu tệp Excel Sử dụng cấp độ bảo mật thứ tư nếu bạn là người mới bắt đầu và chỉ nhập các macro của riêng bạn vào lúc này Với mức bảo mật này,bạn không cần phải bật macro mọi lúc.
BẢOM TẬ MACRO
Giống như bạn có thể mật khẩu bảo vệ sổ làm việc và bảng
tính, bạn có thể dung mật khẩu bảo vệ một macro trong
Excel khỏi bị xem (và được thực thi)
Đặt nút lệnh trên bảng tính của bạn và thêm các dòng mã sau:
1 Đầu tiên, tạo một macro đơn giản bạn muốn bảo vệ
Range("A1").Value = "This is secret code"
Trang 262 Tiếp theo, click Tools, VBAProject Properties.
3 Trên tab Protection, tích chọn "Lock project for
viewing" và nhập password 2 lần.
4 Click OK
5 Save, đóng và mở lại file Excel Thử mở code macro.Bạn nhận được thông báo:
Trang 27Bạn muốn mở được, bạn cần nhập đúng mật khẩu đã đặt.
6 Nếu bạn muốn mật khẩu bảo vệ macro khỏi bị thực thi, hãy thêm các dòng mã sau:
Dim password As Variant
password = Application.InputBox("Enter
Password", "Password Protected")
Select Case password
Trang 29B ÀI 2 L ÀM VI C Ệ V I Ớ M SG B OX
Nội dung:
MsgBox Function, InputBox Function
HÀM MSGBOX
Hàm MsgBox trong Excel VBA có thể trả về kết quả trong
khi MsgBox đơn giản
Tính huống:
Tại command button trong worksheet của bạn, bạn thêm các dòng lệnh:
1 Đầu tiên, khai báo một biến answer kiểu Integer
Dim answer As Integer
Trang 302 Sử dụng hàm MsgBox để khởi tạo giá trị cho biến answer bằng việc nhập từ form.
Hàm MsgBox, khi sử dụng dấu ngoặc đơn, có ba đối số Phần đầu tiên được sử dụng cho tin nhắn trong hộp tin nhắn Sử dụng phần thứ hai để chỉ định các nút và biểu tượng bạn muốn xuất hiện trong hộp thông báo Phần thứ
ba được hiển thị trong thanh tiêu đề của hộp thông báo
answer = MsgBox("Are you sure you want to emptythe sheet?", vbYesNo + vbQuestion, "Empty
Sheet")
Lưu ý: Đặt con trỏ của bạn trên vbYesNo trong Visual Basic Editor và click F1 để xem các nút và biểu tượng khác
mà bạn có thể sử dụng Thay vì hằng số vbYesNo và vbQuestion, bạn cũng có thể sử dụng các giá trị tương ứng
4 và 32
3 Nếu clicks nút Yes, Excel VBA xóa trống Sheet Nếu clicks nút No, không có sự kiện gì Thêm các dòng mã sau
để đạt được điều này
If answer = vbYes Then
Trang 31Kết quả:
HÀM INPUTBOX
Bạn có thể sử dụng hàm InputBox trong Excel VBA để nhắc người dùng nhập giá trị Đặt nút lệnh trên bảng tính của bạn và thêm các dòng mã sau:
1 Đầu tiên, khai báo biến myValue kiểu Variant
Dim myValue As Variant
Lưu ý: chúng tôi sử dụng biến kiểu Variant ở đây bởi vì biến Variant có thể giữ bất kỳ loại giá trị
2 Thêm dòng lệnh
Trang 32myValue = InputBox("Give me some input")
3 Nhập một giá trị cho myValue từ ô A1
Range("A1").Value = myValue
Kết quả khi người dùng nhập giá trị 5 và nhấp vào nút OK
4 Hàm InputBox có nhiều đối số tùy chọn hơn Dòng mã sau đây hiển thị hộp đầu vào có tiêu đề được hiển thị trên thanh tiêu đề và có giá trị mặc định Giá trị mặc định sẽ được sử dụng nếu không có đầu vào nào khác được cung cấp
myValue = InputBox("Give me some input", "Hi", 1)
Trang 33Kết quả khi click nút OK.
Lưu ý: Đặt con trỏ của bạn trên InputBox trong Trình soạn thảo Visual Basic và nhấp vào F1 để được trợ giúp về các đối số tùy chọn khác
Trang 34B ÀI 3 Đ Ố I T ƯỢ NG W ORKBOOK VÀ
Nội dung:
Sales Calculator, Path and FullName, Close and Open, Loop through Books and Sheets, Import Sheets,
Programming Charts, Files in a Directory
ĐƯỜNGD NẪ VÀTÊNĐ YẦ ĐỦ (PATH AND
FULLNAME )
Thuộc tính Path trong Excel VBA trả về hoàn chỉnh,
đường dẫn lưu vào sổ làm việc (Excel file) Thuộc
tính FullName trong Excel VBA trả về hoàn chỉnh, lưu
đường dẫn, bao gồm tên của bảng tính
Download path-fullname.xls (bit.ly/2ZgB0fx) và thêm nó vào ổ "C:\test\"
Đặt nút lệnh trên bảng tính của bạn và thêm các dòng mã sau:
1 Dòng mã sau đây trả về đường dẫn đầy đủ đến fullname.xls
path-MsgBox Workbooks("path-fullname.xls").Path
Kết quả:
Trang 352 Dòng mã sau đây trả về đường dẫn đầy đủ, bao gồm tên của sổ làm việc đang hoạt động.
MsgBox ActiveWorkbook.FullName
Kết quả:
MỞVÀĐÓNG (CLOSEAND OPEN)
Phương thức Close và Open trong Excel VBA có thể dung
để mở và đóng workbooks Nhớ rằng, Workbooks chứa các đối tượng Workbook hiện đang mở
Trang 36Đặt nút lệnh trên bảng tính của bạn và thêm các dòng mã sau:
Trang 37Kết quả:
7 Tiếp theo, bạn có mở file thường dùng
Workbooks.Open (MyFile)
LẶPQUA BOOKS VÀ SHEETS
Dưới đây chúng tôi sẽ xem xét một chương trình trong Excel VBA lặp qua tất cả các bảng tính và bảng tính đang
mở và hiển thị tất cả các tên
Tình huống:
Trang 38Thêm các dòng lệnh vào command button:
1 Đầu tiên, chúng ta khai báo hai đối tượng và một biến Một đối tượng của loại Workbook mà chúng ta gọi là book, một đối tượng của loại Worksheet mà chúng ta gọi là sheet
và một biến kiểu String chúng ta gọi là text
Dim book As Workbook, sheet As Worksheet, text As String
2 Chúng tôi muốn lặp qua tất cả các sách bài tập mở Để đạt được điều này, hãy thêm dòng mã sau:
For Each book In Workbooks
3 Viế dòng chữ "Workbook: ", tên của bảng tính, và dòng chữ "Worksheets: "" để đến biến văn bản
text = text & "Workbook: " & book.Name &
vbNewLine & "Worksheets: " & vbNewLine
Lưu ý: bạn có thể sử dụng toán tử & toán tử để nối các phần tử (nối) Để bắt đầu một dòng mới, bạn có thể sử dụngvbNewLine
4 Để lặp qua tất cả các bảng tính của sổ làm việc, hãy thêmdòng mã sau:
For Each sheet In book.Worksheets
5 Chúng tôi viết tên của các bảng tính của một bảng tính vào văn bản biến
text = text & sheet.Name & vbNewLine
Trang 396 Đóng vòng lặp thứ hai.
Next sheet
7 Thêm một dòng trắng
text = text & vbNewLine
8 Đừng quên đóng vòng lặp đầu tiên
Kết quả:
Trang 40MÁY TÍNHBÁNHÀNG
Dưới đây chúng tôi sẽ xem xét một chương trình trong
Excel VBA tính toán tổng doanh số của mỗi nhân viên
trong khoảng thời gian ba năm
Tình huống:
Hai sheet khác nhau có cùng một thiết lập, nhưng với sự kết hợp khác nhau của tháng và nhân viên, và số lượng bán hàng khác nhau Có một số cách để tính tổng doanh số của
Trang 41từng nhân viên trong Excel, nhưng chúng ta sẽ thấy rằng nó
có thể được thực hiện trong Excel VBA rất dễ dàng
Đặt nút lệnh trên bảng tính của bạn và thêm các dòng mã sau:
1 Đầu tiên, chúng tôi khai báo ba biến và một đối tượng Worksheet Một biến kiểu Chuỗi chúng ta gọi là worker, một biến kiểu Integer mà chúng ta gọi là Total, một đối tượng Worksheet mà chúng ta gọi là sheet và một biến kiểu Integer mà chúng ta gọi là i
Dim employee As String, total As Integer,
sheet As Worksheet, i As Integer
2 Chúng tôi khởi tạo hai biến Chúng tôi khởi tạo tổng biếnvới giá trị 0 Chúng tôi sử dụng hàm InputBox để lấy tên nhân viên từ người dùng
Trang 42For Each sheet In Worksheets
4 Bắt đầu lặp For Next
For i = 2 To 13
5 Nếu tên nhân viên đã nhập khớp với tên nhân viên trong cột B, Excel VBA sẽ thêm số doanh thu vào tổng biến Thêm các dòng mã sau:
If sheet.Cells(i, 2).Value = employee Then
total = total + sheet.Cells(i, 3).Value
8 Kiểm tra chương trình
Kết quả for David:
Trang 43TỆPTINTRONG THƯM CỤ (FILESIN A
DIRECTORY)
Dưới đây chúng tôi sẽ xem xét một chương trình trong Excel VBA lặp lại tất cả các sổ làm việc và bảng tính đã đóng trong một thư mục và hiển thị tất cả các tên
Download file: Book1.xls, Book2.xls, Book3.xls,
Book4.xls và Book5.xls (tại: http://bit.ly/31WSiLq) lưu vàothư mục "C:\test\"
Tính huống:
Thêm các dòng mã sau vào nút lệnh:
1 Khai báo 2 biến kiểu String, một biến kiểu Worksheet và
2 biến kiểu Integer
Dim directory As String, fileName As String, sheet As Worksheet, i As Integer, j AsInteger
2 Để tránh hiện tượng nhấp nháy màn hình, hãy tắt cập nhật màn hình
Application.ScreenUpdating = False
Trang 443 Khởi tạo thư mục biến Chúng tôi sử dụng hàm Dir để tìm * xl đầu tiên ?? tập tin được lưu trữ trong thư mục này.
directory = "c:\test\"
fileName = Dir(directory & "*.xl??")
Lưu ý: hàm Dir hỗ trợ sử dụng nhiều ký tự (*) và ký tự đơn(?) Để tìm kiếm tất cả các loại tệp Excel khác nhau
4 Biến fileName hiện giữ tên của tệp Excel đầu tiên được tìm thấy trong thư mục Thêm một vòng lặp Do While
Do While fileName <> ""
Loop
Thêm các dòng mã sau (tại 5, 6, 7, 8 và 9) vào vòng lặp
5 Khởi tạo các biến kiểu Integer và thêm tên của tệp Excel vào cột đầu tiên của hàng i
Workbooks.Open (directory & fileName)
7 Thêm tất cả các tên trang tính của tệp Excel vào các cột khác của hàng i
For Each sheet In Workbooks(fileName).Worksheets Workbooks("files-in-a-