Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 118

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ả.

Thực hành viết code


Tôi không thể nhấn mạnh điều này đủ. Bạn càng thực hành nhiều, bạn càng
trở nên tốt hơn. Cuốn sách này có đầy đủ các ví dụ mã hóa. 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. Thực hiện các thay đổi nhỏ đối với các
mẫu và xem nó ảnh hưởng đến kết quả của bạn như thế nào. Khi bạn thấy
các ví dụ của mình hoạt động, bạn sẽ muốn thử nhiều hơn.
Chia nhỏ nó
Chia nhỏ nhiệm vụ của bạn thành các phần nhỏ. Đừng choáng ngợp. Mỗi
Macro là một chuỗi các tác vụ xảy ra theo thứ tự. Lấy từng cái một. Khi
một cái hoàn thành, hãy chuyển sang cái tiếp theo. Điều này có vẻ hiển
nhiên nhưng đôi khi tôi thậm chí còn quên nó.
Đừng để lỗi ngăn cản bạn
Nhiều người bỏ cuộc khi họ gõ một dòng mã và nhận được thông báo lỗi.
Hầu hết các lỗi này đều đơn giản để sửa chữa. Chúng thường được gây ra
bởi một lỗi đánh máy. Nếu bạn gặp lỗi, hãy kiểm tra Danh sách trình dịch
lỗi ở Bước 2. Nó chỉ cho bạn cách dễ dàng giải quyết phần lớn các lỗi cú
pháp.
Đóng tất cả sổ làm việc
Khi bạn đang làm việc thông qua các ví dụ, trước tiên bạn nên đóng bất kỳ
tệp Excel nào không được kết nối với các ví dụ. Nó sẽ làm cho những gì bạn
đang làm rõ ràng hơn nhiều.
Thưởng thức nó
Rất nhiều người thích viết mã. Trên thực tế, hàng ngàn người làm điều đó
trong thời gian rảnh rỗi để giải trí. Nếu bạn thích sử dụng Excel thì rất có
thể bạn sẽ thực sự thích lập trình Macro. Khi bạn bắt đầu thấy kết quả, bạn
sẽ thích nó hơn nữa.
Macro - Hãy cho tôi Câu hỏi thường gặp
"Không có gì lừa dối hơn một sự thật hiển nhiên." - Sir Arthur Conan
Doyle
Sau đây là những câu hỏi phổ biến nhất mà tôi nhận được về VBA
Macro là gì?
Macro là một tập hợp các hướng dẫn lập trình mà bạn có thể sử dụng để
thực hiện bất kỳ tác vụ nào trong Excel.
VBA là gì?
VBA là viết tắt của Visual Basic for Applications. Visual Basic là ngôn
ngữ lập trình mà Microsoft bao gồm với mỗi Sản phẩm Office của họ. Đây
là ngôn ngữ bạn sử dụng để tạo Macro. Ngôn ngữ Basic ban đầu được tạo
ra để cho phép bất cứ ai viết mã. Trên thực tế, B trong Basic là viết tắt của
Beginner.

Tại sao sử dụng nó?


Bạn có thể tự động hóa các tác vụ lặp đi lặp lại hoặc thêm chức năng mới
vào Excel.
Ông có thể đưa ra một ví dụ?
Hãy tưởng tượng bạn phải sao chép dữ liệu từ 10 sổ làm việc khác nhau
hàng ngày. Sử dụng VBA, bạn có thể tự động hóa việc này bằng một quy
trình đơn giản. Ngoài ra, nó sẽ chạy nhanh hơn nhiều bằng cách sử dụng
VBA so với bạn có thể làm thủ công.
Những lợi ích là gì?
Bạn có thể tiết kiệm một lượng lớn thời gian cho các nhiệm vụ lặp đi lặp
lại. Nếu bạn thực hiện cùng một tác vụ nhiều lần trong tuần thì bạn có thể
tạo một Macro để làm điều đó cho bạn.
Nghe có vẻ tốt, có lợi ích nào khác không?
Nó có thể thực hiện các nhiệm vụ phức tạp rất nhanh chóng. Ví dụ: so sánh
hai trang tính với hàng ngàn ô sẽ mất vài giây với Macro. Con người sẽ mất
nhiều thời gian hơn.
Bạn cũng có thể làm những việc bên ngoài Excel như gửi Email, ghi vào
Cơ sở dữ liệu, tạo tệp XML, v.v.
Hãy cho tôi biết thêm một lợi ích nữa
VBA nhỏ gọn. Nó có tác động tối thiểu đến kích thước và tốc độ sổ làm
việc. Do đó, nếu bạn thay thế các công thức phức tạp bằng VBA, bạn có
thể làm cho sổ làm việc của mình nhỏ hơn và nhanh hơn.
Học có khó không?
Không. Nếu bạn đang học VBA thì có lẽ bạn biết Excel khá tốt. VBA đòi
hỏi cùng một loại tư duy. Tất cả những gì bạn cần là làm theo các bước và
sẵn sàng bỏ thời gian và công sức. Tin tốt là bạn có thể bắt đầu đơn giản
như bạn muốn và xây dựng chậm hoặc nhanh như bạn muốn.

Mã VBA được lưu trữ ở đâu?


Mã được lưu trữ như một phần của tệp sổ làm việc. Nó được lưu trữ dưới
dạng văn bản. Đây là lý do tại sao nó có tác động tối thiểu đến kích thước
của sổ làm việc.
Tôi nên sử dụng phiên bản Excel nào?
VBA gần như giống nhau trong các phiên bản Excel 2007, 2010 và 2013.
Các ví dụ trong cuốn sách này sẽ hoạt động với tất cả các phiên bản này
Bước 1: Cách tạo đoạn mã đầu tiên của bạn chỉ
trong vài giây
"Chỉ những bộ óc vĩ đại mới có thể mua được một phong cách đơn giản" -
Stendhal
Chào mừng bạn đến với VBA. Bước đầu tiên ngắn nhưng quan trọng. Nó
chỉ cho bạn cách tạo một thủ tục. Tất cả các mã bạn viết được đặt trong một
thủ tục.
Trình chỉnh sửa VBA là nơi bạn viết tất cả mã của mình. Nhấn Alt + F11
trong Excel để vào Trình chỉnh sửa. Màn hình có thể trông khó hiểu lúc
đầu nhưng khi bạn sử dụng nó thường xuyên, nó sẽ trở thành bản chất thứ
hai.
Trong các bước dưới đây, bạn sẽ thấy việc tạo quy trình đầu tiên của mình
dễ dàng như thế nào.

1. Mở một bảng tính mới và lưu nó dưới dạng MyVBA.xlsm.


2. Mở VBA Editor - Developer Ribbon->Controls->View Code (hoặc
Alt + F11)
3. Từ menu VBA Editor, chọn View->Project Explorer
4. Nó sẽ xuất hiện dưới dạng một ngăn ở bên trái
5. Trong ngăn bạn sẽ thấy
VBAProject (MyVBA)

6. Nhấp chuột phải và chọn Insert->Module.


7. Một trang trống sẽ xuất hiện
8. Nhập văn bản "Public Sub MyProc" và nhấn Enter.
9. Bây giờ bạn đã tạo thủ tục đầu tiên của bạn.

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

() Kết thúc Sub


Your Quick Guide to Modules and Procedures

1. Workbooks contain modules.


