Professional Documents
Culture Documents
Excel Macro Mastery
Excel Macro Mastery
Làm thế nào bạn có thể viết VBA như một chuyên
gia trong 15 bước đơn giản
Paul M Kelly
Bản quyền © 2014 Paul M Kelly
Đã đăng ký Bản quyền. Không một phần nào của cuốn sách này có thể
được sao chép dưới bất kỳ hình thức nào mà không có sự cho phép bằng
văn bản của tác giả. Người đánh giá có thể trích dẫn các đoạn ngắn trong
bài đánh giá.
Disclaimer
Không một phần nào của ấn phẩm này có thể được sao chép hoặc truyền tải
dưới bất kỳ hình thức nào hoặc bằng bất kỳ phương tiện nào, cơ học hoặc
điện tử, bao gồm sao chụp hoặc ghi âm, hoặc bằng bất kỳ hệ thống lưu trữ
và truy xuất thông tin nào, hoặc được truyền qua email mà không có sự cho
phép bằng văn bản của nhà xuất bản.
Mặc dù tất cả các nỗ lực đã được thực hiện để xác minh thông tin được
cung cấp trong ấn phẩm này, cả tác giả và nhà xuất bản đều không chịu bất
kỳ trách nhiệm nào đối với các lỗi, thiếu sót hoặc diễn giải trái ngược về
chủ đề trong tài liệu này. Mặc dù tất cả các nỗ lực đã được thực hiện để xác
minh mã được cung cấp trong ấn phẩm này, cả tác giả và nhà xuất bản đều
không chịu bất kỳ trách nhiệm nào đối với các lỗi, thiếu sót hoặc các vấn đề
có thể phát sinh từ việc sử dụng mã.
Các quan điểm được thể hiện là của riêng tác giả, và không nên được coi là
hướng dẫn hoặc mệnh lệnh của chuyên gia. Người đọc chịu trách nhiệm cho
hành động của chính mình. Việc tuân thủ tất cả các luật và quy định hiện
hành, bao gồm cấp phép chuyên môn quản lý quốc tế, liên bang, tiểu bang
và địa phương, thực tiễn kinh doanh, quảng cáo và tất cả các khía cạnh khác
của hoạt động kinh doanh tại Hoa Kỳ, Canada hoặc bất kỳ khu vực pháp lý
nào khác là trách nhiệm duy nhất của người mua hoặc người đọc.
Cả tác giả và nhà xuất bản đều không chịu bất kỳ trách nhiệm hoặc nghĩa
vụ pháp lý nào thay mặt cho người mua hoặc người đọc các tài liệu này.
Bất kì
Nhận thức về sự coi thường của bất kỳ cá nhân hoặc tổ chức nào là hoàn
toàn không cố ý.
Tại sao tôi viết cuốn sách này
Macro Excel rất mạnh mẽ. Họ có thể mở ra một thế giới cơ hội. Chúng có
thể làm cho Excel hoạt động như ma thuật. Tuy nhiên, hầu hết người dùng
Excel không bao giờ sử dụng chúng. Macro xuất hiện quá kỹ thuật và thách
thức, điều mà chỉ một lập trình viên có kinh nghiệm mới có thể quản lý.
Chúng xuất hiện ngoài tầm với của người dùng Excel thông thường.
Nhưng điều này không đúng!
Nếu bạn dành nhiều thời gian sử dụng Excel và bạn chưa bao giờ sử dụng
Macro thì bạn đang tước đi khả năng vô tận. Bạn có thể đã dành nhiều
tháng hoặc nhiều năm để thành thạo Excel. Tại sao không dành thêm một
chút thời gian để học một cái gì đó có lợi nhuận tiềm năng rất lớn.
Cách học Macro truyền thống đã khiến nhiều người dùng thất vọng. Tôi đã
thấy nó vô số lần, Mọi người dành vài ngày cho một khóa học hoặc làm
việc thông qua một cuốn sách 1000 trang, bị choáng ngợp với thông tin. Họ
không nhận thức được thực tế là hầu hết trong số đó là không liên quan.
Đây là bí mật mà không ai sẵn sàng thừa nhận...
90% công việc của bạn sẽ sử dụng ít hơn 10% các tính năng Excel Macro!
Thật tuyệt vời khi VBA có 7 loại vòng lặp. Bạn có thực sự cần phải biết tất
cả chúng khi một người sẽ làm việc cho bạn mọi lúc? Đối tượng Workbook
trong VBA có hơn 100 thuộc tính. Tôi đảm bảo rằng 99,9% thời gian bạn sẽ
sử dụng đối tượng Workbook cho 3 thứ, để mở sổ làm việc, đóng sổ làm
việc hoặc truy cập trang tính.
Đừng hiểu lầm tôi. Tôi thích thực tế là tất cả các thuộc tính này đều có sẵn
nếu tôi cần chúng. Vấn đề là tôi hiếm khi làm và tôi là một người xây dựng
các Macro Excel nâng cao.
Vậy tại sao phải lãng phí rất nhiều thời gian để học những thứ bạn có thể
không bao giờ sử dụng? Bạn có thể đạt được một số tiền đáng kinh ngạc với
một phần nhỏ các tính năng Macro.
Mục đích của tôi trong cuốn sách này là chỉ ra cách tối đa hóa việc sử dụng
phần đó của bạn
Có thể dễ dàng xây dựng Macro. Bạn có thể bắt đầu đơn giản như bạn
muốn. Bạn sẽ ngạc nhiên về những gì bạn có thể đạt được với một vài dòng
mã. Có kỹ năng Macro mạnh mẽ sẽ khiến bạn nổi bật so với các đồng
nghiệp của mình. Nó sẽ làm cho bạn hiệu quả hơn, tăng khả năng tuyển
dụng của bạn và cải thiện đáng kể cơ hội thăng tiến của bạn.
Các nguyên tắc tôi chỉ cho bạn không phải là lối tắt hoặc hack. Chúng là
những phương pháp mà các chuyên gia sử dụng để làm cho Macro của họ
hiệu quả, mạnh mẽ và dễ cập nhật. Chúng rất dễ học nếu bạn sẵn sàng nỗ
lực.
Bạn đang muốn tìm hiểu các kỹ thuật Macro thực tế mà bạn có thể sử dụng
ngay lập tức? Bạn đã viết một số Macro nhưng thấy làm điều đó là một
cuộc đấu tranh? Hoặc bạn đã viết Macro được một thời gian và muốn đưa
kỹ năng của mình lên một tầm cao mới?
Nếu vậy, thì đây là cuốn sách dành cho bạn. Nó có đầy đủ các ví dụ được
giải thích đầy đủ và dễ hiểu. Nó phác thảo các yếu tố quan trọng của Macro
và ở đâu và khi nào bạn nên sử dụng chúng. Nó cung cấp cho bạn các kỹ
thuật được sử dụng bởi các nhà phát triển Macro chuyên nghiệp.
Nếu bạn sẵn sàng nỗ lực thì bạn có thể trở thành một lập trình viên Macro
thành thạo trong một thời gian rất ngắn. Nó chỉ đòi hỏi một chút nỗ lực và
sẵn sàng học hỏi. Những phương pháp này đã làm việc cho vô số người
khác và chúng có thể làm việc cho bạn.
Paul M Kelly
Quà tặng miễn phí của bạn
Để cảm ơn bạn đã mua cuốn sách của tôi, tôi sẽ tặng một Cheat Sheet
miễn phí cho độc giả của tôi. Khi làm việc với các phần phức tạp hơn của
ngôn ngữ lập trình, tôi luôn thấy hữu ích khi có một hướng dẫn đơn giản
cho các phần quan trọng. Đó là lý do tại sao tôi tạo ra The Essential Cheat
Sheet cho VBA Arrays. Nhấp vào liên kết để nhận bản sao miễn phí của
bạn.
Tin tức
Xin vui lòng kiểm tra ExcelMacroMastery.com blog của tôi. Nó được đóng
gói với các bài viết VBA miễn phí chứa thông tin về tất cả các lĩnh vực lập
trình VBA.
Mục lục
Tại sao tôi viết cuốn sách
này món quà miễn phí của
bạn
Mục lục Giới thiệu
Thiết lập bản thân để giành chiến
thắng Macro - Cung cấp cho tôi
Câu hỏi thường gặp
Bước 1: Cách tạo đoạn mã đầu tiên của bạn chỉ trong vài giây Bước 2
phụ - Những gì bạn có thể làm chỉ với một dòng mã!
Bước 3: BA yếu tố kỳ diệu của VBA Bước 4:
Khi nào nên sử dụng các ô và phạm vi
Bước 5: Tại sao sử dụng biến thay vì ô
Bước 6: Đánh thức lập trình viên bên trong - Xây dựng macro đầu tiên
của bạn Bước 7 Tăng cường VBA với 2 vòng lặp này
Bước 8: Đưa ra lựa chọn - Sử dụng nếu và chọn
Bước 9 nút: Tạo một bảng điều khiển đơn giản
Bước 10 Thủ tục 2.0 Sức mạnh của các chức
năng
Bước 11: Mở sổ làm việc - Hãy để tôi làm điều đó cho
bạn Bước 12 : Cách dễ dàng sửa bất kỳ lỗi nào
Bước 13: Bộ sưu tập và mảng- Hướng dẫn về các nhóm mục
Bước 14 Nó còn sống! - Tạo Macro trong thế giới
thực Bước 15 : Cách để mã của bạn xử lý lỗi
Cách thực hiện bất kỳ tác vụ Excel nào trong
VBA
Phần thưởng: Từ điển - Bộ sưu tập cao cấp Kết luận:
Giới thiệu
Cuốn sách này sẽ giúp bạn trở thành một người tạo Excel Macro rất có khả
năng trong 15 bước đơn giản. Nếu bạn đã thực hiện một số công việc với
Macro trước đây, tôi vẫn khuyên bạn nên thực hiện từng bước. Bạn có thể
học được một cái gì đó mới.
Cuốn sách có đầy đủ các ví dụ mã mà bạn có thể sử dụng ngay lập tức. Ban
đầu, tôi khuyên bạn nên nhập các ví dụ về mã. Chúng thường chỉ có 1 hoặc
2 dòng.
Sao chép mã từ ứng dụng Kindle PC không phải là dễ dàng vì vậy tôi đã
cung cấp một liên kết với tất cả các ví dụ mã ở đây
Viết mã là cách duy nhất để học Marcos. Cuốn sách này cung cấp thông tin
tuyệt vời nhưng bạn cần phải thực hành nó. Lấy các ví dụ, thay đổi chúng
xung quanh và xem những kết quả khác nhau mà bạn nhận được. Đây là
một kỹ thuật rất hữu ích khi học bất kỳ ngôn ngữ lập trình nào.
Các phương pháp trong cuốn sách rất thiết thực và dễ áp dụng. Tôi tự sử
dụng chúng khi tạo các ứng dụng chuyên nghiệp. Nếu bạn thành thạo
chúng, bạn sẽ thấy dễ dàng mở rộng chuyên môn của mình sang các lĩnh
vực khác của ngôn ngữ VBA.
Phần đầu tiên cung cấp cho bạn lời khuyên về cách nghiên cứu cuốn sách
này. Phần sau đây cung cấp câu trả lời cho một số Câu hỏi thường gặp. Nó
giải thích Excel Marcos và VBA một cách ngắn gọn. Vui lòng dành thời
gian để đọc các phần này. Chúng ngắn và tôi hứa bạn sẽ thấy chúng hữu
ích.
Phần còn lại của cuốn sách được chia thành 15 phần. Tôi đã cố gắng bắt
đầu đơn giản nhất có thể để bạn có thể thiết lập và chạy nhanh chóng. Cố
gắng nắm vững vài bước đầu tiên trước khi bạn tiếp tục. Một khi bạn biết
những điều này, các phần khác sẽ có ý nghĩa hơn rất nhiều.
Thiết lập bản thân để giành chiến thắng
"Luôn luôn lấy mọi thứ bằng tay cầm trơn tru của chúng" - Thomas
Jefferson
Chỉ định một số thời gian trong ngày
Nếu bạn thích, bạn có thể xem qua cuốn sách này trong một ngày. Thực tế
là hầu hết mọi người không có thời gian. Tuy nhiên, bất cứ ai cũng có thể
tìm thấy 60 phút mỗi ngày.
Nó có vẻ không nhiều. Nhưng chỉ trong 20 ngày bạn sẽ có 20 giờ thực
hiện. Đây sẽ là những giờ chất lượng. Bạn sẽ ngạc nhiên về việc bạn học
được bao nhiêu trong thời gian này. Nếu bạn không có một giờ thì 30 phút
mỗi ngày có thể rất hiệu quả.
Khi bạn hoàn thành các bước này, bạn sẽ có điều này:
Sub công cộng MyProc
Bạn có thể có bao nhiêu mô-đun và quy trình tùy thích. Mô-đun là một cách
để nhóm các thủ tục của bạn. Ví dụ: hãy tưởng tượng bạn đang tạo hai báo
cáo. Mỗi báo cáo sẽ có một số thủ tục. Bạn có thể đặt các thủ tục cho mỗi
mô-đun trong một mô-đun khác nhau để chúng dễ quản lý hơn.
If you use Macros in a workbook save it as “Excel Macro-Enabled Workbook(*.xlsm
Bước 2: Sub - Những gì bạn có thể làm chỉ với
một dòng mã!
"Hành trình ngàn dặm bắt đầu bằng một bước." - Lão Tử
Hiện tại, chúng tôi sẽ sử dụng các thủ tục loại Sub. Khi bạn khởi động Sub,
nó sẽ đi qua các dòng mã theo thứ tự chúng xuất hiện. Nói cách khác, trước
tiên nó thực hiện nhiệm vụ được đưa ra bởi dòng đầu tiên. Khi điều đó kết
thúc, nó chuyển sang dòng tiếp theo và thực hiện nhiệm vụ này. Nó tiếp tục
cho đến khi nó đã đi qua tất cả các dòng trong thủ tục.
Nếu bạn muốn sử dụng chú thích trong code của mình thì hãy sử dụng dấu
nháy đơn('). Phần còn lại của dòng trở thành nhận xét và VBA chuyển
phông chữ sang màu xanh lá cây. Bạn có thể viết bất cứ điều gì trong nhận
xét vì VBA bỏ qua tất cả văn bản này. Bạn có thể thấy điều này trong Ví dụ
1 bên dưới.
Ví dụ 1
Công khai Sub ShowMessage()
'Tôi là một bình luận và tôi không làm gì cả
'Dòng tiếp theo sẽ hiển thị "Hello World" dưới dạng thông
báo MsgBox "Hello World"
Kết thúc phụ
Trong ví dụ trên, ShowMessage là tên của thủ tục. Bạn có thể sử dụng bất
kỳ tên nào bạn thích, tuy nhiên hai thủ tục không thể có cùng tên. Đó là
thực hành tốt để sử dụng một tên mô tả những gì các thủ tục làm.
Sao chép ví dụ này vào mô-đun và chạy nó bằng các bước bên dưới.
Steps To Run a Procedure
OR
1. Go to a Workbook
2. Click on the Developer Ribbon
3. Select Macros from Code section
4. In the dialog select your Sub from the list
5. Click Run
If you get an error then have a look in the next section of this chapter
for how to easily resolve them.
Khi bạn chạy ví dụ trên, nó sẽ hiển thị một thông báo với nội dung "Hello
World". Nhấp chuột Ok để tiếp tục. Thay đổi văn bản "Xin chào thế giới"
thành một cái gì đó khác. Chạy lại. Vâng, nó thực sự là dễ dàng để hiển thị
một tin nhắn.
Xin chúc mừng, bạn đã tạo ra Macro đầu tiên của mình!
Xử lý lỗi
Hầu hết mọi người đều ngừng học VBA vì lỗi. Bất cứ khi nào bạn bắt đầu
một cái gì đó mới, bạn sẽ phạm sai lầm. VBA cũng không ngoại lệ. Bí quyết
là không hoảng sợ khi xảy ra lỗi. Chúng thường dễ giải quyết. Khi bạn chưa
quen với VBA, có vẻ như không rõ nguyên nhân gây ra lỗi. Nếu bạn gặp lỗi,
trước tiên hãy kiểm tra các nguyên nhân sau:
1. Dấu cách trong một từ
2. Báo giá thiếu một cặp phù hợp
3. Thiếu dấu ngoặc đơn
4. Một lệnh VBA bị viết sai chính tả
5. Biến / Hàm phụ / có các ký tự không phải chữ và số trong
tên (Lưu ý: gạch dưới được cho phép)
6. Hai thủ tục có cùng tên
7. Hai biến trong một thủ tục có cùng tên
Nếu điều này không giải quyết được lỗi thì bạn cần xem Trình dịch lỗi bên
dưới. Lấy thông báo lỗi bạn nhận được và tìm nó ở bên trái bảng bên dưới.
Điều này sẽ cho bạn biết nguyên nhân rất có thể gây ra lỗi của bạn. Nó
cũng sẽ chỉ cho bạn cách khắc phục nó.
Lưu ý: PDF của danh sách lỗi sau đây được bao gồm trong ví dụ mã có thể
tải xuống mà bạn có thể truy cập tại đây
Dự kiến: Quên bao gồm Sub công cộng () Công khai Sub
Mã định danh Tên phụ/hàm ShowMsg()
Chọn phương pháp Bạn đã sử dụng lệnh Trang tính(1). Lựa Trang tính(1). Kích hoạt
của lớp Range Chọn trên một trang Trang tính(1). Lựa
không thành công tính nhưng trang tính
đó không hoạt động.
Sử dụng Kích hoạt
trước
Chỉ số dưới ra khỏi Trang tính với Trang tính("Bán hàng") Đảm bảo một tờ
Chỉ số dưới ngoài Sổ làm việc với tên Sổ làm việc("Pay.xlsm") Đảm bảo sổ làm việc có
phạm vi đã cho không mở. tên "Pay.xlsm" đang mở.
Ví dụ 2
Trong ví dụ này, chúng tôi viết "Hello World" vào ô A1 trên Sheet1. Một
lần nữa chỉ cần 1 dòng! Đừng lo lắng về cách nó hoạt động. Chúng ta sẽ đi
đến tất cả những điều đó. Dòng này chỉ đơn giản nói: Đặt "Xin chào Thế
giới" vào ô A1 của Trang tính đầu tiên trong sổ làm việc này
Sub công cộng WriteToCell1 ()
'Dòng này sẽ viết "Hello World" vào ô A1 Workbooks ("MyVBA.xlsm"). Trang tính(1). Phạm vi
("A1") = "Xin chào thế giới"
Kết thúc phụ
Để chạy quy trình này, sử dụng các bước tương tự như trên. Nếu bạn gặp lỗi,
hãy đảm bảo rằng "MyVBA.xlsm" khớp với tên sổ làm việc của bạn.
Ví dụ 3
Bây giờ chúng ta sẽ viết "Hello World" vào ô A2. Lưu ý rằng chúng tôi đã
sử dụng "Sheet1" thay vì 1. Đây là cách bạn chọn một trang tính theo tên.
Thay đổi Sheet1 thành Sheet2 và chạy lại. Bây giờ nó ghi vào sheet2. Nếu
không có trang tính nào được gọi là Sheet2, bạn sẽ gặp lỗi.
Sub công cộng WriteToCell2 ()
' Dòng này sẽ viết "Hello World" vào ô A2 Workbooks ("MyVBA.xlsm"). Trang tính("Trang
tính1"). Phạm vi ("A2") = "Xin chào thế giới"
Kết thúc phụ
Ví dụ 4
Trong ví dụ này, chúng tôi đặt phông chữ thành đậm.
Ví dụ 5
Chúng tôi có thể cập nhật nhiều ô cùng một lúc. Trong ví dụ này, chúng
tôi đặt 55 trong tất cả các ô trong phạm vi A1: A5
Sub công cộng WriteToCellMulti ()
' Dòng này ghi giá trị 55 vào một dải ô - Sổ làm việc A1 đến A5 ("MyVBA.xlsm"). Trang
tính("Trang tính1"). Phạm vi ("A1:A5") = 55
Kết thúc phụ
Ví dụ 6
Mục đích của ví dụ này là để cho bạn thấy lý do tại sao thứ tự mã lại quan
trọng. Kết quả cuối cùng ở đây sẽ là 55 trong ô A1.
Dòng đầu tiên ghi 66 vào ô A1. Do đó, khi Macro kết thúc dòng này, ô A1
chứa giá trị 66. Khi dòng thứ hai chạy, nó thay thế giá trị 66 bằng 55. Điều
này xảy ra trong mili giây vì vậy tất cả những gì bạn sẽ thấy là kết quả cuối
cùng.
Nếu chúng tôi hoán đổi các dòng này thì kết quả cuối cùng trong A1 sẽ là 66.
Sub công cộng WriteToCellMulti ()
' Cả hai dòng này ghi một giá trị vào cùng một ô để dòng đầu tiên là Workbooks dư thừa
("MyVBA.xlsm"). Trang tính("Trang tính1"). Phạm vi ("A1") = 66
Sách bài tập ("MyVBA.xlsm"). Trang tính("Trang tính1"). Phạm vi
("A1") = 55 Kết thúc phụ
Ví dụ 7
Trong ví dụ cuối cùng này, chúng tôi hiển thị giá trị trong ô A1 cho người
dùng. Hãy đảm bảo có một giá trị trong ô A1 trước khi bạn chạy nó.
Công khai Sub DisplayCellValue ()
' Hiển thị giá trị của ô A1 cho người dùng
MsgBox "Giá trị trong Ô A1 là: " +
CStr(ThisWorkbook.Worksheets("Sheet1"). Phạm vi
("A1")) Kết thúc Sub
Chơi xung quanh với những ví dụ này. Thay đổi các giá trị và xem điều gì
sẽ xảy ra. Nếu bạn gặp lỗi và mã dừng trên một dòng, hãy chọn Chạy->Đặt
lại từ
thực đơn. Sau đó cố gắng sửa lỗi và chạy lại. Nếu bạn cảm thấy thất vọng
khi cố gắng tìm lỗi, hãy xóa mã và bắt đầu lại.
Trong chương này, bạn đã thấy việc thực hiện các tác vụ Excel đơn giản
trong VBA dễ dàng như thế nào. Bạn có thể sửa đổi mã này và sử dụng
chúng trong các thủ tục của riêng bạn. Trong chương tiếp theo, bạn sẽ học
cách tự tạo những dòng này.
Bước 3: BA yếu tố ma thuật của VBA
"Trong ba từ, tôi có thể tóm tắt mọi thứ tôi đã học được về cuộc sống" -
Robert Frost
Sự kiện Excel đơn giản
1. Hầu hết mọi thứ bạn làm trong Excel đều liên quan đến một hoặc nhiều ô.
2. Mỗi ô thuộc về một trang tính.
3. Mỗi trang tính thuộc về một sổ làm việc.
Khi sử dụng Excel, bạn thường đi về công việc kinh doanh của mình mà
không thực sự suy nghĩ về những sự thật này quá nhiều. Hãy tưởng tượng
bạn muốn nhập các giá trị vào một ô trên một trang tính cụ thể. Bạn phải đi
đến sổ làm việc có chứa trang tính có chứa các ô. Bạn thường làm điều này
tự động.
VBA có một chút khác biệt. Bạn cần cho nó biết bạn muốn sử dụng Sổ làm
việc và Trang tính nào. Tôi đề cập đến ba mục trong hộp sau đây là các yếu
tố ma thuật:
1. Workbook
2. Worksheet
3. Range
Trong ví dụ này, bạn có thể thấy dấu thập phân trước Tên đầy đủ. Dấu thập
phân có nghĩa là "là thành viên của". Vì vậy, trong trường hợp này, nó có
nghĩa là Tên đầy đủ là một thành viên của sổ làm việc. Khi bạn gõ dấu thập
phân, trình soạn thảo sẽ hiển thị danh sách các thuộc tính của đối tượng
hiện tại.
Chúng ta có thể sử dụng mã sau để truy cập bất kỳ sổ làm việc nào đang mở.
Đảm bảo rằng sổ làm việc bạn chỉ định đã được mở nếu không bạn sẽ gặp
lỗi. Chúng ta sẽ xem thêm về cách mở sổ làm việc trong chương sau.
Có một cách dễ dàng hơn để truy cập sổ làm việc hiện tại. Bạn có thể sử
dụng từ khóa ThisWorkbook. Nó đề cập đến sổ làm việc hiện tại, tức là sổ
làm việc có chứa mã.
Tại sao điều này hữu ích? Bởi vì khi chúng ta sử dụng ThisWorkbook chúng
ta không cần phải lo lắng về tên của tệp do đó:
1. Thay đổi tên tệp sẽ không ảnh hưởng đến mã
2. Sao chép mã sang sổ làm việc khác sẽ không yêu cầu thay đổi mã
Đây có vẻ như là những lợi thế rất nhỏ. Thực tế là tên tệp của bạn sẽ thay
đổi mọi lúc. Và bạn sẽ thường sử dụng cùng một mã trong nhiều sổ làm
việc. Bạn không muốn mã của mình bị hỏng mỗi khi bạn thay đổi tên sổ
làm việc.
Nhìn vào ví dụ tiếp theo. Nếu tên tệp thay đổi thì dòng thứ hai sẽ không còn
hoạt động. Bạn sẽ phải thay đổi tên tệp trong mã.
Mặt khác, dòng đầu tiên sẽ tiếp tục hoạt động chính xác.
Trước khi chúng ta rời khỏi phần này, tôi muốn cho bạn biết một bí mật.
Người bạn tốt của chúng tôi ThisWorkbook có một cặp song sinh xấu xa
được gọi là ActiveWorkbook.
ActiveWorkbook tham chiếu đến sổ làm việc hiện đang hoạt động. Có vẻ
hoàn toàn vô tội phải không? Tuy nhiên, bất kỳ sổ làm việc nào cũng có thể
trở thành sổ làm việc đang hoạt động. Chỉ cần nhấp vào sổ làm việc bằng
chuột, bạn làm cho nó trở thành sổ làm việc đang hoạt động. Điều này làm
cho nó rất dễ dàng để đọc và viết bằng cách sử dụng sổ làm việc sai.
Sử dụng ActiveWorkbook cũng có thể làm cho mã rất khó đọc. Có thể không
rõ sổ làm việc nào nên là sổ làm việc đang hoạt động. Với ThisWorkbook
không có sự nhầm lẫn.
Các ví dụ sau đây cho thấy cách Ẩn/Bỏ ẩn và Bảo vệ/Bỏ bảo vệ Trang tính1.
Sub công cộng HideWorksheet ()
ThisWorkbook.Worksheets("Sheet1"). Hiển thị = sai
Kết thúc phụ
Nếu tên trang tính thay đổi thì bạn sẽ cần thay đổi tên trang tính trong mã.
Có nhiều cách để giải quyết vấn đề này, chẳng hạn như kiểm tra xem trang
tính có tồn tại hay thậm chí tốt hơn bằng cách sử dụng tên mã. Tuy nhiên,
đây là những chủ đề nâng cao hơn và không bắt buộc đối với các macro cơ
bản.
Bất cứ điều gì bạn có thể làm trong Excel với một bảng tính bạn có thể làm
trong VBA. Để tìm hiểu về các thuộc tính của một phần tử, hãy làm theo
các hướng dẫn trong hộp
' Ghi văn bản "Hello World" vào các ô từ A1 đến A5 bằng thuộc tính Cells
ThisWorkbook.Worksheets("sheet1"). Phạm vi ("A1:A5") = "Xin chào thế giới"
' Đặt đường viền thành dòng kép ThisWorkbook.Worksheets("sheet1"). Phạm vi ("B2").
Borders.LineStyle = xlDouble
' Ghi một số vào ô C1 và sau đó thay đổi định dạng ô thành tiền tệ ThisWorkbook.Worksheets
("sheet1"). Phạm vi ("C1") = "25.99" ThisWorkbook.Worksheets ("sheet1"). Phạm vi ("C1").
NumberFormat = "0,00 €"
Dấu bằng
Cho đến nay bạn sẽ nhận thấy việc chúng tôi sử dụng dấu bằng. Equals được
sử dụng để đặt một giá trị trong một ô hoặc biến. Ý nghĩa bằng ở đây là "gán
cho" chứ không phải là "bằng".
Đây chỉ là một cái nhìn ngắn gọn về phạm vi tài sản. Trong chương tiếp
theo, chúng ta sẽ có cái nhìn chuyên sâu về Ranges và cách sử dụng chúng.
Bước 4: Khi nào nên sử dụng ô và phạm vi
"Tất cả chúng ta đều là tế bào trong cùng một cơ thể của nhân loại" - Peace
Pilgrim
Cells và Ranges là những con ngựa thồ của VBA. Hãy để chúng tôi bắt
đầu chương này với một vài kỹ thuật sẽ giúp cuộc sống của bạn dễ dàng
hơn.
Sử dụng với
Cho đến nay, chúng tôi đã sử dụng một biến thể của
ThisWorkbook.Worksheets ("Sheet1") trong mỗi dòng mã. Phải làm điều
này cho mỗi dòng sẽ trở nên tẻ nhạt. Đây là lúc từ khóa With xuất hiện.
Chúng tôi sẽ viết lại đoạn mã trên bằng cách sử dụng nó.
' Viết văn bản "Xin chào Thế giới" vào các ô A1: A5
. Phạm vi ("A1:A5") = "Xin chào thế giới"
' Ghi số vào ô C1 và sau đó thay đổi định dạng thành tiền tệ
. Phạm vi ("C1") = "25,99"
. Phạm vi ("C1"). NumberFormat =
Bây giờ nó dễ dàng hơn nhiều cho bạn để viết và đọc. "Kết thúc bằng" đánh
dấu phần cuối của phần Với .
Lưu ý cách chúng ta thụt lề (di chuyển mã sang phải) giữa With và End
With. Điều này giúp bạn dễ dàng xem phần mã có hiệu ứng hơn.
Thụt lề là một thực hành tiêu chuẩn trên hầu hết các ngôn ngữ lập trình. Nó
được sử dụng khi bạn tách mã. Điều này thường xảy ra trong các câu lệnh
Loops và If mà bạn sẽ thấy sau.
Đọc từ một ô
Cho đến nay chúng tôi chủ yếu xem xét việc viết một giá trị cho một ô.
Bây giờ chúng ta sẽ xem xét việc đọc từ ô này sang ô khác.
Sub công khai ReadBetweenCells()
Kết thúc
Bạn có thể đọc và ghi giữa bất kỳ trang tính và sổ làm việc nào miễn là sổ
làm việc hiện đang mở.
Sub công khai ReadWriteCells()
Với ThisWorkbook.Worksheets("Sheet1")
' Viết giá trị từ A2 vào trang tính "Thanh toán" trong sổ làm việc Other.xlsm
. Phạm vi ("A1") = Sổ làm việc ("Other.xlsm"). Trang tính("Thanh toán"). Phạm vi ("A2")
' Viết giá trị từ A1 vào trang tính "Tài khoản" trong sổ làm việc Other.xlsm
. Phạm vi ("A1") = Sổ làm việc ("Other.xlsm"). Trang tính("Tài khoản"). Phạm vi
' Gán cho các đối tượng trang tính một trang tính
'Tất cả những gì chúng tôi đang thực sự làm là đặt cho
họ một cái tên đẹp hơn Set writeSheet =
ThisWorkbook.Worksheets ("Sheet3")
Đặt PaymentsSheet = ThisWorkbook.Worksheets("Thanh
toán") Đặt AccountsSheet = ThisWorkbook.Worksheets("Tài
khoản")
' Đặt giá trị A1 thành giá trị trong A1 trong trang tính "Tài khoản" của sổ làm việc có tên
Other.xlsm
. Phạm vi("A1") = AccountsSheet.Range("A1")
Kết thúc bằng
'Khi bạn tạo một đối tượng bằng Set, bạn nên Set đối tượng thành Nothing khi bạn hoàn thành
Đặt writeSheet = Không có gì
Đặt PaymentsSheet = Không
có gì Đặt AccountsSheet =
Không có gì
Sử dụng Dim và Set trong ví dụ trên chỉ đơn giản là đặt cho trang tính một
cái tên đẹp hơn. writeSheet và ThisWorkbook.Worksheets ("Sheet3") hoàn
toàn giống nhau. Đặt cho trang tính một cái tên đẹp hơn giúp bạn dễ dàng
xem trang tính làm gì. Tên writeSheet cho thấy rõ đây là trang tính chúng ta
đang viết đến. Bảng dưới đây cho thấy 3 phương pháp. Nó có thể không rõ
ràng ở đây nhưng nếu bạn có nhiều dòng mã, nó làm cho cuộc sống của
bạn dễ dàng hơn rất nhiều.
Phương pháp Trường hợp sử dụng Ví dụ
1 Họ và tên Khi bạn sử dụng ThisWorkbook.Worksheets("sheet3"). Phạm vi ("A1")
tương tự
tờ một vài lần
2 Với.. Kết thúc Khi bạn sử dụng cùng Với ThisWorkbook.Worksheets("sheet3").
bằng một trang tính nhiều . Phạm vi ("A1") =
lần Kết thúc bằng
Đừng lo lắng nếu những phương pháp này có vẻ khó hiểu lúc đầu. Sử dụng
phương pháp đầu tiên cho đến khi bạn cảm thấy thoải mái. Sau đó, bạn sẽ
thấy lợi ích của các phương pháp khác. Trong cả 3 phương thức, mã sẽ
hoạt động giống nhau.
Sử dụng thuộc tính Cells
Trang tính có một thuộc tính được gọi là Ô. Điều này được sử dụng theo
cách rất giống với Phạm vi. Có hai điểm khác biệt:
1. Thuộc tính Ô chỉ có thể sử dụng 1 ô tại một thời điểm.
2. Thuộc tính Ô lấy một Hàng và một Cột làm đối số thay vì một phạm
vi.
Ví dụ sau đây so sánh việc sử dụng Phạm vi và Ô
Cập nhật phụ công khaiCells1()
Với ThisWorkbook.Worksheets("sheet1")
' Cả hai dòng đều ghi văn bản "Tổng" vào ô A1
. range("A1") = "Tổng"
. Ô(1,1) = "Tổng"
Tôi biết bạn đang nghĩ gì. Tại sao tôi cần sử dụng cả hai khi chúng làm
cùng một việc?
Lấy dòng đầu tiên trong ví dụ. Mỗi lần, chúng tôi chạy Macro, "Tổng"
được đặt trong A1. Điều này là tốt trong một số trường hợp. Trong các
trường hợp khác, chúng tôi không biết trước nơi chúng tôi sẽ viết một giá
trị. Đây là lúc Cells() xuất hiện. Vì phải lấy số, chúng ta có thể dễ dàng
thao tác với chúng để chọn đúng ô.
Sử dụng thuộc tính Ô rất hữu ích nếu bạn đang truy cập vào một ô dựa trên
một số có thể thay đổi. Nó dễ dàng hơn giải thích điều này với một ví dụ.
Đoạn mã sau đây tìm cột đầu tiên có ô trống ở hàng 1:
Sub công khai WriteToFirstBlankCell()
' Viết văn bản vào ô trống đầu tiên trong Hàng 1
cnSheet1.Cells (1, lLastCol + 1) = "John Smith"
Trong ví dụ này, số cột cuối cùng có thể thay đổi tùy thuộc vào dữ liệu
trong trang tính. Nếu chúng ta sử dụng Phạm vi ở đây, chúng ta sẽ phải
chuyển đổi lLastCol từ một số thành một chữ cái cột. Ví dụ: cột 3 sẽ cần
được thay đổi thành C và cột 27 sẽ tiếp theo trở thành AA.
Tuy nhiên, sử dụng thuộc tính Cells cho phép chúng tôi cung cấp một hàng
và một số cột để truy cập vào một ô.
Use Range when the cell will be the same every time the Macro
runs.
Use Cells when the cell may vary
Với cnSheet1
'Sao chép / dán mọi thứ
. Phạm vi ("A1: B5"). Sao chép đích:= . Phạm vi ("A20")
Trong ví dụ, từ khóa xlPasteAll có nghĩa là dán mọi thứ. Bạn cũng có
thể sử dụng xlPasteValues, xlPasteFormats và xlPasteFormulas , v.v.
Đặt con trỏ trên xlPasteAll trong VBA Editor và nhấn F1 để xem toàn
bộ danh sách các tùy chọn.
Nếu bạn muốn biết thêm về Phạm vi và Ô thì hãy xem bài đăng này, Hướng
dẫn đầy đủ về Phạm vi và Ô trong Excel VBA
Bước 5: Tại sao sử dụng biến thay vì ô
"Hằng số của một người đàn ông là biến của người khác" - Alan Perlis
Một biến giống như một ô Excel. Nó có thể chứa văn bản, số hoặc ngày
tháng. Chúng tôi sử dụng chúng trong mã của chúng tôi để lưu trữ các giá
trị tạm thời. Sau đó, chúng ta có thể thực hiện các phép tính hoặc thao tác
trên chúng.
Bạn thực sự có thể sử dụng các tế bào để làm điều này. Bạn có thể ghi các
giá trị tạm thời vào một trang tính. Tuy nhiên, nó sẽ phát triển ra khỏi tầm
tay một cách nhanh chóng. Bạn sẽ cần theo dõi tất cả các ô bạn sử dụng và
những gì bạn đã viết ở đâu. Khi Macro của bạn phát triển, điều này sẽ trở
nên rất khó quản lý.
Khi bạn sử dụng các biến, VBA sẽ xử lý tất cả sự phức tạp này cho bạn. Tất
cả những gì phải làm là tạo một biến và sau đó sử dụng tên biến để đặt một
cái gì đó vào hoặc đọc một cái gì đó từ đó. VBA sẽ lo phần còn lại.
Có năm loại biến chính mà bạn sẽ sử dụng
Các loại biến phổ biến
Long là một số nguyên
Nhân đôi là một số thập phân
Chuỗi là văn bản
Ngày là Ngày
Boolean đúng hay sai
Như bạn có thể thấy, chúng rất giống với các loại Excel. Bạn có thể đặt
một biến bất kỳ tên nào bạn thích. Bạn nên sử dụng một tên có ý nghĩa vì
nó sẽ làm cho mã dễ đọc hơn.
Để sử dụng một biến, trước tiên chúng ta khai báo nó
' Khai báo năm loại biến Dim
AppleCount As Long
Dim TotalPrice As Double
Dim CustomerName As
String Dim ReportDate As
Date As Date
Dim IsValid As Boolean
Bây giờ bạn có một biến, bạn có thể đặt một cái gì đó trong đó.
Nếu bạn đặt một loại không chính xác trong một biến VBA sẽ làm, tốt nhất
là "Chuyển đổi và ép buộc" giá trị. Tuy nhiên, sau đây sẽ gây ra lỗi "Loại
không khớp" khi bạn chạy. Điều này là do văn bản không thể được chuyển
đổi thành số.
Ví dụ tiếp theo cho bạn thấy tất cả các cách sử dụng Biến
Public Sub UseVariables()
'5. Đọc từ Biến - đọc đến một ô trong trường hợp này là ThisWorkbook.Worksheets ("sheet1").
Phạm vi ("A1") = iRow
'6. Sử dụng làm đối số hàm - iRow cho Cells() biết hàng nào sẽ sử dụng
ThisWorkbook.Worksheets("sheet1"). Ô (iRow,2) = 55
Trong ví dụ 3, 4 và 5 về cơ bản đang làm điều tương tự. Họ đánh giá phía
bên phải của bình đẳng. Sau đó, họ đặt giá trị đó vào biến hoặc các ô ở phía
bên trái của bằng. Giá trị hiện có ở phía bên tay trái luôn được thay thế
bằng giá trị mới.
Ví dụ tiếp theo cho thấy cách một biến chuỗi được sử dụng
'3. Tên khách hàng sẽ là "John Smith" sau khi dòng này chạy
CustomerName = CustomerName + "Smith"
'4. Đọc từ Biến - đặt tên khách hàng vào ô A1 ThisWorkbook.Worksheets ("sheet1"). Phạm vi
("A1") = Tên khách hàng
' 6. Ba hàm String sau đây giúp bạn sử dụng string ' In 4 chữ
9. Kiểm tra xem điều này hoạt động ok. Nếu có, hãy thêm phần còn lại của
các ô
Cố gắng tự tạo Macro này từ đầu. Tiếp tục làm điều này cho đến khi bạn có
thể làm điều đó mà không cần nhìn. Hãy nhớ rằng nó không phải là về việc
ghi nhớ mã. Đó là về sự hiểu biết nó. Nếu bạn có thể tự tạo Macro này thì
bạn đã học được rất nhiều về VBA.
Bước 7: Tăng cường VBA với 2 Vòng lặp này
"Với sức mạnh lớn đi kèm với trách nhiệm lớn" - Voltaire
Hầu hết các ví dụ cho đến nay đều đơn giản. Bạn có thể thực hiện các tác
vụ tương tự trong Excel và bạn có thể tự hỏi tại sao thậm chí còn bận tâm
đến VBA. Trong chương này, bạn sẽ thấy VBA có thể mạnh mẽ như thế
nào.
Hãy tưởng tượng bạn nhận được dự án sau
1. Bạn phải cập nhật 20 ô đầu tiên trong cột A của một trang tính nhất định
2. Bạn phải cập nhật các ô đó mỗi ngày một lần.
Không có vấn đề gì lớn. Bạn sẽ chỉ mất vài phút để làm điều đó bằng tay.
Bạn có thể viết một Macro để làm điều đó nhưng nó sẽ không thực sự giúp
bạn tiết kiệm nhiều thời gian.
Tua nhanh hai tuần. Dự án là một thành công lớn. Công ty của bạn quyết
định mở rộng nó. Bây giờ họ muốn cập nhật 1000 ô đầu tiên và nó phải
được thực hiện 10 lần một ngày. Cũng trong tương lai họ sẽ thêm một tờ
thứ hai và thứ ba.
Nhiệm vụ đã phát triển rất lớn. Nó đã phát triển từ 20 tế bào ít ỏi lên 10.000
tế bào mỗi ngày. Sử dụng những gì bạn đã học được cho đến nay, bạn có
thể viết một Macro để làm điều đó.
Tuy nhiên, nó sẽ mất 1000 dòng mã. Đó là một giải pháp tốt hơn bởi vì một
khi nó được viết, bạn có thể chạy nó bao nhiêu lần tùy thích. Tuy nhiên,
chúng ta có thể đưa ra một giải pháp thậm chí còn tốt hơn bằng cách sử
dụng một vòng lặp.
Khi chúng ta sử dụng một vòng lặp, sau đây là trường hợp:
1. Mở rộng từ 20 ô lên 1000 chỉ yêu cầu một bản cập nhật đơn giản cho
mã.
2. VBA sẽ ghi vào 1000 ô gần như nhanh như ghi vào 20 ô.
Vòng lặp được sử dụng phổ biến nhất trong VBA là For Loop. Vòng lặp For
sẽ chăm sóc hầu hết tất cả các nhu cầu lặp lại của bạn.
Vòng lặp For
Đoạn mã sau ghi các giá trị từ 1 đến 5 vào các ô A1:A5.
Public Sub SetValues()
Sử dụng một vòng lặp, chúng ta có thể làm điều đó như thế này:
Công khai Sub SetValuesLoop()
Giả sử chúng ta muốn tăng các ví dụ này từ 5 lên 100 hàng. Trong ví dụ đầu
tiên, chúng ta sẽ cần thêm 95 dòng mới! Trong ví dụ thứ hai, chúng tôi thay
đổi 5 thành 100. Trong ví dụ tiếp theo, chúng tôi đã thực hiện thay đổi đó.
Không cần thêm dòng mã. Bây giờ bạn đang thấy các vòng lặp có thể mạnh
mẽ như thế nào.
Công khai Sub SetValuesLoop100()
' Viết từ 1 đến 100 vào các ô từ A1 đến
A100 Dim iRow As Long
Đối với iRow = 1 đến 100 ThisWorkbook.Worksheets ("Sheet1"). Ô
(iRow, 1) = iRow
Tiếp theo
Sub
Hãy xem làm thế nào bạn có thể xây dựng một vòng lặp. Tất cả những gì bạn
cần là:
' 10 đến 50
Đối với iRow = 10 đến 50
Bạn có thể muốn đếm bằng một số khác với 1. Sử dụng có thể sử dụng từ
khóa Bước cho việc này. Lưu ý nếu bạn không sử dụng Step thì nó sẽ tự
động được tính bằng một.
' 2 đến 100 chỉ với các số chẵn, ví dụ: 2,4,6 .. 100
Đối với iRow = 2 đến 100 Bước 2
Bạn cũng có thể đếm ngược bằng cách sử dụng số bước trừ
Có một Vòng lặp khác được gọi là Vòng lặp cho mỗi vòng. Bạn có
thể sử dụng điều này với các bộ sưu tập. Chủ yếu là bạn không cần
nó. Nó sẽ được thảo luận nhiều hơn trong phần về Bộ sưu tập.
Vòng lặp Do While
Trong ví dụ dưới đây, bạn có thể thấy vòng lặp Do While so với vòng lặp
For Next.
Public sub useDoWhile()
phụ
Để tạo vòng lặp Do While tất cả những gì bạn cần là một điều kiện. Câu
lệnh i <= 5 là điều kiện. Vòng lặp chạy trong khi điều kiện đánh giá là
đúng. Dưới đây là một mô tả về các điều kiện.
Điều kiện
Đây là một tuyên bố đánh giá đúng hoặc sai. Chúng chủ yếu được sử dụng
với các câu lệnh Loops và If.
Sau đây là ví dụ về các điều kiện
Điều kiện Điều này đúng khi
x<5 x nhỏ hơn 5
x <= 5 x nhỏ hơn hoặc bằng 5
x>5 x lớn hơn 5
x >= 5 x lớn hơn hoặc bằng 5
x=5 x bằng 5
x <> 5 x is không bằng 5
x > 5 Và x x lớn hơn 5 VÀ x nhỏ hơn
<10 hơn 10
x = 2 Hoặc x x bằng 2 HOẶC x lớn hơn
>10 10
. Phạm vi = Ô A1 chứa văn bản "John"
"Giăng"
. Phạm vi <> Ô A1 không chứa văn bản
"Giăng" "Giăng"
Bạn có thể nhận thấy x = 5 là một điều kiện. Điều này không nên nhầm lẫn
với x = 5 mà chúng ta đã thấy trước đó. Bảng sau đây cho thấy cách sử
dụng bằng nhau trong các điều kiện và bài tập
Sử dụng = Tuyên bố Ý nghĩa
Kiểu
Do Trong khi x = Điều kiện X có bằng 5 không?
5
Nếu x = 5 thì Điều kiện X có bằng 5 không?
x =5 Gán Đặt giá trị của x thành 5
Với x = 1 đến 5 Gán Đặt x thành giá trị 1, sau đó thành giá
trị 2
v.v.
Quay lại "Do While"
Với For Loop, chúng tôi cho nó biết nơi bắt đầu và kết thúc. Do While chỉ
kết thúc khi điều kiện được đáp ứng.
Ví dụ sau đây cho thấy cách chúng ta có thể đặt điều kiện ở cuối vòng lặp.
Sub công khai DoWhileEnd()
' Tương tự như trên ngoại trừ điều kiện đánh giá ở cuối
iRow = 1
Làm
ThisWorkbook.Worksheets("Sheet1"). Ô (iRow, 1) = iRow
iRow = iRow + 1
Lặp lại trong khi ThisWorkbook.Worksheets("Sheet1"). Ô (iRow, 1) <>
Hai vòng lặp trong ví dụ giống nhau ngoại trừ vị trí của Điều kiện While.
Sự khác biệt giữa chúng là tinh tế. Cái thứ hai sẽ chạy ít nhất một lần.
Lưu ý rằng bạn phải duy trì số lượng của riêng mình ở đây bằng cách thêm
1 vào iRow mỗi lần. Hãy chắc chắn rằng tình trạng của bạn cuối cùng sẽ
biến thành sai hoặc bạn sẽ kết thúc với Vòng lặp vô hạn (Nếu điều này xảy
ra thì hãy sử dụng Ctrl Break để thoát).
Cũng lưu ý rằng các vòng lặp này hoàn toàn giống với ví dụ For Loop với
Exit For. Thực tế là bạn có thể sử dụng For Loop cho hầu hết mọi thứ bạn
làm trong VBA. Điều này là do hầu hết những gì bạn làm trong VBA yêu
cầu đọc qua các ô và For Loops phù hợp nhất cho việc này. Các vòng lặp
khác rất hữu ích để biết vì bạn sẽ thấy chúng trong mã kế thừa.
Trong các ngôn ngữ khác Trong khi vòng lặp rất hữu ích. Trong VBA, bạn
có xu hướng sử dụng các vòng lặp với các ô hoặc trang tính, đó là lý do tại
sao Vòng lặp For chiếm ưu thế.
Các vòng lặp khác
Các vòng lặp gây nhầm lẫn trong VBA vì có những biến thể thực hiện chính
xác điều tương tự.
Tất cả các vòng lặp khác là các biến thể của Do While.
Bảng dưới đây cho thấy tất cả các vòng lặp trong VBA. Điểm tham quan:
1. Các vòng 3, 5 và 7 giống nhau ngoại trừ trong 5 bạn sử dụng điều kiện
ngược lại. Điều này có nghĩa là thay vì nói "chạy trong khi nhỏ hơn 10",
bạn nói "chạy cho đến khi lớn hơn hoặc bằng 10".
2. Các vòng 4 và 6 giống nhau ngoại trừ điều kiện ngược.
Vòng lặp Trường hợp sử dụng Ví dụ
Khi bạn biết bạn muốn nó Với i = 1 đến 10
1 Cho... Sau bao nhiêu lần Tiếp theo i
để chạy
Đối với mỗi loại
Sử dụng với bộ sưu tập. trái cây trong
2 Đối với mỗi ... Sau
Có thể sử dụng For ... colFruits
Tiếp theo thay vào đó Loại trái cây tiếp
theo
Làm trong khi ... Chạy 0 lần trở lên Làm trong khi tôi
3
Vòng lặp cho đến khi một điều kiện < 10
được đáp ứng Vòng lặp
Làm
Làm... Vòng lặp Chạy 1 hoặc nhiều lần
4 Vòng lặp trong
trong khi cho đến khi đáp ứng một
khi tôi < 10
điều kiện
Chạy 0 lần trở lên Làm cho đến khi i
5 Làm cho đến khi..
cho đến khi một điều kiện > = 10
Vòng lặp
được đáp ứng Vòng lặp
Làm
Chạy 1 hoặc nhiều lần
6 Làm... Lặp lại cho Lặp lại cho đến
cho đến khi đáp ứng một
đến khi khi i > = 10
điều kiện
Chạy 0 lần trở lên Trong khi tôi < 10
7 Trong khi... Đi
cho đến khi một điều kiện Đi
được đáp ứng
Conclusion: The For Loop will cover most of your Looping needs
Nếu bạn muốn tìm hiểu thêm về Vòng lặp trong VBA, vui lòng xem
Hướng dẫn cơ bản về vòng lặp trong Excel VBA.
Bước 8: Đưa ra lựa chọn - Sử dụng nếu và chọn
"Hai con đường phân kỳ trong một khu rừng màu vàng, Và xin lỗi tôi không
thể đi cả hai" - Robert Frost
Bạn đã thấy câu lệnh If trong một số ví dụ cho đến nay. Nó rất giống với
việc sử dụng hàm If trong Excel
Đây là ví dụ về công thức IF trong Excel
=If(A2=10,"Target Reached")
Đây là mã trong VBA.
Nếu . Phạm vi ("A2") = 10 thì
. Phạm vi ("A1") = "Đạt mục tiêu"
Kết thúc nếu
Trường hợp 1 ' Khi Đếm bằng 1, hãy làm dòng sau: Phạm vi ("A1").
Font.Color = rgbRed
Trường hợp 2 đến 4 ' Khi Đếm bằng 2,3 hoặc 4, hãy làm dòng sau:
. Phạm vi ("A1"). Phông chữ.Màu = rgbBlue
Trường hợp khác ' Khi điều kiện Count chưa được đáp ứng, hãy làm dòng sau:
. Phạm vi ("A1"). Phông chữ.Màu = rgbBlack
Kết thúc Chọn
Bước 9 nút: Tạo một bảng điều khiển đơn giản
"Bạn nhấn nút, chúng tôi làm phần còn lại." - George Eastman
Khi bạn giải phóng một Macro rực rỡ trên thế giới, bạn muốn nó dễ dàng
cho người dùng chạy. Bạn không thể mong đợi người dùng mở cửa sổ mã
và chạy nó. Đây là lúc các nút xuất hiện. Với một cú nhấp chuột, người
dùng có thể dễ dàng chạy Macro của bạn. Tin tốt là các nút rất đơn giản và
chỉ mất vài giây để tạo.
1. Chọn trang tính mà bạn muốn đặt nút
2. Đi tới Ribbon Nhà phát triển
3. Chọn Điều khiển->Chèn - >Biểu tượng nút (Đây là mục đầu tiên ở
trên cùng bên trái)
4. Con trỏ sẽ chuyển sang +. Vẽ nút ở nơi bạn muốn trên trang tính
5. Hộp thoại Macro sẽ xuất hiện. Chọn Macro bạn muốn nút chạy
(Lưu ý: Bạn cần macro của mình là Công khai để xuất hiện trong
danh sách này) và bấm ok.
Thực hiện! Nhấp vào nút bây giờ sẽ chạy macro của bạn
Để thay đổi macro
Nhấp chuột phải và chọn "Chỉ định Macro". Sau đó chọn Sub bạn muốn
gán cho cái nút.
Để Thay đổi văn bản nút thành nội dung hữu ích
Nhấp chuột phải vào nút và chọn "Chỉnh sửa văn bản". Thay đổi văn bản
thành những gì bạn muốn.
Để di chuyển Nút
Nhấp chuột phải vào nút và kéo
Để xóa Nút
Nhấp chuột phải và cắt
Bảng điều khiển
Nếu bạn có nhiều macro, bạn có thể kết thúc với các nút trên tất cả các sổ
làm việc của bạn. Điều này có thể trở nên lộn xộn. Điều tốt nhất để làm là
đặt tất cả các nút của bạn trên một tờ. Khi bạn làm điều này, bạn có thể
viết mô tả trong các ô bên cạnh chúng. Điều này giúp người dùng dễ dàng
xem chức năng của từng nút. Bạn cũng có thể sử dụng trang tính này để
lưu trữ các giá trị như sổ làm việc để mở, v.v. Bạn có thể định dạng trang
tính này để làm cho nó thân thiện với người dùng để bất kỳ ai cũng có thể
sử dụng nó.
Trong thế giới thực, bạn thường sẽ cần phải có nút trên một trang tính cụ
thể. Tuy nhiên, nếu bạn có thể, hãy đặt chúng trên bảng điều khiển. Nó sẽ
làm cho cuộc sống của bạn dễ dàng hơn, đặc biệt là nếu bạn phải thay đổi
trong tương lai.
Bước 10 Thủ tục 2.0 Sức mạnh của các chức năng
"Hình thức theo chức năng" - Louis Sullivan
Tất cả các mã bạn viết đi trong một thủ tục. Cho đến nay chúng tôi đã sử
dụng Sub. Trong phần này, chúng ta sẽ xem xét việc sử dụng một Sub từ
một Sub khác. Sau đó, chúng ta sẽ xem xét các Chức năng rất giống với
Subs.
Gọi cho người đăng ký khác
Bạn 'Gọi' một sub từ một sub khác để bạn không phải viết đi viết lại cùng
một mã. Hãy xem ví dụ sau. Chúng tôi sử dụng mười dòng mã giống nhau
khi chúng tôi ghi một giá trị vào một ô. Điều này rất kém hiệu quả. Nếu
chúng ta viết vào mười ô thì chúng ta sẽ phải lặp lại mã mười lần.
Công khai Sub DoStuff()
WriteSheet.Range ("B1") = 11
' Cập nhật ô dựa trên giá trị A1 - 5 dòng giống như trên
Nếu (AppleCount < 10) Sau đó
WriteSheet.Range ("B1") = "Số tiền thấp"
ElseIf (AppleCount < 20 và AppleCount > 10) thì WriteSheet.Range
("B1") = "Số lượng trung bình"
Kết thúc
phụ
Cách chúng tôi giải quyết vấn đề này là đặt mã vào một sub khác và sau đó
'Gọi' Sub này. Chúng tôi gọi nó bằng cách sử dụng tên trên một dòng như
trong ví dụ sau.
Công khai Sub CallOtherSub()
Với ThisWorkbook.Worksheets("Sheet1")
. Phạm vi ("A1") = 5
' Chạy WriteText Sub
WriteText
. Phạm vi ("A1") = 11
' Chạy WriteText Sub
WriteText
Kết thúc
Với ThisWorkbook.Worksheets("Sheet1")
Nếu . Phạm vi ("A1") < 10 Sau đó
. Phạm vi ("B1") = "Số tiền thấp"
ElseIf .Phạm vi ("A1") < 20 và . Phạm vi ("A1") > 10 Sau đó
. Phạm vi ("B1") = "Số tiền trung
bình" Kết thúc nếu
Kết thúc
với End Sub
Trong ví dụ trên, chúng tôi đã lấy các dòng lặp lại và đặt chúng vào phụ của
riêng chúng. Khi chúng ta cần sử dụng chúng, chúng ta chỉ cần viết tên của
Sub. Bất kì
Sub có thể gọi bất kỳ Sub nào khác. Chỉ cần đảm bảo rằng chúng không gọi
cho nhau (Nếu điều này xảy ra, hãy nhấn Ctrl + Break) để dừng thực thi.
Đưa ra giá trị cho Subs
Khi bạn sử dụng các hàm trong trang tính Excel, bạn thường cung cấp một
số đối số. Hầu hết lấy một dải ô làm đối số - ví dụ: Tổng, Đếm và Trung
bình.
=Tổng("A1:A3")
Phạm vi "A1: A3" là đối số ở đây.
Bạn cũng có thể đưa ra các đối số cho một Sub. Như bạn có thể thấy, trong
ví dụ tiếp theo, việc tạo một đối số giống như tạo các biến. Để truyền đối số
cho sub, bạn đặt nó sau tên Sub. Giống như hàm trong Excel, nhiều đối số
được phân tách bằng dấu phẩy.
Định dạng phụ công cộng ()
Với ThisWorkbook.Worksheets("Sheet1")
' Gọi Sub SetCellFormat với các phạm vi khác nhau
SetCellFormat . Phạm vi ("A1")
SetCellFormat . Phạm vi ("A5:
A9") kết thúc bằng
Kết thúc phụ
Trong ví dụ này, chúng tôi đặt định dạng của một phạm vi. Lấy
Range làm đối số làm cho Sub linh hoạt. Nó có thể dễ dàng sử dụng
cho bất kỳ phạm vi nào.
Chức năng
Một hàm gần giống như một Sub. Trong ví dụ tiếp theo, chúng tôi Thay đổi
SetCellFormat cho một hàm và mã sẽ chạy chính xác như trước.
Sự khác biệt là một Hàm có thể trả về một giá trị. Các chức năng thường
được sử dụng để thực hiện một hoạt động và trả lại kết quả. Các hàm chuỗi
tích hợp mà chúng ta đã thấy trước đó cho thấy điều này.
CustomerName = "John Smith"
' Đặt "John" vào ô A1
. Phạm vi ("A1") = Trái (Tên khách hàng, 4)
Trong mỗi ví dụ chuỗi, chúng ta đang nhận lại một kết quả khi đưa ra một
chuỗi làm đối số. Điều quan trọng cần lưu ý ở đây là giá trị của
CustomerName không thay đổi. Thay vào đó, chúng ta đang nhận lại một
giá trị mới từ hàm.
Bạn có thể nhận thấy các hàm VBA tương tự như các hàm Excel. Nếu
bạn tạo một hàm, nó sẽ xuất hiện trong danh sách hàm trang tính trong Sổ
làm việc Excel hiện tại.
Differences between a Sub and a Function is
Chức năng công cộng GetCost (táo dài, lê dài, giá dài) càng lâu GetCost = (táo + lê)
* Giá
Chức năng kết thúc
Đó là thực hành tốt để nói loại bạn đang trả lại. Bạn thực hiện việc này
bằng cách thêm As và loại sau dấu ngoặc đơn đóng. Trong ví dụ trên, chúng
ta trả về một Long.
Để trả về một giá trị, bạn gán tên hàm cho giá trị, ví dụ:
GetCost = (Táo + Lê) * Giá
Nếu bạn chuyển lại một đối tượng như phạm vi, bạn cần sử dụng Đặt.
Đặt GetRange = . Phạm vi ("A1: A5")
Những điều sau đây có thể gây ra sự thất vọng nếu bạn không biết, vì vậy
hãy lưu ý. Nếu bạn gọi một hàm thì bạn phải sử dụng dấu ngoặc đơn xung
quanh các đối số. Nếu bạn gặp lỗi khi gọi một hàm hoặc phụ thì hãy kiểm tra
xem các quy tắc này có được tuân theo không.
Ví dụ tiếp theo cho thấy cách thực hiện hai loại cuộc gọi.
Hàm công cộng WriteTheCost()
' Sub: Không bao giờ trả về một giá trị. Không
có dấu ngoặc đơn WriteCost 54,65,10
Chức năng công cộng GetCost2 (Táo dài, lê dài, giá dài) Miễn là GetCost2 = (Táo
+ Lê) * Giá
Đối với ví dụ tiếp theo, hãy sao chép dữ liệu sau vào các ô từ A1 đến B4.
Mã sẽ sử dụng hàm tra cứu để đặt giá trị 7 vào ô A6.
Táo 10
Cây lê 7
Mận 32
Đào 49
Bạn đã thấy hai ví dụ về việc sử dụng Hàm tích hợp sẵn trong Excel trong
VBA. Bạn có thể sử dụng bất kỳ hàm trang tính nào theo cùng một cách.
Một lời khuyên tốt là trước tiên hãy tạo hàm như một hàm trang tính. Sau
đó, sẽ dễ dàng hơn để viết nó trong VBA. Điều này đặc biệt đúng nếu bạn
có một Macro lớn.
Nếu bạn muốn tìm hiểu thêm về Subs và Functions thì hãy xem The
Complete Guide to Functions and Subs in Excel VBA.
Bước 11: Mở sổ làm việc - Hãy để tôi làm điều đó
cho bạn
"Bạn không thể mở một cuốn sách mà không học được điều gì đó" - Khổng
Tử
Cho đến nay chúng tôi chỉ thực hiện các hành động trên sổ làm việc hiện tại.
Bạn sẽ thường cần phải sử dụng các sổ làm việc khác. Bạn có thể mở một sổ
làm việc để đọc, viết hoặc cả hai. Khi bạn mở một sổ làm việc, có hai điều
cần ghi nhớ:
1. Sổ làm việc có tồn tại không?
2. Nó đã mở chưa?
Những trường hợp này phải được xử lý. Sổ làm việc có thể không tồn tại.
Người khác có thể đang sử dụng nó. Nếu những tình huống này xảy ra,
bạn cần thông báo cho người dùng và dừng macro của bạn.
Để viết mã để làm điều này là một chút khó khăn. Tin tốt là bạn không bao
giờ cần phải viết nó! Hai chức năng dưới đây OpenWorkbook và
IsWorkbookOpen làm điều đó cho bạn. Sao chép các hàm này vào một mô-
đun trong mã của bạn và bạn có thể sử dụng chúng từ bất cứ đâu.
Lưu ý rằng các đoạn mã này sẽ không mở sổ làm việc nếu nó đã được mở.
Một thông báo sẽ thông báo cho người dùng rằng nó đã được mở. Trong hầu
hết các trường hợp, tốt nhất là đảm bảo rằng không ai mở sổ làm việc khi
bạn đang dùng nó trong Macro.
Phần mã tiếp theo sẽ chỉ cho bạn cách sử dụng hai hàm này. Chú ý đối số
ReadOnly trong ví dụ. Đặt điều này thành true nếu bạn chỉ muốn đọc từ sổ
làm việc. Điều này sẽ ngăn bạn viết nhầm cho nó. Nếu bạn muốn thực hiện
thay đổi đối với sổ làm việc, hãy đặt Chỉ đọc thành False.
' Mã mẫu để mở sổ làm việc Public
Sub UseWorkbook()
'Openbook với ReadOnly được đặt theo yêu cầu của bạn
Làm mờ myBook dưới dạng sổ làm việc
Đặt myBook = OpenWorkbook("C:\MyDocs\MyBook.xlsm", ReadOnly:=True)
'Dọn dẹp
Đặt myBook = Không có
gì kết thúc phụ
Sao chép hai chức năng này vào một mô-đun và bạn có thể sử dụng
chúng ở bất cứ đâu
Chức năng công cộng OpenWorkbook ( ByVal sFilename As String, ByVal ReadOnly As Boolean)
dưới dạng sổ làm việc
Về lỗi GoTo Eh
Xong:
Chức năng thoát
Eh:
MsgBox "Thông báo lỗi là " + Err.Description
Chức năng kết thúc
Chức năng IsWorkBookOpen (Tên tệp dưới dạng chuỗi)
' Xác định trạng thái mở của sổ làm việc sau đó dựa trên lỗi
Nếu errNum = 0 Sau đó
IsWorkBookOpen = False
ElseIf errNum = 70 thì
IsWorkBookOpen = Đúng
Khác
Err.Raise errNum
Kết thúc
chức năng
Bước 12: Cách dễ dàng sửa bất kỳ lỗi nào
"Kinh nghiệm chỉ đơn giản là cái tên chúng ta đặt cho những sai lầm của
mình." - Oscar Wilde
Nếu bạn viết mã VBA thì bạn sẽ gặp lỗi. Đừng để điều này làm bạn sợ.
Bạn có thể dễ dàng khắc phục hầu hết chúng bằng cách áp dụng một số
chiến lược đơn giản. Những cái khó nhất để sửa chữa có thể là những cái
thời gian chạy. Nhưng đây cũng là những điều thú vị nhất để làm việc.
Có các loại lỗi:
1. Người thông dịch
2. Trình biên dịch
3. Runtime
Lỗi phiên dịch viên
Đây là lỗi bạn gặp phải khi nhập sai dòng và nhấn return. Bước 1 chứa
danh sách các lỗi này và cách bạn có thể giải quyết chúng. Về cơ bản, đây
là những lỗi cú pháp.
Lỗi trình biên dịch
Phiên dịch viên xem xét từng dòng riêng lẻ. Trình biên dịch kiểm tra tất cả
các dòng trong ứng dụng của bạn và đảm bảo chơi tốt với nhau. Thông
dịch viên kiểm tra xem cú pháp của bạn có đúng không. Trình biên dịch
kiểm tra xem tất cả khớp với nhau như thế nào.
Lưu ý: Danh sách trong Bước 1 cũng chứa một số lỗi trình biên dịch.
Để chạy trình biên dịch, chọn Debug->Compile từ menu. Nó sẽ hiển thị lỗi
đầu tiên mà nó gặp phải. Khi lỗi này được khắc phục, bạn chạy lại. Nó sẽ
hiển thị lỗi tiếp theo. Điều này sẽ tiếp tục cho đến khi bạn không có lỗi. Sau
đó, mã của bạn đã sẵn sàng để chạy.
Trình biên dịch tìm thấy các lỗi như:
1. Sử dụng hàm Sub/với các tham số sai
2. Sử dụng một hàm không tồn tại
3. Sử dụng thành viên không tồn tại
Khi bạn gặp một trong những lỗi này, hãy làm như sau. Đọc thông báo lỗi
trước và xem bạn có thể hiểu nó không. Chúng thường dễ hiểu. Rất nhiều
lần những lỗi này là rõ ràng một khi bạn nhận ra những gì thông báo lỗi
đang nói với bạn.
Tùy chọn rõ ràng
Mỗi mô-đun bạn tạo phải có dòng chữ "Tùy chọn rõ ràng" ở trên cùng. Điều
này có nghĩa là nó sẽ kiểm tra xem các biến của bạn đã được khai báo chưa.
Việc này tốt. Nó ngăn chặn rất nhiều vấn đề khó phát hiện. Bạn có thể đặt
tùy chọn này tự động:
1. Chọn Tool->Options từ Menu
2. Chọn "Yêu cầu khai báo biến"
3. Nhấp vào Ok
Mỗi mô-đun mới bạn tạo bây giờ sẽ có "Tùy chọn rõ ràng" ở trên cùng.
Lỗi thời gian chạy
Chúng thường được gọi là Bugs.
Webster định nghĩa lỗi phần mềm là:
Một khiếm khuyết, lỗi, sai sót hoặc không hoàn hảo bất ngờ.
Sửa lỗi có thể là một trong những phần bổ ích nhất của VBA. Hãy nghĩ về
nó giống như giải quyết một bí ẩn. Bạn thu thập tất cả thông tin và cố gắng
tìm ra dòng mã nào là thủ phạm.
Sửa lỗi mang lại cảm giác hài lòng tương tự như giải câu đố. Nếu bạn thích
giải các câu đố thì sửa lỗi có thể là cuộc gọi của bạn. Có thể sửa lỗi cũng là
một kỹ năng tuyệt vời cần có. Nếu bạn học những kỹ năng này, bạn có thể
sử dụng chúng trên bất kỳ ứng dụng VBA nào trong bất kỳ tổ chức nào.
Mọi người thích khi bạn sửa lỗi cho họ và thường họ sẽ nghĩ bạn là một loại
thiên tài.
' Viết từng mục vào Cửa sổ ngay lập tức (Ctrl G)
Dim i As Long
Với i = 1 Đến col. Đếm
Debug.Print col (i)
Tiếp theo
Trong ví dụ này, chúng ta đã tạo đối tượng Collection. Lưu ý rằng bạn cần
sử dụng từ khóa mới khi tạo bộ sưu tập. Trong ví dụ này, thêm từng mục
theo từng dòng. Trong một Macro điển hình, các giá trị này sẽ được đọc từ
một trang tính.
Sau đó, chúng tôi đã thêm 3 chuỗi bằng chức năng Thêm. Bạn có thể chỉ
định nơi đặt mục vào bộ sưu tập bằng cách sử dụng trước và sau
' Thêm chuối làm mục đầu tiên trong bộ sưu
tập Col.Thêm "Chuối", Trước:=1
'Viết bây giờ có thể viết bộ sưu tập này vào tệp, tờ, v.v.
' Trong trường hợp này, chúng tôi sẽ viết nó vào cửa sổ
ngay lập tức Dim i As Long
Đối với i = 1 Để collCountries.Count
Debug.Print collCountries (i)
Tiếp theo
Ở đây, Trang tính là một tập hợp các trang tính trong ThisWorkbook, tức là sổ
làm việc hiện tại. Điều duy nhất chúng tôi làm với bộ sưu tập này là để có
được một món đồ. Đoạn mã sau đây chỉ cho bạn cách đọc qua bộ sưu tập
này và in tên của tất cả các trang tính trong sổ làm việc hiện tại.
Tên trang tính con công cộng()
' Viết từng tên trang tính vào Cửa sổ ngay lập tức (Ctrl
G) Dim i As Long
Đối với i = 1 Để ThisWorkbook.Worksheets.Count
Debug.Print ThisWorkbook.Worksheets (i). Tên
Tiếp
Sub
Tương tự, mã sau đây hiển thị tên của tất cả các sổ làm việc đang mở.
Sub công cộng OpenWorkbooks()
' Viết từng tên sổ làm việc đang mở vào Cửa sổ ngay lập tức (Ctrl G)
Dim i As Long
Đối với i = 1 đến Workbooks.Count
Debug.Print Workbooks (i). Tên
Tiếp
Sub
Hãy cẩn thận nếu bạn có kế hoạch sử dụng mã trên. Khi bạn đang làm một
cái gì đó cho nhiều trang tính, bất kỳ lỗi nào cũng sẽ xảy ra nhiều lần. Tạo
bản sao lưu của
Sổ làm việc và kiểm tra của bạn trước khi bạn dùng trong sổ làm việc có dữ
liệu thực. Một ý tưởng hay khác là bắt đầu với một trang tính. Khi bạn đã
kiểm tra nó, sau đó thêm một trang tính khác. Nếu điều đó kiểm tra ok thì
bạn sẽ có thể thêm phần còn lại mà không gặp vấn đề gì.
Đối với mỗi vòng lặp
Bạn có thể bắt gặp vòng lặp này vì nó thường được sử dụng với các bộ sưu
tập. For Next Loop luôn hoạt động tốt đối với tôi. For Every được cho là
hiệu quả hơn nhưng điều đó chỉ phù hợp nếu bạn đang cập nhật nhiều ô hoặc
sử dụng mạng rất chậm. Nếu bạn đang kiểm tra cả hai phương pháp và sử
dụng phương pháp nhanh nhất.
Sẽ rất hữu ích khi biết vòng lặp For Every vì nó thường xuất hiện trong các
mẫu mã. Ví dụ sau đây cho bạn thấy hai vòng lặp cạnh nhau.
Bảng tính con công cộngNamesForeach()
' Viết từng tên trang tính vào Cửa sổ ngay lập tức (Ctrl
Ví dụ tiếp theo ghi tên trang tính của mỗi trang tính vào ô A1
Public Sub UseSheet()
HOẶC
Nếu bạn muốn tìm hiểu thêm về bộ sưu tập thì hãy xem Hướng dẫn cơ bản
về bộ sưu tập trong Excel VBA.
Mảng
Bộ sưu tập và Mảng đều được sử dụng để lưu trữ các nhóm mục. Bạn
thường sử dụng Bộ sưu tập khi bạn không chắc chắn mình sẽ sử dụng bao
nhiêu mục. Nói cách khác, chúng có xu hướng phát triển và co lại rất nhiều.
Mảng thường được sử dụng khi bạn biết trước có bao nhiêu mặt hàng bạn
sẽ có. Ví dụ: nếu bạn định bán hàng tại cửa hàng cho tuần hiện tại thì bạn
sẽ khá an toàn với một loạt bảy mặt hàng.
Các mảng thường sẽ giữ nguyên kích thước mặc dù bạn có thể thay đổi
chúng. Điều này thường chỉ được yêu cầu trong các trường hợp nâng cao.
Trong ví dụ dưới đây, chúng tôi viết ra điểm học sinh vào một tờ. Sử dụng
phương pháp này, chúng tôi yêu cầu ba dòng mã cho mỗi ngày. Nếu chúng
tôi có 100 sinh viên, mã của chúng tôi sẽ nhanh chóng vượt khỏi tầm tay.
Public Sub WithoutArray()
' Ghi doanh số bán hàng cho mỗi ngày vào các
ô từ A1 đến C1 với ThisWorkbook.Worksheets
("Sheet1")
. Ô (1,1) = Student1
. Ô (2,1) = Student2
. ô (3,1) = student3 kết
thúc bằng
' Ghi giá trị ngày vào các ô từ A1 đến C1 trong một dòng ThisWorkbook.Worksheets("Sheet2").
Phạm vi ("A1: C1"). Giá trị = StudentMarks
Trong ví dụ này, chúng tôi viết ra các giá trị một dòng. Đây là lý do tại sao
mảng rất hữu ích. Họ có thể viết một số lượng lớn các giá trị rất nhanh. Bạn
có thể nhận thấy chúng tôi đã sử dụng Giá trị tài sản ở đây. Điều này là
cần thiết khi sử dụng mảng. Cho đến nay, chúng tôi đã truy cập các giá trị
của các ô mà không cần nó.
Nếu số lượng sinh viên của chúng tôi tăng lên 100, chúng tôi có thể thay
đổi 4 thành 100 trong tờ khai. Bây giờ chúng tôi có 100 vị trí để lưu trữ
điểm của học sinh.
Lưu ý trong ví dụ này, chúng ta vẫn cần 100 dòng để ghi các giá trị vào
mảng. Tuy nhiên, điều này được sử dụng trong ví dụ này để minh họa.
Trong một Macro trong thế giới thực, các giá trị này thường sẽ được đọc từ
một trang tính hoặc một tệp. Trong ví dụ tiếp theo, chúng ta đọc 26 giá trị
từ sheet1, ghi kết quả vào sheet2. Chúng tôi làm tất cả điều này chỉ trong 3
dòng. Đây là sức mạnh của Mảng.
Public Sub UseArrays2()
' Ghi 26 giá trị vào hàng thứ ba của sheet2 ThisWorkbook.Worksheets("Sheet2"). Phạm vi ("A3:
Z3"). Giá trị = StudentMarks
' Đặt các giá trị ở vị trí 0,1 và 2 của mảng StudentMarks
(0) = 3
StudentMarks (1) = 9
StudentMarks (2) = 6
Dim i As Long
' Chia mỗi dấu cho 3
Với i = LBound (StudentMarks ) Đến UBound (StudentMarks)
StudentMarks (i) = StudentMarks (i) / 3
Kế tiếp i
' Ghi giá trị ngày vào các ô từ A1 đến C1 trong một dòng ThisWorkbook.Worksheets("Sheet2").
Phạm vi ("A1: C1"). Giá trị = StudentMarks
Nếu bạn muốn biết thêm về mảng thì hãy xem Hướng dẫn đầy đủ về Using
Arrays trong Excel VBA.
Bước 14: Nó còn sống! - Tạo một macro trong thế
giới thực
"Hạnh phúc thực sự đến từ niềm vui của những việc làm được thực hiện tốt,
niềm say mê tạo ra những điều mới mẻ." - Antoine de Saint-Exupery
Nếu bạn hài lòng với tất cả những gì bạn đã học được cho đến nay thì đã
đến lúc chuyển sang bước tiếp theo. Xây dựng macro thế giới thực đầu tiên
của bạn.
Chọn một macro đơn giản mà bạn hoặc đồng nghiệp của bạn sẽ thấy hữu
ích. Vấn đề ở đây là giữ cho nó đơn giản. Nếu bạn cần một cái gì đó để cập
nhật 10 trang tính thì hãy tạo nó cho một trang tính. Nếu bạn cần cập nhật
50 ô thì hãy tạo nó để cập nhật 1 ô. Sẽ dễ dàng hơn để thêm nhiều ô và
trang tính hơn khi bạn bắt đầu.
Hãy tưởng tượng macro này đang diễn ra trong một sổ làm việc có tên là
"Accounts.xlsm". Sử dụng các bước sau để tạo nó.
Giai đoạn 1
1. Tạo sổ làm việc mới
2. Thêm một số dữ liệu mẫu
3. Xây dựng macro của bạn
4. Kiểm tra macro của bạn với dữ liệu mẫu
5. Khắc phục mọi vấn đề bạn tìm thấy
Giai đoạn 2
1. Tạo một bản sao của "Accounts.xlsm".
2. Thêm mã của bạn vào sổ làm việc này
3. Kiểm tra macro của bạn với bản sao
4. Khắc phục mọi vấn đề bạn tìm thấy
Giai đoạn 3
1. Tạo bản sao lưu của "Accounts.xlsm"
2. Bạn có thể hoàn nguyên về bản sao lưu nếu có sự cố xảy ra
3. Kiểm tra mã của bạn
4. Khắc phục mọi vấn đề
5. Xin chúc mừng bạn đã tạo ra Macro thế giới thực đầu tiên của mình
Các bước này rất hữu ích khi bạn bắt đầu. Họ nhanh chóng hoàn thành. Họ
loại bỏ nỗi sợ phạm sai lầm. Nếu điều tồi tệ nhất xảy ra, bạn có thể hoàn
nguyên về bản sao lưu của mình và bắt đầu lại.
Khi bạn tự tin hơn, bạn có thể loại bỏ các bước bạn không cần. Tuy nhiên,
luôn tạo một bản sao lưu của sổ làm việc trước khi bạn thêm mã.
Bước 15: Cách để mã của bạn xử lý lỗi
Phần này mô tả một lĩnh vực quan trọng của lập trình. Khi bạn bắt đầu thực
hiện các Macro đơn giản, nó không thực sự là một vấn đề. Khi Macro của
bạn trở nên lớn hơn hoặc bạn viết chúng cho người khác thì bạn cần phải
xem xét nó.
Mã xử lý lỗi
Có mã trong VBA để xử lý lỗi. Nếu bạn đã viết mã trước đó hoặc xem mã
khác, bạn có thể đã bắt gặp nó.
Mục đích của mã Xử lý lỗi chỉ đơn giản là xử lý lỗi theo cách được xác định
trước khi nó xảy ra. Điều này có nghĩa là cung cấp cho người dùng một
thông điệp thân thiện, viết thông báo lỗi thực tế ở đâu đó và tiếp tục như thể
không có lỗi nào xảy ra.
Hãy để tôi giải thích với một ví dụ trong thế giới thực. Hãy tưởng tượng
bạn có một ứng dụng phát các tệp MP3. Một ngày nào đó bạn sử dụng nó
để phát một tệp MP3 mới. Bạn không biết nó không ở định dạng thích hợp.
Ứng dụng của bạn sẽ cung cấp cho bạn một thông báo tương tự như "Tệp
không phải là tệp MP3 hợp lệ" và sau đó ứng dụng sẽ trở về trạng thái
trước đó như thể không có gì xảy ra.
Nghe có vẻ đơn giản, phải không? Tuy nhiên, mã để đối phó với tình huống
này phải được viết. Giả sử ứng dụng không có xử lý lỗi. Bạn có thể gặp một
lỗi khó hiểu như "x biến không được xác định bởi y". Sau đó, ứng dụng có
thể dừng lại yêu cầu bạn phải giết quá trình nếu bạn biết cách.
Bạn sẽ sử dụng một ứng dụng như thế này trong bao lâu? Tôi đoán sẽ
không lâu nữa trước khi bạn bắt đầu trở nên thất vọng.
Nếu bạn đang tạo các Macro nhỏ cho chính mình thì bạn cần xử lý lỗi tối
thiểu. Nếu bạn đang tạo Macro lớn cho một nhóm người thì bạn cần xử lý lỗi
rộng rãi hơn.
Sau đây là hướng dẫn xử lý lỗi khi xảy ra:
1. Viết thông báo lỗi ở đâu đó để lập trình viên có thể đọc nó trong tương
lai.
2. Cung cấp thông báo thân thiện với người dùng như "Loại tệp không chính
xác".
3. Tiếp tục theo cách được xác định trước.
Ví dụ dưới đây cho thấy một Sub với xử lý lỗi. Dòng "On Error Goto
ErrorHandler" có nghĩa là nếu có lỗi, hãy chuyển đến nhãn có tên
ErrorHandler. Bạn có thể thấy nhãn này ở cuối Sub.
Dòng "On Error Resume Next" đưa bạn đến dòng sau lỗi. Nói cách khác, nó
sẽ tiếp tục trong Macro ngay sau khi xảy ra lỗi.
Thực hiện:
Chức năng thoát
ErrorHandler:
' Viết lỗi vào một tờ
ThisWorkbook.Worksheets("Lỗi") . Phạm vi ("A1") = "Xảy ra lỗi sau" +
Err.Mô tả
'Cung cấp cho người dùng một thông điệp thân thiện
MsgBox "Không thể tính Tổng 1. Vui lòng kiểm tra các giá trị trong tờ có chính
xác không." 'Mã sẽ bắt đầu lại trên mạng sau khi lỗi
Về lỗi Tiếp tục Kết thúc
Tiếp theo Sub
Chìa khóa: Lê
Giá trị: 33
Sau đó, bạn có thể truy cập nó bằng cách sử dụng tên trái cây. Nếu bạn sử
dụng một bộ sưu tập, bạn cần phải đi qua từng mục để tìm một mục bạn
muốn. Hãy xem một ví dụ về một số mã
Sub UseDict()
End Sub
Trong ví dụ này, bạn có thể thấy rằng chúng ta thêm một mục bằng cách sử
dụng khóa và giá trị.
Khóa có thể là số nguyên hoặc chuỗi. Khi chúng ta muốn tìm xem chúng ta
có bao nhiêu mặt hàng của một loại trái cây, chúng ta có thể đơn giản sử
dụng tên trái cây để có được giá trị.
1. Nó có thể lưu trữ một mặt hàng và giá trị của nó cùng nhau
2. Nó cho phép bạn lấy giá trị mục trực tiếp bằng cách sử dụng tên
Từ điển có một cách sử dụng thứ hai, rất quan trọng. Bạn có thể sử dụng nó
để loại bỏ các bản sao khỏi danh sách các mục. Bạn không thể có các khóa
trùng lặp trong Từ điển. Nếu bạn thử thêm một mục hiện có vào từ điển, nó
sẽ chỉ cập nhật giá trị tại khóa đó.
Ví dụ sau đây cho bạn thấy cách đọc danh sách các mục trong từ điển. Khi
bạn in các mục từ từ điển, bạn có thể thấy rằng tất cả các bản sao đã bị
xóa.
'Xóa các bản sao khỏi danh sách các mục
'Một từ điển có các phím duy nhất. Nếu nó đã tồn tại thì giá trị của khóa hiện có sẽ được cập nhật Sub
RemoveDuplicates()
'Thêm danh sách các mục - chúng theo thứ tự giá trị mới nhất
' Nếu khóa đã tồn tại, giá trị hiện tại sẽ cập nhật dict ("Apple")
=1
dict("Lê") = 1
dict("Lê") = 1
dict("Màu cam") = 1
dict("Apple") = 12
'Dọn dẹp
Đặt dict = Nothing
End Sub
Bạn sẽ nhận thấy trong ví dụ trên rằng Từ điển có một cái rất hữu ích
'Im lặng thêm'.
dict("Apple") = 1
Nếu bạn thêm một mục, Từ điển sẽ kiểm tra trước nếu nó đã tồn tại. Nếu nó
tồn tại, nó sẽ cập nhật giá trị cho khóa đó. Nếu nó không tồn tại thì Từ điển
sẽ tạo một khóa mới và thêm giá trị cho khóa này.
Bạn có thể thấy cách táo trong đoạn mã trên kết thúc với giá trị 12 vì đây
là giá trị cuối cùng được gán cho nó.
Từ điển là một yếu tố rất mạnh mẽ của VBA và như bạn đã thấy, nó có thể
rất hữu ích trong một số tình huống nhất định.
Phần thưởng hai: 10 mẹo để tạo mã VBA tuyệt
vời
1. Luôn bình luận mã của bạn. Vì vậy, khi bạn nhìn vào mã của mình
trong một vài tháng, bạn sẽ dễ dàng hiểu nó. Bạn đang làm điều gì đó
khó khăn hoặc bất thường, sau đó nói lý do tại sao bạn đang làm thay
vì chỉ những gì bạn đang làm .
2. Sử dụng tên có ý nghĩa cho các biến. Các tên như totalAmount và
sheetRead làm cho mã của bạn dễ theo dõi hơn nhiều.
3. Sử dụng ByVal khi truyền một biến đến một hàm hoặc một sub. Điều này
ngăn không cho nó vô tình bị thay đổi trong quy trình.
5. Nếu bạn đang xử lý một lượng lớn dữ liệu thì trước tiên hãy sao chép các
giá trị ô vào một array. Sau đó, bạn có thể thao tác các giá trị từ mảng.
Điều này nhanh hơn nhiều so với việc truy cập các tế bào mỗi lần.
6. Sử dụng Cửa sổ ngay lập tức (Ctrl G) để kiểm tra đầu ra của bạn
trước. Bạn có thể ghi vào cửa sổ ngay lập tức bằng cách sử dụng
Debug.Print theo sau là giá trị bạn muốn in.
7. Nếu bạn đang viết macro mới cho sổ làm việc, trước tiên hãy luôn tạo
một bản sao của sổ làm việc. Điều này sẽ đảm bảo bạn không vô tình
xóa dữ liệu của mình.
8. Khi bạn đang tạo một macro mới, hãy chia nó thành các tác vụ đơn giản.
Làm cho mỗi người làm việc trước khi chuyển sang cái tiếp theo. Điều
này nghe có vẻ hiển nhiên nhưng đôi khi bạn có thể hoàn toàn bị
choáng ngợp bằng cách cố gắng giải quyết tất cả cùng một lúc.
9. Luôn sử dụng OPTION EXPLICIT ở đầu mô-đun của bạn. Điều này
buộc bạn phải khai báo một biến đó là một điều tốt. Bạn có thể tự
động bật tính năng này bằng cách chọn Tools->Options và chọn hộp
"Require Variable Declaration".
10.Tạo một số dự án mẫu. Cách duy nhất để thực sự học VBA là tạo ra
các dự án. Thậm chí tốt hơn là tạo ra một số dự án thực sự. Cố gắng
tìm ai đó cần macro VBA và cố gắng tạo macro đó cho họ. Làm điều
này sẽ giúp bạn học VBA nhanh hơn bất kỳ phương pháp nào khác.
Kết luận:
Hãy cùng điểm qua những gì bạn đã học được trong cuốn sách này.
Trước tiên, bạn đã học cách tạo một mô-đun và đặt một quy trình trong đó.
Thủ tục là nơi bạn đặt tất cả mã của mình.
Có hai loại thủ tục, Subs và Functions. Về cơ bản, chúng giống nhau ngoại
trừ chỉ có Hàm trả về một giá trị và chỉ Subs mới có thể được chạy dưới
dạng Marcos.
Tiếp theo, bạn đã học được ba phần quan trọng nhất của VBA: Sách bài tập,
Bảng tính và Phạm vi. Chúng sẽ được sử dụng trong hơn 90% mã của bạn.
Phạm vi đặc biệt quan trọng khi chúng đọc / ghi vào các ô. Thuộc tính Ô
có thể được sử dụng để truy cập các ô bằng cách sử dụng các giá trị hàng và
cột.
Chương tiếp theo chúng ta đến với các biến được đề cập. Chúng cung cấp
một cách dễ dàng để lưu trữ các giá trị tạm thời như số, văn bản, v.v.
Tiếp theo, chúng tôi kết hợp tất cả những điều này lại với nhau để tạo ra một
Macro đơn giản. Điều này cho bạn thấy làm thế nào để sử dụng những gì bạn
đã học được cho đến nay.
Sau đó là thời gian để gặp cường quốc của VBA, Vòng lặp. Điều này cho
phép bạn dễ dàng thực hiện các tác vụ hàng trăm hoặc thậm chí hàng nghìn
lần. Có bảy Vòng lặp thực hiện hầu hết cùng một điều nhưng For Loop sẽ
thực hiện công việc hầu hết thời gian.
Câu lệnh If cho phép bạn thực hiện các lựa chọn trong mã của mình. Nó
tương tự như hàm If trong Excel . Bạn có thể sử dụng Else và ElseIf với
câu lệnh If. Bạn cũng có thể sử dụng Select Case thay vì danh sách các câu
lệnh ElseIf.
Tiếp theo, bạn sẽ thấy cách sử dụng các nút để dễ dàng chạy Macro của
mình. Chúng rất hữu ích và rất đơn giản để thêm.
Bạn sẽ luôn có trường hợp khi bạn cần mở sổ làm việc. Đó là một công
việc khó khăn nhưng bạn có thể sử dụng mã được kiểm tra thời gian được
cung cấp. Điều này sẽ phát hiện nếu tệp tồn tại hoặc đã mở.
Sau khi mở sổ làm việc, bạn đã tìm hiểu về ba loại lỗi. Chúng là Trình
thông dịch, Trình biên dịch và Thời gian chạy. Chúng tôi đã xem xét các
chiến lược để giải quyết từng loại.
Bộ sưu tập là yếu tố VBA cuối cùng chúng tôi xem xét. Chúng cho phép
bạn lưu trữ danh sách các mục như sổ làm việc, chuỗi, trang tính, v.v. Phần
thứ hai của phần này mô tả cách sử dụng Mảng.
Sau đó, chúng tôi làm tròn tất cả với một số hướng dẫn để xây dựng một
Macro trong thế giới thực.
Hãy nhớ rằng bí quyết thành công với VBA là bắt đầu nhỏ, chia nhỏ nhiệm
vụ thành các phần nhỏ hơn và tất nhiên là thực hành, thực hành, thực hành.
Hãy thử mã trong mỗi chương. Bạn sẽ ngạc nhiên khi dễ dàng tạo ra một
cái gì đó. Nếu bạn học các kỹ năng trong cuốn sách này, bạn sẽ có chúng
cho đến hết đời. Họ có thể được mang theo bạn đến bất kỳ công việc văn
phòng nào trên thế giới sử dụng Excel.
Bạn có thể dễ dàng thành thạo VBA. Các chiến lược tôi đã chỉ cho bạn rất
mạnh mẽ. Họ làm việc cho tôi, cho khách hàng của tôi và họ sẽ làm việc cho
bạn. Tất cả những gì họ cần từ bạn là một chút nỗ lực.
Tôi chúc bạn may mắn
nhất! Kính thư
Paul
Trở thành VBA Master
Hãy tưởng tượng những gì bạn có thể làm nếu bạn có quyền truy cập vào
bộ sưu tập bí mật bị cấm của một bậc thầy VBA. Tệp thông tin vuốt này có
giá trị bao nhiêu đối với bạn? VBA của bạn sẽ cải thiện mạnh mẽ như thế
nào bằng cách chỉ sử dụng một vài bí mật đã được chứng minh của họ
trong mã của bạn?
Mô-đun 2 của Sổ tay Excel VBA là một bộ sưu tập các công cụ vô giá - và
ngay khi bạn quyết định dùng thử, bạn sẽ khám phá ra điều gì khiến Paul
Kelly trở thành tác giả bán chạy nhất và là một trong những VBA hiệu quả
nhất
lập trình viên trên thế giới. Nhưng quan trọng hơn, bạn sẽ tự hỏi làm thế nào
bạn sống sót trong suốt thời gian này mà không có nó.
Xem Sổ tay Excel VBA tại đây và sử dụng voucher
MacroMastery để được giảm 20% gói Premium.
Cảm ơn bạn đã đọc cuốn sách này
Trước khi bạn đi, tôi muốn cảm ơn bạn đã đọc cuốn sách của tôi. Tôi hy
vọng bạn thấy nó hữu ích. Sẽ thật tuyệt vời nếu bạn có thể dành một phút
để xem lại cuốn sách này trên Amazon. Loại phản hồi này sẽ giúp tôi cải
thiện các phiên bản trong tương lai.