2. Modules contain procedures.
3. Procedures contain your code.
4. There are two types of procedures - Subs and Functions.

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

1. Decide the Sub you wish to Run


2. Click the mouse inside it
3. Press F5(or select Debug->Run from the menu).

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

Thông báo lỗi Nguyên nhân có thể Ví dụ Ví dụ đã sửa


Phát hiện tên không Hai Subs có cùng Sub công khai DoStuff() Sub công cộng
rõ ràng tên. Mỗi Sub phải Sub công khai DoStuff() DoStuff1() Sub công
có một cộng DoStuff2()
Tên duy nhất
Khai báo Biến được khai báo Dim x As Long Dim x As Long
trùng lặp hai lần trong Dim x As Long Dim y As Long
trong cùng một
Phạm vi hiện tại Sub/Function

Dự kiến: = Thiếu dấu bằng Đối với i 1 đến 5 Với i = 1 đến 5


từ Đối với tuyên bố
Dự kiến:) Thiếu dấu ngoặc đơn x = Len ("John" x = Len ("John")
Dự kiến:) Kết thúc báo giá x = Len ("John") x = Len ("John")
thiếu
Dự kiến: kết thúc Dấu bằng bị thiếu Làm trong khi i 5 Do While i = 5
tuyên bố trong câu lệnh
While
Dự kiến: kết thúc Dấu cách trong tên Hiển thị phụ Message() Sub ShowMessage()
Tuyên bố của một Sub/Function
Dự kiến: kết thúc Dấu cách trong tên Hộp bột ngọt Hộp thông tin
Tuyên bố của một từ dành riêng Di m Mờ
Dự kiến: Không có gì bên phải Phạm vi ("A1") = Phạm vi ("A1") = 6
biểu thức bằng nhau
Dự kiến: Do While tuyên bố Làm trong khi Làm trong khi x<10
biểu thức thiếu điều kiện
Dự kiến: ElseIf có không gian Khác Nếu ElseIf
biểu thức Giữa các từ
Dự kiến: Nếu hoặc Elsenếu Nếu sau đó Nếu x>6 thì
biểu thức thiếu
điều kiện
Dự kiến: Mã Ký tự khác với một
định danh số chữ cái ở đầu một
Tên phụ / biến

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()

Dự kiến: số dòng Không có gì bên trái = . Phạm vi ("A1") x = . Phạm vi ("A1")


hoặc nhãn hoặc bằng nhau
tuyên bố hoặc kết
thúc
Số lượng tuyên bố
Dự kiến: danh sách Thiếu dấu ngoặc kép Phạm vi ("A1) = 5 Phạm vi ("A1") = 5
Dấu phân cách hoặc
)
Thiếu dấu phẩy Ô(1 3) = 5 Ô(1,3) = 5
Dự kiến: sau đó Thiếu sau đó trong Nếu x>6 Nếu x>6 thì
hoặc goto câu lệnh If hoặc
ElseIf

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ờ

Phạm vi Tên đã cho không được gọi là "Bán hàng"


không tồn tại. tồn tại

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.

Công cộng Sub FormatCell ()


' Dòng này sẽ đặt phông chữ thành in đậm trong Ô A1 của Sổ làm việc Sheet1 ("MyVBA.xlsm").
Trang tính("Trang tính1"). Phạm vi ("A1"). Font.Bold = true
Kết thúc phụ

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:

The Three Magic Elements

1. Workbook
2. Worksheet
3. Range

Tại sao tôi gọi đây là những nguyên tố ma thuật?


Bởi vì 95% mã bạn viết sẽ sử dụng một hoặc nhiều trong số này! 3 yếu tố
này là cốt lõi của VBA. Mọi thứ khác là để giúp bạn tận dụng tối đa chúng.
Trong phần trước, bạn đã thấy có thể đạt được bao nhiêu chỉ bằng cách sử
dụng ba yếu tố này.
Chúng tôi sẽ xem xét chúng riêng lẻ bắt đầu với sổ làm việc.
Sổ làm việc
Cho đến nay, chúng tôi đã truy cập sổ làm việc bằng Workbooks
("MyVBA.xlsm"). Đây được gọi là một đối tượng sổ làm việc. Điều này có
nghĩa là chúng ta có thể sử dụng nó để làm bất cứ điều gì mà sổ làm việc
thực hiện trong Excel. Nó có một số lượng lớn các thuộc tính nhưng nói
chung bạn chỉ sử dụng một vài.
Ví dụ sau đây hiển thị tên tệp của MyVBA.xlsm.
Public Sub DisplayName ()
' Hiển thị tên đầy đủ của sổ làm việc MsgBox
Workbooks ("MyVBA.xlsm"). Họ và tên
Kết thúc phụ

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ở.

Sổ làm việc("<tên sổ làm việc ở đây>")

Đả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.

Public Sub WriteToCellUsingThis ()


' Cả hai dòng đều làm điều
tương tự.
ThisWorkbook.Worksheets("Sheet1"). Phạm vi ("A1") = Sổ làm việc "Xin chào Thế giới"
("MyVBA.xlsm"). Trang tính("Trang tính1"). Phạm vi ("A1") = "Xin chào thế giới"
Kết thúc phụ

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.

Use ThisWorkbook when using the current workbook

Use Workbooks(“<workbook name here>”) when using an open


workbook

Only use ActiveWorkbook if you really have to and you know


what you are doing

ThisWorkbook sẽ chỉ bao giờ sử dụng sổ làm việc hiện tại.


ActiveWorkbook sẽ sử dụng sổ làm việc đang hoạt động bất kể nó là gì và
nó đã hoạt động như thế nào.
Điều đó kết thúc phần đầu tiên trên sổ làm việc. Trong chương sau, chúng ta
sẽ giải quyết việc mở sổ làm việc.
Nếu bạn muốn biết thêm về Sổ làm việc trong VBA thì hãy xem bài đăng
này, Hướng dẫn đầy đủ về sổ làm việc trong Excel VBA.
Trang tính
Điều này đưa chúng ta đến yếu tố ma thuật số hai - bảng tính.
Chủ yếu là bạn sẽ sử dụng trang tính để truy cập các ô của nó. Bây giờ và
một lần nữa bạn có thể sử dụng nó để bảo vệ / bỏ bảo vệ hoặc Ẩn / Bỏ ẩn
một trang tính. Nhưng hầu hết thời gian đó là về các tế bào và phạm vi.
Để lấy trang tính, bạn có thể làm như vậy bằng cách sử dụng tên của trang
tính. Đoạn mã dưới đây viết "Hello World" trong Ô A1 của Sheet1, Sheet2
và Sheet3.
Sub công khai WriteToCell ()
' Ghi vào ô A1 trong Sheet1,Sheet2 và Sheet3 ThisWorkbook.Worksheets("Sheet1"). Phạm vi
("A1") = "Xin chào thế giới" ThisWorkbook.Worksheets ("Sheet2"). Phạm vi ("A1") = "Xin
chào thế giới" ThisWorkbook.Worksheets ("Sheet3"). Phạm vi ("A1") = "Xin chào thế giới"
Kết thúc phụ

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ụ

Sub công khai UnHideWorksheet()


ThisWorkbook.Worksheets("Sheet1"). Hiển thị = true
Kết thúc phụ

Bảo vệ con công cộngBảng tính ()


ThisWorkbook.Worksheets("Sheet1"). Bảo vệ mật khẩu: =
"MyPassword" End Sub

Public Sub UnProtectWorksheet () ThisWorkbook.Worksheets("Sheet1"). Bỏ bảo vệ


mật khẩu: = "MyPassword"
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

To get more information about a VBA element.

1. Click on the element


2. Press F1
Có một đối tượng trang tính được gọi là ActiveWorksheet. Bạn nên cẩn
thận khi sử dụng điều này vì những lý do tương tự bạn cần phải cẩn thận
khi sử dụng ActiveWorkbook.
Nếu bạn muốn biết thêm về Sổ làm việc trong VBA thì hãy xem bài đăng
này, Hướng dẫn đầy đủ về trang tính trong Excel VBA.
Giới thiệu về Ranges
Với sổ làm việc và trang tính, bạn đang xác định cái để sử dụng. Phần tử
Ranges thực hiện công việc khó khăn thực sự. Nó được sử dụng để xác định
các tế bào bạn muốn sử dụng nhưng cũng làm nhiều hơn nữa. Như bạn đã
thấy, Range là một thành viên của Worksheets. Bất cứ điều gì bạn có thể làm
với một nhóm các ô trong Excel, bạn có thể làm với Phạm vi.

Cập nhật phụ công khaiCells()

' 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 phông chữ thành màu đỏ ThisWorkbook.Worksheets ("sheet1"). Phạm


vi ("A1: A5"). Font.Color = rgbRed

' Đặ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 €"

Kết thúc phụ

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ó.

Cập nhật phụ công khaiCellsWith()

'Với phương tiện, chúng ta chỉ cần viết ThisWorkbook.Worksheets ("Sheet1")


một lần với ThisWorkbook.Worksheets ("Sheet1")

' 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"

' Đặt phông chữ thành màu đỏ


. Phạm vi ("A1: A5"). Font.Color = rgbRed

' Đặt đường viền thành đường kép


. Phạm vi ("B2"). Borders.LineStyle = xlDouble

' 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 =

"€0,00" kết thúc bằng


Kết thúc phụ

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()

Với ThisWorkbook.Worksheets("sheet1") '

Đặt giá trị A1 làm giá trị trong C1


. Phạm vi ("A1") = . Phạm vi ("C1")

' Đặt giá trị A1:A5 thành giá trị trong C1


. Phạm vi ("A1: A5") = . Phạm vi ("C1")

'KHÔNG SỬ DỤNG - quyền bằng nhau phải là một ô duy nhất


'Thuộc tính Giá trị của nhiều ô luôn trống, vì vậy A1: A5 sẽ được đặt thành trống
. Phạm vi ("A1: A5") = . Phạm vi ("C1: C5")

Kết thúc

với End Sub

Như bạn có thể thấy


1. Ô, ở bên phải của dấu bằng, được đọc từ.
2. (Các) ô, ở bên trái dấu bằng là(are), được viết cho

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

("A1") kết thúc bằng

Kết thúc phụ


Bạn có thể đã nhận thấy trong ví dụ cuối cùng rằng chúng ta chỉ có thể sử
dụng từ khóa With cho một đối tượng tại một thời điểm. Sử dụng With là tốt
với một sổ làm việc hoặc trang tính. Khi sử dụng nhiều tờ, chúng ta cần sử
dụng một cái gì đó khác.
Trong ví dụ sau, chúng tôi tạo các đối tượng trang tính của riêng mình bằng
Dim. Thực sự chúng tôi đang tạo tên thay thế cho trang tính của chúng tôi.
Công cộng Sub UseWorksheetObjects ()

' Khai báo các đối tượng trang


tính Dim writeSheet As
Worksheet
Dim PaymentsSheet As Worksheet
Dim AccountsSheet As Worksheet

' 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")

' writeSheet hoàn toàn giống với ThisWorkbook.Worksheets ("Sheet3")


Với writeSheet
' Đặt giá trị A1 thành giá trị trong A1 trong trang tính "Thanh toán" của sổ làm việc có
tên Other.xlsm
. Phạm vi ("A1") = PaymentsSheet.Range ("A1")

' Đặ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ì

Kết thúc phụ

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

3 Đối tượng Khi sử dụng nhiều tờ Dim writeSheet As Worksheet


trang tính nhiều lần Set writeSheet =
ThisWorkbook.Worksheets("sheet3")
writeSheet.Range("A1") =

Đừ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"

' Cả hai dòng đều ghi 25 vào ô B10


. Phạm vi ("B10") = 25
. Ô(10,2) = 25

' Cả hai dòng đều ghi 24,99 vào phạm vi C2: C5


. Phạm vi ("C2: C5") = 24,99
. Phạm vi(. Ô (2,3), Ô (5,3)) = 24,99 Kết
thúc bằng

Kết thúc phụ

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 ô.

Trong dòng cuối cùng trong ví dụ trên, chúng ta sử dụng Phạm vi và Ô


cùng nhau để cung cấp cho chúng ta một dải ô sử dụng số.

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()

' Lấy cột cuối cùng từ bên trái không trống


Dim lLastCol As Long
lLastCol = cnSheet1.Range ("A1"). Kết thúc (xlToRight). Cột

' Viết văn bản vào ô trống đầu tiên trong Hàng 1
cnSheet1.Cells (1, lLastCol + 1) = "John Smith"

Kết thúc phụ

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 ô.

Using Range and Cells

Use Range when the cell will be the same every time the Macro
runs.
Use Cells when the cell may vary

Sao chép và dán ô


Nếu bạn muốn sao chép một phạm vi lớn các ô tuần tự thì cách tốt nhất là
sử dụng Sao chép với đối số Đích. Nếu bạn chỉ muốn sao chép
định dạng / công thức, v.v. bạn có thể sử dụng chức năng PasteSpecial của
Phạm vi. Đoạn mã sau đây cho thấy ví dụ về cả hai phương pháp
Sub công khai CopyRange()

Với cnSheet1
'Sao chép / dán mọi thứ
. Phạm vi ("A1: B5"). Sao chép đích:= . Phạm vi ("A20")

' Chỉ sao chép / dán định dạng


. Phạm vi ("A1: B5"). Bản sao
. Phạm vi ("C20"). DánĐặc biệt xlPasteĐịnh dạng

' Chỉ sao chép / dán giá trị


. Phạm vi ("A1: B5"). Bản sao
. Phạm vi ("F20"). DánĐặc biệt xlPasteGiá trị

kết thúc bằng

Kết thúc phụ

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 đó.

' đặt giá trị trong một biến


AppleCount = 7
TotalPrice = 265,56
CustomerName = "John Smith"
ReportDate = #01\06\2015#
IsValid = True

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ố.

'Khi bạn chạy, bạn sẽ nhận được Type Mismatch


AppleCount = "55 ff"
TotalPrice= "Giá 22.23"

Sau đây sẽ chuyển đổi văn bản thành số.


'VBA sẽ tự động chuyển đổi thành số AppleCount =
"55"
TotalPrice = "22,23"

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()

' 1. Tạo một biến Dim


iRow As Long

' 2. Đặt một giá trị trong biến


iRow = 100

'3. Thêm vào giá trị hiện


tại iRow = iRow + 1

'4. Thực hiện phép tính – iRow sẽ là 2 iRow =


(5 * 10) / 25

'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

Kết thúc phụ

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

Public Sub UseString()

' 1. Tạo một biến


Dim CustomerName As String

'2. Đặt một giá trị trong biến


CustomerName = "John"

'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

' 5. Sử dụng làm đối số hàm


'Để xem đầu ra của dòng này, chọn View->Instant Window từ Menu (Ctrl G)
Debug.Print CustomerName

' 6. Ba hàm String sau đây giúp bạn sử dụng string ' In 4 chữ

cái đầu tiên của CustomerName


Debug.Print trái(Tên khách hàng, 4)

' In 4 chữ cái cuối cùng của


CustomerName Debug.Print Right
(CustomerName, 4)

' In tên khách hàng bằng chữ hoa


Debug.Print UCASE (Tên khách hàng)

Kết thúc phụ


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ất cứ điều gì tốt đẹp chúng ta xây dựng cuối cùng sẽ xây dựng chúng ta" -
Jim Rohn
Trong phần này, chúng tôi sẽ xây dựng một ứng dụng nhỏ.
Đề xuất:
1. Bạn có hai trang tính được gọi là "Tài khoản" và "Báo cáo".
2. Trang tính Tài khoản có các giá trị trong các ô A1:A4.
3. Tạo quy trình để đặt các giá trị này vào các ô B1:B4 trên trang Báo
cáo.
4. Đặt phông chữ của các ô này thành In đậm.
5. Đặt màu phông chữ của các ô này thành Hải quân.
Thiết lập:
1. Tạo một sổ làm việc mới và lưu với phần mở rộng .xlsm.
2. Đổi tên Sheet1 thành "Accounts" và Sheet2 thành "Report"
3. Nhập một số giá trị vào các ô từ A1 đến
A4. Bây giờ bạn đã sẵn sàng để viết mã
Tạo mã:
Chúng ta sẽ tạo Macro này bằng cách chia nó thành các bước đơn giản. Khi
bạn đã quen với Macro, bạn sẽ thực hiện các bước này mà không cần suy
nghĩ.
1. Xác định trang tính để ghi vào: ThisWorkbook.Worksheets("Báo cáo")
2. Xác định Ô đầu tiên để ghi vào: Phạm vi ("B1")
3. Đặt trang tính và Ô lại với nhau

ThisWorkbook.Worksheets("Báo cáo") . Phạm vi ("B1") =

4. Sử dụng With để làm cho mã dễ đọc hơn


Với ThisWorkbook.Worksheets("Báo cáo")
. Phạm vi ("B1")
= Kết thúc bằng

5. Xác định tờ để đọc:


ThisWorkbook.Worksheets("Tài khoản")
6. Xác định Ô đầu tiên để đọc từ: . Phạm vi ("A1")
7. Xác định trang tính để đọc từ đó

ThisWorkbook.Worksheets("Tài khoản") . Phạm vi ("A1")

8. Đặt trang tính và Ô lại với nhau


Với ThisWorkbook.Worksheets("Tài khoản")
. Phạm vi ("B1") = ThisWorkbook.Worksheets ("Tài khoản") . Phạm vi
("A1") kết thúc bằng

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 ô

Sub công cộng MyMacro()

Với ThisWorkbook.Worksheets("Báo cáo")


. Phạm vi ("B1") = ThisWorkbook.Worksheets ("Tài khoản"). Phạm vi ("A1")
. Phạm vi ("B2") = ThisWorkbook.Worksheets ("Tài khoản"). Phạm vi ("A2")
. Phạm vi ("B3") = ThisWorkbook.Worksheets("Tài khoản"). Phạm vi ("A3")
. Phạm vi ("B4") = ThisWorkbook.Worksheets ("Tài khoản"). Phạm vi
("A4") kết thúc bằng

Kết thúc phụ

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()

' Viết từ 1 đến 5 vào các ô từ A1 đến A5


ThisWorkbook.Worksheets ("Sheet1"). Phạm vi ("A1") = 1
ThisWorkbook.Worksheets("Sheet1"). Phạm vi ("A2") = 2
ThisWorkbook.Worksheets("Sheet1"). Phạm vi ("A3") = 3
ThisWorkbook.Worksheets("Sheet1"). Phạm vi ("A4") = 4
ThisWorkbook.Worksheets("Sheet1"). Phạm vi ("A5") = 5

Kết thúc phụ

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()

' Viết từ 1 đến 5 vào các ô từ A1


đến A5 Dim iRow As Long
Đối với iRow = 1 đến 5
ThisWorkbook.Worksheets("Sheet1"). Ô (iRow, 1) = iRow
tiếp theo iRow

Kết thúc phụ

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

iRow Kết thúc

Sub

Hãy chia nhỏ hoạt động của For Loop ở trên.


1. iRow được đặt thành 1
2. Ô (iRow,1) được đặt thành giá trị trong iRow
3. Đó là: Ô (1,1) được đặt thành 1
4. iRow được đặt thành 2
5. Ô (iRow,1) được đặt thành giá trị trong iRow
6. Đó là, Cells (2,1) được đặt thành 2
7. Và cứ như vậy cho đến khi ô cuối cùng được đặt thành 100

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à:

1. Một biến thuộc loại dài


2. Số bắt đầu của bạn (chủ yếu là 1)
3. Số kết thúc của bạn
4. Từ khóa Next để báo hiệu sự kết thúc của vòng lặp

Hãy xem các ví dụ ĐỂ BIẾT sau đây


' 1 đến 100
Đối với iRow = 1 đến 100

' 50 đến 100


Đối với iRow = 50 đến 100

' 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

' 1 đến 100 chỉ với các số chẵn, ví dụ: 1,3,5 .. 99


Đối với iRow = 1 đến 100 Bước 2

' Sử dụng các số sau 50,60,70,80,90,100 Đối với


iRow = 50 đến 100 Bước 10

Bạn cũng có thể đếm ngược bằng cách sử dụng số bước trừ

'Điều này sẽ không làm bất cứ điều gì vì nó nghĩ rằng nó đang


đếm về phía trước Đối với iRow = 100 đến 1

'Bắt đầu từ 100 và đếm ngược đến một 100,99,


v.v. Đối với iRow = 100 đến 1 Bước -1
Thoát sớm
Đôi khi bạn có thể muốn rời khỏi vòng lặp sớm. Bạn có thể sử dụng Exit
For để thực hiện việc này.
Công khai Sub SetValuesExit()

Dim iRow As Long


' Ghi từ 1 đến 5 vào các ô từ A1 đến A5 bằng cách
dùng vòng lặp For Next For iRow = 1 To 5
' Nếu một ô không trống thì hãy thoát khỏi vòng lặp for
Nếu ThisWorkbook.Worksheets("Sheet1"). Cells (iRow, 1) <> "" sau
đó thoát cho
Kết thúc nếu
ThisWorkbook.Worksheets("Sheet1"). Ô (iRow, 1) = iRow
tiếp theo iRow

Kết thúc phụ

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()

Dim iRow As Long

' CHO VÒNG LẶP


' Ghi từ 1 đến 5 vào các ô từ A1 đến A5 bằng cách
dùng vòng lặp For Next For iRow = 1 To 5
ThisWorkbook.Worksheets("Sheet1"). Ô (iRow, 1) = iRow
tiếp theo iRow

' LÀM TRONG KHI VÒNG LẶP


' Viết từ 1 đến 5 vào các ô từ A1 đến A5 bằng cách sử dụng
vòng lặp Do While iRow = 1
Làm trong khi iRow < = 5 ThisWorkbook.Worksheets ("Sheet1"). Ô
(iRow, 1) = iRow iRow = iRow + 1
Vòng

lặp kết thúc

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()

Dim iRow As Long

' Viết từ 1 đến 5 vào các ô từ A1 đến A5 bằng cách sử dụng


vòng lặp Do While iRow = 1
Thực hiện trong khi ThisWorkbook.Worksheets("Sheet1"). Ô(iRow, 1)
<> "" ThisWorkbook.Worksheets("Sheet1"). Ô (iRow, 1) =
iRow iRow = iRow + 1
Vòng lặp

' 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) <>

"" Kết thúc phụ

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

Trong ví dụ trên, mã . Phạm vi ("A2") = 10 là điều kiện. Bạn đã thấy


những điều này trong phần Do While Loops. Bạn có thể tham gia các điều
kiện bằng cách sử dụng các toán tử Và / Hoặc.
Nếu Count = 10 và đếm <15 thì
. Phạm vi ("A1"). Font.Color =
rgbOrange Kết thúc nếu

Nếu Count = 10 hoặc Count = 11 thì


. Phạm vi ("A1"). Font.Color =
rgbBlue Kết thúc nếu

Bạn cũng có thể sử dụng một cái khác


Nếu đếm = 0 thì
. Phạm vi ("A1"). Font.Color = rgbRed
Khác
. Phạm vi ("A1"). Phông chữ.Màu = rgbBlack
Kết thúc nếu
Bạn có thể thêm các điều kiện khác bằng cách sử dụng ElseIf
Nếu đếm = 0 thì
. Phạm vi ("A1"). Font.Color = rgbRed
ElseIf Count = 1 Sau đó
. Phạm vi ("A1"). Font.Color =
rgbBlue ElseIf count >= 2 và count<= 4 thì
. Phạm vi ("A1"). Phông chữ.Màu = rgbGreen
Khác
. Phạm vi ("A1"). Phông chữ.Màu = rgbBlack
Kết thúc nếu
Câu lệnh Select là một cách khác để viết câu lệnh Else If. Sự khác biệt thực
sự duy nhất là đôi khi các câu lệnh If có thể quá phức tạp đối với một
trường hợp. Sự lựa chọn là tùy thuộc vào người dùng.
Chọn Số trường hợp

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()

Dim writeSheet As Worksheet


Đặt writeSheet = ThisWorkbook.Worksheets("sheet2")

Dim AppleCount As Long


AppleCount = ThisWorkbook.Worksheets("sheet2"). Phạm vi ("A1")

' Cập nhật ô dựa trên giá trị trong


A1 Nếu (AppleCount < 10) Sau đó
WriteSheet.Range ("B1") = "Số tiền thấp"
ElseIf (AppleCount < 20 và AppleCount > 10) thì
WriteSheet.Range ("B1") = "Số tiền trung bình"
Kết thúc nếu

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

nếu 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 End Sub

'Bạn có thể "Gọi" mã này bao nhiêu lần tùy thích


Public Sub WriteText()

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ụ

Công khai Sub SetCellFormat(myRange As Range)


myRange.Font.Color = rgbBlue
myRange.Interior.Color = rgbPink
myRange.NumberFormat = "€ 00,00"
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.

Sub công cộng DoFormattingFunc()


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ụ
Chức năng công cộng SetCellFormat(myRange As
Range) myRange.Font.Color = rgbBlue
myRange.Interior.Color = rgbPink
myRange.NumberFormat = "€ 00,00"
Chức năng kết thú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)

' Đặt "Smith" vào ô A1


Phạm vi ("A1") = Phải (Tên khách hàng, 5)

' Đặt "JOHN SMITH" vào ô A1 Phạm vi


("A1") = UCASE (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

1. The function returns a value


2. A function cannot be assigned to be a Macro
3. The function will appear in the Excel worksheet function list
Bạn chỉ nên sử dụng một hàm khi bạn muốn trả về một giá trị. Trong ví dụ
tiếp theo, chúng ta sử dụng hàm GetCost để tính tổng chi phí của quả.
Công khai Sub TotalFruit()
'Ví dụ về việc sử dụng Get Cost
Dim TotalFruit As Long
TotalFruit = GetCost (54,65,10)
Kết thúc phụ

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()

' Hàm: Trả về giá trị. Sử dụng dấu ngoặc


đơn Dim TotalFruit As Long
TotalFruit = GetCost (54,65,10)

'Chức năng: Không trả về giá trị. Không có dấu


ngoặc đơn GetCost2 54,65,10

' 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 kết thúc

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á

Chức năng kết thúc

Public Sub WriteCost(Apples As Long, Pears As Long, Price As long)

Thisworkbook.Worksheets("Sheet1"). Phạm vi ("A1") = (Táo + Lê) * Giá

Kết thúc phụ

Sau đây là hướng dẫn nhanh để gọi Functions và Subs


Thủ tục Về Dấu ngoặc đơn xung quanh các đối số
Kiểu Giá trị
Chức năng Có Có
Chức năng Không Không
Tiểu Không Không
Sử dụng hàm trang tính Excel
Nếu bạn sử dụng Excel thì bạn sẽ sử dụng các hàm trang tính mọi lúc. Tôi
đang đề cập đến Sum, Count, VLookup, v.v. Các chức năng này cũng có
sẵn cho VBA.
Ví dụ dưới đây sẽ đặt Tổng các ô A1:A5 vào ô A6. Đặt một số số trong
các ô từ A1 đến A5 để xem nó hoạt động. Các đối số giống như Excel.
Công cộng Sub WkFunction()

'Sử dụng chức năng trang tính


Với ThisWorkbook.Worksheets("Sheet1")
. Phạm vi ("A6") = WorksheetFunction.Count(. Phạm vi ("A1:
A5")) kết thúc bằng

Kết thúc phụ

Đố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

Tiểu mục công cộng WkFunctionLookup ()

'Sử dụng chức năng bảng tính VLookup


Với ThisWorkbook.Worksheets("Sheet1")
. Phạm vi ("A6") = WorksheetFunction.VLookup ("Lê", . Phạm vi ("C1: D4"), 2,
false) kết thúc bằng
Kết thúc phụ

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)

'nếu sổ làm việc mở ok thì hãy làm gì đó với nó Nếu


không myBook không là gì thì
'Làm mọi thứ với myBook tại đây
myBook.Worksheets ("Sheet1"). Phạm vi ("A1") = 5
Kết thúc nếu

'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

' Kiểm tra tập tin tồn tại


if (dir(sFilename) <> "") thì
'Nếu sổ làm việc đã được mở thì hãy thông báo
cho người dùng. Nếu IsWorkBookOpen
(sFilename) thì
MsgBox ("Sổ làm việc [" + sFilename + "] đã được người dùng mở [" +
Application.UserName _
+ "]. Vui lòng đóng tệp và chạy lại.") GoTo
Done
Kết thúc nếu
Đặt OpenWorkbook = Workbooks.Open(FileName:=sFilename, ReadOnly:=True)
Khá
c ' Tập tin không tồn tại
MsgBox ("Không thể tìm thấy sổ làm việc: " + sFilename + ".")
Kết thúc nếu

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)

Dim fileID As Long


Dim errNum As Long

' Mở tệp và kiểm tra lỗi trên


Error Resume Next
fileID = FreeFile()
Mở tên tệp cho khóa đầu vào Đọc dưới dạng
#fileID Đóng fileID

' Lưu trữ số lỗi và xóa lỗi errNum =


Err
Trên Lỗi GoTo 0

' 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

nếu 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.

Có hai loại lỗi thời gian chạy:


1. Thông báo lỗi khi chạy
2. Macro không làm những gì nó nên làm - Hành vi không chính xác

Thông báo lỗi


Bạn cũng có thể nói rằng Thông báo Lỗi là khi Macro không làm những gì
cần thiết. Tôi chia chúng thành hai loại vì có sự khác biệt.
Khi Thông báo Lỗi xuất hiện, Macro thường không thể tiếp tục. Chúng
thường xảy ra vì một tình huống mà bạn không mong đợi. Ví dụ: các ô
chứa văn bản thay vì giá trị.
Một thông báo lỗi trông tồi tệ hơn nhưng dễ sửa chữa hơn. Lý do là
Macro dừng lại trên dòng với vấn đề. Khi hộp thoại lỗi xuất hiện, nhấp
vào nút "Gỡ lỗi". Điều này sẽ đưa bạn đến dòng với vấn đề.
Hành vi không chính xác
Macro của bạn hoàn thành đúng cách nhưng có thể không làm những gì
cần thiết. Ví dụ: nó chỉ cập nhật 9 ô thay vì 10 hoặc một từ bị viết sai
chính tả. VBA không coi đây là một lỗi. Nó làm theo các hướng dẫn bạn
cung cấp cho nó. Nó không biết bạn có ý định cập nhật 10 ô thay vì 9.
Cách tìm và sửa lỗi thời gian chạy
Cả hai lỗi này đều được giải quyết theo cùng một cách. Bạn có một khởi
đầu thuận lợi với một thông báo lỗi như bạn biết dòng. Trên thực tế, lỗi
càng rõ ràng thì càng dễ tìm và sửa.
Để khắc phục các lỗi này, hãy áp dụng các bước sau:
Tái tạo lỗi
Điều này là cần thiết khi người khác tìm thấy lỗi. Bạn cần phải xem nó cho
chính mình để bạn sẽ biết khi nào bạn đã sửa nó. Đôi khi bạn nó không dễ
dàng để sinh sản và bạn phải tìm ra các bước gây ra. Trong trường hợp này,
hãy lấy càng nhiều thông tin càng tốt từ người nêu vấn đề.
Tìm lỗi
Phần thú vị nhất. Sử dụng các công cụ dưới đây để trợ giúp.
Sửa lỗi
Khi bạn biết những gì đang xảy ra trong mã, bạn thường sẽ thấy tại sao nó
sai.
Kiểm tra bản sửa lỗi
Chạy mã và kiểm tra bản sửa lỗi hoạt động chính xác. Bạn có thể phải làm
điều này nhiều lần.

Bộ công cụ điều tra lỗi


VBA có một số công cụ tuyệt vời để giúp tìm lỗi. Hãy tưởng tượng bạn phải
đọc qua các dòng mã để cố gắng phát hiện ra vấn đề. Nó sẽ rất tẻ nhạt. Các
công cụ sau đây cho phép bạn xem những gì đang xảy ra khi Macro đang
chạy.
Điểm ngắt
Chúng được sử dụng để tạm dừng Macro trên một dòng mã. Điều này rất
hữu ích vì bạn có thể kiểm tra trạng thái hiện tại của biến. Chọn dòng mà
bạn muốn Macro tạm dừng. Sử dụng F9 để bật hoặc tắt điểm ngắt. Bạn có
thể có bao nhiêu tùy thích. Lưu ý: Bạn không thể sử dụng chúng trên các
dòng trống hoặc dòng có Dim. Khi mã bị tạm dừng, bạn có thể sử dụng các
mục sau.
Cửa sổ người dân địa phương
Chọn từ menu: View->Locals Window. Điều này hiển thị danh sách các biến
cục bộ và giá trị hiện tại của chúng. Điều này rất hữu ích. Hầu hết các lỗi là
kết quả của các giá trị không chính xác. Ví dụ: bạn có thể có hàng hoặc cột
không chính xác cho một ô.
Cửa sổ đồng hồ
Chọn từ menu: View->Watch Window. Điều này tương tự như cửa sổ
Locals ngoại trừ bạn có thể thêm biểu thức của riêng mình. Đây là một
công cụ rất hữu ích. Bạn có thể làm những việc như đánh giá một cuộc gọi
hàm. Cách dễ nhất để thêm đồng hồ là nhấp chuột phải vào một mục trong
mã. Chọn "Thêm đồng hồ" và nhấp vào ok. Nếu bạn có hai biến x và y, bạn
có thể thêm một chiếc đồng hồ như (x + y) * 2 và Cửa sổ đồng hồ sẽ đánh
giá nó cho bạn.
Bước qua
Thao tác này sẽ chuyển sang dòng mã tiếp theo của bạn từ nơi bạn hiện đang
tạm dừng. Nếu dòng hiện tại là ok thì bạn có thể muốn dòng tiếp theo và
xem các giá trị thay đổi như thế nào. Điều này có sẵn trên Menu gỡ lỗi (shift
+ F8).
Bước vào
Điều này khác với "Bước qua" chỉ theo một cách. Nếu dòng là một lệnh
gọi Function/Sub thì nó sẽ di chuyển đến dòng đầu tiên của Function/Sub
đó. Điều này có sẵn trên Menu gỡ lỗi (F8).
Khám Phá
Không được sử dụng nhiều nhưng có thể hữu ích. Nó làm ngược lại với
"Step Into". Nó di chuyển bạn từ bất kỳ dòng nào trong Sub/Function hiện
tại sang Sub/Function của người gọi. Điều này có sẵn trên Menu gỡ lỗi (Ctrl
+ Shift + F8).
Tiếp tục
Thao tác này sẽ chạy Macro của bạn cho đến khi kết thúc hoặc gặp một
điểm ngắt khác. Để sử dụng, chọn Debug->Continue(F5) từ menu.
Reset
Nếu bạn muốn ngăn mã chạy khi bị tạm dừng, hãy chọn Run->Reset
từ menu.
Thực hành sử dụng các công cụ này trên một Macro nhỏ. Chúng tôi bạn
thấy chúng hoạt động, bạn sẽ nhận ra chúng hữu ích như thế nào. Sử dụng
các công cụ này cũng có thể giúp bạn xem cách mã của bạn hoạt động.
Hướng dẫn bắt đầu săn lỗi của bạn
Sau đây là danh sách các hướng dẫn bạn có thể thấy hữu ích khi sử dụng các
công cụ này. Mỗi lỗi là khác nhau, vì vậy bạn có thể sẽ sử dụng một số biến
thể của chúng.
1. Đặt điểm ngắt khi bắt đầu quy trình với lỗi
2. Kiểm tra các giá trị trong cửa sổ Watch/Locals
3. Bước qua từng dòng mã xem các giá trị
4. Kiểm tra sổ làm việc để xem lỗi đã xảy ra chưa.
5. Tiếp tục bước qua mã cho đến khi lỗi xuất hiện.
6. Bạn có thể cần phải chạy một vài lần để tìm lỗi.
Một số lời khuyên cuối cùng
1. Tìm lỗi không phải là vấn đề khi bạn bắt đầu sử dụng VBA. Nếu Macro
của bạn chỉ có 2 dòng thì sẽ khá đơn giản để xác định vị trí dòng có vấn
đề.
2. Khi một vấn đề xảy ra, hãy tự hỏi "Tôi nghĩ điều gì đã gây ra vấn đề
này?" Sau đó đi đến dòng đó. Đôi khi bạn sẽ đúng và điều này sẽ giúp
bạn tiết kiệm thời gian. Ngay cả khi bạn sai, nó vẫn cho bạn một ý
tưởng về những gì bạn đang tìm kiếm.
3. Hãy nhớ rằng, giống như Điều tra hiện trường vụ án, việc tìm ra lỗi là
thu thập thông tin. Mỗi bit thông tin bạn thu thập mang lại cho bạn một
bước gần hơn để tìm ra vấn đề.
Bước 13: Bộ sưu tập và mảng - Hướng dẫn về
các nhóm mục
"Tôi tin rằng mọi người đều sưu tầm. Tôi nghĩ rằng thu thập là trong máu
của chúng ta như con người. " - Lynda Resnick
Bộ sưu tập là một phần quan trọng của VBA. Hầu hết mọi người bị trì hoãn
vì chúng có vẻ phức tạp. Trong thực tế, chúng rất dễ sử dụng. Sau đây là
danh sách những điều bạn có thể làm với một bộ sưu tập
1. Thêm mục
2. Xóa một mục
3. Nhận giá trị của một mặt hàng
4. Nhận số lượng vật phẩm trong bộ sưu tập
Bộ sưu tập là một danh sách các mặt hàng tương tự. Ví dụ: danh sách các
quốc gia hoặc tổng số hàng ngày. Trong ví dụ sau, chúng tôi làm như sau:
1. Tạo bộ sưu tập bằng Dim and New
2. Thêm mục
3. In tất cả các mục trong bộ sưu tập

Công khai Sub CreateColl()

'Sử dụng mới khi tạo Dim


col As New Collection

' Thêm mục col.


Thêm col
"Apple". Thêm
col "Lê" Thêm
"Đào"

' 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

i Kết thúc Sub

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

' Thêm Orange làm mục thứ hai trong bộ sưu


tập Col.Add "Orange", Sau: = 1

Một kịch bản thu thập điển hình


Bạn có thể đang tự hỏi tại sao bạn cần bộ sưu tập và đó là một câu hỏi hay.
Sau đây là một kịch bản điển hình. Bạn có nhiệm vụ tìm tất cả Khách hàng
trong một trang tính đến từ Hoa Kỳ.
Bạn có thể đọc qua tờ một lần và đặt những khách hàng đủ điều kiện vào
một bộ sưu tập. Nếu bạn không sử dụng bộ sưu tập, bạn sẽ cần đọc qua 5000
khách hàng mỗi khi bạn cần tìm những khách hàng từ Hoa Kỳ
Bộ sưu tập cũng hữu ích nếu bạn đọc các giá trị từ tệp hoặc cơ sở dữ liệu.
Các giá trị từ các nguồn này có xu hướng là danh sách các mục và do đó
một bộ sưu tập sẽ hoàn hảo cho công việc.
Khi bạn có các mục trong bộ sưu tập, chỉ mất một vài dòng mã để ghi các
mục vào tệp, trang tính, v.v.
Ví dụ sau đây cho thấy một ví dụ về kịch bản khách hàng mà chúng tôi đã đề
cập ở trên
Công khai Sub CreateCollCustomers()

'Sử dụng mới khi tạo


Dim collCountries như bộ sưu tập mới

Trang tính mĐọc dưới dạng trang tính


Đặt sheetRead = ThisWorkbook.Worksheets("Khách hàng")

Dim iRow As Long


'Đọc qua tất cả các quận Đối với
iRow = 1 đến 5000
' Giá trị trong cột 2 là quốc gia của khách hàng
Nếu sheetRead.Cells(iRow,2) ="Hoa Kỳ" thì '
Thêm khách hàng
collCountries.Add sheetRead.Cells (iRow,1)
Kết thúc nếu
iRow tiếp theo

'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

i Kết thúc Sub


Bạn đã thấy các bộ sưu tập trước đó trong cuốn sách. Ghi nhớ dòng
Sổ làm việc này. Trang tính("Trang tính1")

Ở đâ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

theo i Kết thúc

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

theo i Kết thúc

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

G) ' CHO MỖI


' Xem qua từng trang tính trong bộ sưu tập trang tính
Dim sheet As variant
Đối với mỗi trang tính Trong trang tính
ThisWorkbook.Worksheets Debug.Print. Tên
Tờ tiếp theo

' CHO TIẾP THEO


'Tương tự như về việc sử dụng For
Loop Dim i As Long
Đối với i = 1 đến Workbooks.Count
Debug.Print Workbooks (i). Tên
Kế tiếp i

Kết thúc phụ

Ví dụ tiếp theo ghi tên trang tính của mỗi trang tính vào ô A1
Public Sub UseSheet()

' Viết tên trang tính thành A1 trong mỗi tờ


Dim sheet As Variant
Đối với mỗi trang tính Trong trang tính
ThisWorkbook.Worksheets. Phạm vi ("A1") = tờ.
Tên
Trang tính

tiếp theo Kết thúc phụ


Hướng dẫn nhanh về bộ sưu tập
Bảng sau đây cung cấp hướng dẫn nhanh về Bộ sưu tập
Nhiệm vụ Ví dụ
Thêm mục Coll. Thêm "Apple"
Chỉ định một bộ sưu tập Đặt coll1 = coll2
cho
nữa
Dọn dẹp khi hoàn thành Đặt coll = Không có gì
Tạo bộ sưu tập Dim coll như bộ sưu tập mới
Nhận hàng Trái cây = coll (1) Hoặc
Trái cây = coll ("Táo")
Nhận số lượng mặt hàng Coll. Đếm
Đọc qua bộ sưu tập Dim i As Long
Cho i = 1 để coll. Đếm
Sử dụng coll (i)

HOẶC

Dim var như biến


thể cho mỗi var
trong coll sử dụng
var
Loại bỏ một mục Coll. Xóa(1)

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()

' Tạo biến cho 3 học sinh Dim


Student1 As Long
Dim Student2 As Long
Dim Student3 As Long

' Đặt các giá trị vào mỗi biến


Student1 = 5000
Học sinh2 = 6056
Học sinh3 = 9078

' 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

Kết thúc phụ


Public Sub UseArrays()

' Tạo mảng sinh viên


Dim StudentMarks (3) Miễn là

' Đặt các giá trị ở vị trí 0,1 và 2 của mảng


StudentMarks (0) = 3
StudentMarks (1) = 9
StudentMarks (2) = 6

' 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

Kết thúc phụ

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.

Học sinh mờ(100) Miễn là

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()

' Tạo mảng điểm học sinh


Dim StudentMarks As Long

' Đọc 26 giá trị vào mảng từ sheet1


StudentMarks = ThisWorkbook.Worksheets("Sheet1"). Phạm vi ("A1: Z1"). Giá trị

' Ghi 26 giá trị vào hàng thứ ba của sheet2 ThisWorkbook.Worksheets("Sheet2"). Phạm vi ("A3:
Z3"). Giá trị = StudentMarks

Kết thúc phụ


Bạn thường muốn làm một cái gì đó với các giá trị trong mảng. Ví dụ sau
mỗi dấu bằng 3.
Public Sub UseArrays3()

' Tạo mảng cho 3 học sinh Dim


StudentMarks (3) As Long

' Đặ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

Kết thúc phụ

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.

Public Sub DoStuffHasError

() ' Mã của bạn đây...


Về lỗi GoTo ErrorHandler

Dim Total1 As long, Total2 As Long


' Chia cho zero error – code sẽ vào phần ErrorHandler Total1
= 6/0
' mã tiếp tục ở đây sau lỗi
Total2 = 5

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

Hai điểm quan trọng về xử lý lỗi


Bạn sẽ không phải lúc nào cũng biết trước cách xử lý lỗi. Đây là lúc thử
nghiệm xuất hiện. Khi bạn sửa lỗi, bạn nên suy nghĩ về cách mã có thể xử
lý lỗi vào lần tiếp theo.
Mã trong phần ErrorHandler có thể được đặt trong Sub để bạn không phải
viết nó nhiều lần.
Kết thúc
Xử lý lỗi không bắt buộc khi bạn bắt đầu sử dụng VBA hoặc nếu bạn là
người duy nhất sử dụng mã. Nếu bạn cung cấp Macro của mình cho một
nhóm người dùng thì bạn có thể cần phải có mã xử lý lỗi. Nếu bạn đang
cung cấp một giải pháp chuyên nghiệp bằng cách sử dụng Macro thì việc
xử lý lỗi là điều bắt buộc.
Cách thực hiện bất kỳ tác vụ Excel nào trong
VBA
Có một câu hỏi tôi nhận được rất nhiều từ những người mới làm quen với
Macro. Làm thế nào để bạn tìm ra cách thực hiện một tác vụ Excel bằng
cách sử dụng Excel Macro? Ví dụ: nếu bạn muốn đặt nền của một ô thành
màu xanh lam, làm thế nào để bạn tìm lệnh VBA để làm điều đó? Có 3
cách chính
1. Trợ giúp VBA
Nói một cách độc đáo, sự trợ giúp trong VBA là thiếu. Tuy nhiên, nó vẫn có
thông tin hữu ích và đối với một số chủ đề có thể hữu ích. Nếu bạn chọn một
từ khóa trong mã của mình và nhấn F1 thì thông tin về chủ đề đó sẽ xuất
hiện trong cửa sổ Trợ giúp. Bạn cũng có thể chọn từ Trợ giúp trên menu.
2. Ghi macro
Trên tab nhà phát triển, bạn có thể ghi lại Macro trong phần mã. Làm thế
nào điều này hoạt động như sau. Bạn chọn "Ghi Macro" và sau đó đặt thủ
công nền của một ô thành màu xanh lam như trong ví dụ trên của chúng
tôi. Sau đó, bạn dừng Macro và Excel sẽ tạo Macro với mã để thực hiện tác
vụ này. Sau đó, bạn có thể lấy mã bạn yêu cầu từ macro này.
Bạn có thể nghĩ tại sao phải học VBA khi tôi chỉ có thể ghi lại Macro? Các
Macro được tạo bởi máy ghi âm không hiệu quả lắm và hiếm khi bạn có
thể sử dụng chúng cho Macro trong thế giới thực. Tuy nhiên, chúng rất hữu
ích khi bạn muốn tìm ra lệnh nào sẽ sử dụng trong VBA cho một tác vụ cụ
thể.
3. Google
Nếu bạn không thể tìm thấy những gì bạn đang tìm kiếm thì bằng mọi cách
hãy thử Google. Khó khăn ở đây là trong khi một Macro có thể tương tự
như của bạn, nó sẽ không bao giờ giống hệt nhau. Đó là lý do tại sao điều
quan trọng là phải hiểu các nguyên tắc cơ bản cơ bản của VBA. Sau đó,
bạn sẽ có thể lấy các phần có liên quan của mã mẫu và điều chỉnh chúng
cho riêng bạn.
Phần thưởng thứ nhất: Từ điển - Bộ sưu tập cao
cấp
Từ điển trong VBA tương tự như Bộ sưu tập. Tuy nhiên, nó có một số công
dụng chính. Nó có thể được sử dụng để dễ dàng loại bỏ các bản sao khỏi
danh sách các mục. Sự khác biệt chính giữa Từ điển và Bộ sưu tập là một
giá trị được lưu trữ trong Từ điển dưới dạng cặp Khóa / Giá trị và do đó
bạn có thể truy cập mục Từ điển trực tiếp bằng khóa. Điều này có nghĩa là
bạn không phải chạy qua các mục để tìm mục bạn muốn.
Điều này tương tự như cách bạn truy cập từ điển thế giới thực. Bạn đi trực
tiếp đến từ bạn đang tìm kiếm. Bạn không đọc qua từng từ trong từ điển
ngay từ đầu. Vì vậy, trong một từ điển thế giới thực, từ là chìa khóa và định
nghĩa là giá trị.
Một ví dụ thứ hai là một danh bạ điện thoại (nhớ những điều đó?). Trong
trường hợp này, tên của người đó là chìa khóa và Số điện thoại là giá trị.
Để đưa ra một ví dụ. Hãy tưởng tượng bạn đang lưu trữ dữ liệu cho ai đó
bán trái cây. Trong ví dụ này, bạn sẽ lưu trữ trái cây và số lượng miếng bạn
có của mỗi loại. Bạn có thể lưu trữ nó như sau bằng cách sử dụng Từ điển
VBA:
Từ khóa: Apple
Giá trị: 45

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()

' Khai báo và tạo Dim


dict As Object
Đặt dict = CreateObject ("Scripting.Dictionary")

' Thêm khóa và giá trị dict


("Apple") = 45
dict("Lê") = 22
dict("Màu cam") = 25

' Nhận giá trị bằng cách sử


dụng khóa Debug.Print dict
("Lê") Debug.Print dict
("Orange")

Đặt dict = Nothing

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ị.

Bạn có thể thấy từ đó Từ điển có những ưu điểm lớn:

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()

' Khai báo và tạo Dim


dict As Object
Đặt dict = CreateObject ("Scripting.Dictionary")

'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

' In ra các phím Dim


key As Variant
Đối với mỗi phím Trong dict.keys
Debug.Print key, dict (key)
Sau

'Dọn dẹp
Đặt dict = Nothing

End Sub

Đầu ra của mã này là:


Táo 12 ·
Lê 1
Màu cam 1

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.

4. Bất cứ nơi nào bạn thấy mã như ThisWorkbooks.Worksheets ("Sheet1"),


bạn có thể thay thế nó bằng tên mã của trang tính, ví dụ: Sheet1

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.

Câu hỏi? Ý kiến?


Giúp làm cho ấn bản tiếp theo của cuốn sách này thậm chí còn tốt hơn.
Nếu bạn có câu hỏi về mã hoặc khái niệm hoặc bạn có ý tưởng làm thế nào
cuốn sách có thể tốt hơn thì vui lòng cho tôi biết. Gửi email cho tôi tại:
PaulKellyKK@gmail.com

You might also like