Professional Documents
Culture Documents
Excel VBA
Excel VBA
(.).
Các đối tượng VBA được tổ chức trong một hệ thống phân cấp. Ở đầu phân cấp này là đối tượng
Application. Tất cả các đối tượng trong Excel là các member (thành viên) hoặc sub-member
(thành viên con) của đối tượng Application.
Ví dụ: dưới đây là một dòng code hoàn chỉnh để gán giá trị 100 cho file “Book1.xlsx”, sheet
“Sheet1”, range “A1”.
Application.Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1").Value = 100
Dấu chấm (.) từ cho phép chúng ta tham chiếu (gọi) các thành viên của hệ thống phân cấp từ trên
xuống dưới. Vì vậy, application là cấp cao nhất của hệ thống phân cấp, và Workbook là một thành
viên của application. Thuộc tính Workbooks() trả về một tập hợp tất cả các bảng tính đang mở
trên máy tính.
Chỉ định tên Workbook thao tác là: “Book1.xlsx”
Application.Workbooks("Book1.xlsx")
Worksheets là một thành viên của đối tượng Workbook. Thuộc tính Worksheets() trả về một tập
hợp tất cả các sheet của đối tượng Workbook đang được active.
Application.Workbooks("Book1.xlsx").Worksheets("Sheet1")
Cuối cùng để trỏ đến Range “A1” của sheet “Sheet1” và gán bằng 100 như sau:
Application.Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1").Value = 100
Chúng ta sẽ tìm hiểu về các thành viên của các đối tượng trong hệ thống các đối tượng trong
Excel VBA trong những bài học tiếp theo.
Đối tượng application trong Excel VBA là đối tượng được sử dụng thường xuyên nhất khi
thực hiện bất kỳ tác vụ nào với VBA.
Dưới đây là các phương thức và thuộc tính được sử dụng nhiều nhất của đối tượng
Application. Để bạn có thể nhanh chóng tìm ra giải pháp, cú pháp bất cứ khi nào bạn cần sử
dùng nó.
Phương thức Mô tả
Cú pháp:
view source
print?
Application.FindFile
Ví dụ:
view source
print?
Sub Demo_FindFile()
Application.FindFile
End Sub
Cú pháp:
view source
print?
Trong đó:
Reference: Nó chỉ định đích đến.
Scroll: Đây là tham số tùy chọn. Nó có giá trị Boolean hoặc True hay False. Nếu giá trị là true
thì nó sẽ di chuyển thanh cuộn đến vị trí chỉ đích. Nếu đó là false thì nó sẽ không di chuyển
thanh cuộn.
Ví dụ: thủ tục sau sẽ chọn cell “A250” của worksheet có tên “Sheet1”. Thuộc tính Scroll:=True
của câu lệnh sau sẽ cuộn tới vị trí cell “A250”.
view source
print?
Sub Demo_Goto()
Application.Goto Reference:=Worksheets("Sheet1").Range("A250"),
Scroll:=True
End Sub
Cú pháp:
view source
print?
Trong đó:
Macro: Nó chỉ định macro để run.
Arg1 to Arg30: Đây là tham số tùy chọn. Nó được sử dụng để truyền các tham số cho function.
Ví dụ sau run một thủ tục macro có tên “MyMacro” của workbook có tên “Workbook1.xls”.
view source
print?
Sub Demo_Run()
Application.Run "'Workbook1.xls'!MyMacro"
End Sub
Cú pháp:
view source
print?
Application.Wait(Time)
Trong đó:
Time: Đây là một tham số được yêu cầu. Nó chỉ định thời gian bạn muốn tiếp tục macro.
view source
print?
Sub Demo_Wait1()
Application.Wait "16:00:00"
End Sub
view source
print?
Sub Demo_Wait2()
End Sub
Ví dụ 1: không hiển thị bất kỳ cảnh báo nào trong khi đóng workbook đang hoạt động.
view source
print?
Sub Display_Alert_Example1()
Application.DisplayAlerts = False
ActiveWorkbook.Close
Application.DisplayAlerts = True
End Sub
Ví dụ 2: Hiển thị cảnh báo trong khi đóng workbook đang hoạt động.
view source
print?
Sub Display_Alert_Example1()
ActiveWorkbook.Close
End Sub
Thuộc tính Path
Thuộc tính Path của Application trong VBA được sử dụng để lấy giá trị tuyệt đối của ứng
dụng.
Ví dụ 1: hiển thị đường dẫn tuyệt đối của thư mục chứa ứng dụng excel.
view source
print?
Sub Path_Example1()
End Sub
Kết quả:
view source
print?
Sub Path_Example1()
End Sub
Kết quả:
view source
print?
Sub Path_Example2()
Kết quả:
Ví dụ 1: Trong ví dụ sau, nó sẽ hiển thị số từ 1 đến 100 trong cột đầu tiên của Sheet1. Chúng
ta có thể quan sát màn hình đang cập nhật trong khi cập nhật Sheet1.
view source
print?
Sub ScreenUpdating_Example1()
Dim i As Integer
For i = 1 To 100
Sheets("Sheet1").Cells(i, 1) = i
Next
End Sub
Ví dụ 2: Trong ví dụ sau, nó sẽ hiển thị số từ 1 đến 100 trong cột đầu tiên của Sheet1. Chúng
ta không thể quan sát màn hình đang cập nhật trong khi cập nhật Sheet1.
view source
print?
Sub ScreenUpdating_Example1()
Application.ScreenUpdating = False
Dim i As Integer
For i = 1 To 100
Sheets("Sheet1").Cells(i, 1) = i
Next
Application.ScreenUpdating = True
End Sub
Đối tượng Workbook trong Excel VBA là một trong những đối tượng được sử dụng thường
xuyên nhất trong khi tự động hóa bất kỳ tác vụ nào với VBA. Bài này cung cấp các phương
thức hay sử dụng của đối tượng Workbook.
Mỗi đối tượng Workbook tương ứng với một file excel.
Các phương thức của Workbook giúp chúng ta thực hiện các hành động khác nhau với Excel
Workbooks. Ví dụ, chúng ta có thể Kích hoạt một Workbook và Xóa một Workbook hoặc Move
Workbook. Và chúng ta cũng có thể Protect và UnProtect Workbooks.
Phương thức Mô tả
Tại sao chúng ta cần phải kích hoạt một Workbook bằng VBA?
Khi chúng ta phải xử lý nhiều workbooks (nhiều file excel) và bạn muốn đọc hoặc ghi vào
một Workbook cụ thể thì bạn phải kích hoạt Workbook đó.
Sub ActiveWorkbookExample1()
Application.Workbooks("myFile.xlsx").Activate
End Sub
Sub ActiveWorkbookExample2()
Set wb = Application.Workbooks(2).Activate
End Sub
Ví dụ 3: Activate Workbook trong VBA với ThisWorkbook
Sử dụng ThisWorkbook bạn có thể activate Workbook chứa macro đang chạy như sau:
view source
print?
Sub ActiveWorkbookExample3()
ThisWorkbook.Activate
End Sub
Note: với Workbook đang được activate, tức là Workbook mà đang được chọn. Khi đó mọi thao tác
đọc và ghi từ macro sẽ ảnh hưởng trực tiếp đến nó.
Tạo biến tham chiếu đến Workbook
Vấn đề: Khi bạn phải làm việc với nhiều workbooks (nhiều file excel), mỗi Workbook có nhiều
Worksheet. Bạn phải sử dụng phương thức Activate với hết Workbook này đến Workshet khác
để đọc hoặc ghi dữ liệu từ chúng, điều này có thể dẫn đến mã rối rắm, khó hiểu khiến bạn lúng
túng.
Ví dụ:
view source
print?
view source
print?
Set wb = Application.ThisWorkbook
Set wb = Application.ActiveWorkbook
Set wb = Application.Workbooks.Open("D:\test\myFile.xlsx",
ReadOnly:=True)
' 4. khởi tạo bằng cách sử dụng tên của một Workbook
Set wb = Application.Workbooks("myFile.xlsx")
' 5. khởi tạo bằng cách sử dụng chỉ số của một Workbook
Set wb = Application.Workbooks(2)
Set wb = Workbooks.Add
Sub CloseWorkbookExample()
Dim wb As Workbook
Set wb = Workbooks.Open("D:\myFile.xlsx")
wb.Close Savechanges:=True
End Sub
Trong ví dụ trên, chúng ta tạo ra một biến có tên là wb trong câu lệnh đầu tiên. Chúng ta đã sử
dụng phương thức ‘Open’ của workbook object để mở một bảng tính có tên là “D:\myFile.xlsx”
và sau đó gán nó cho đối tượng wb trong câu lệnh thứ hai. Cuối cùng trong câu lệnh thứ ba,
chúng ta đã sử dụng phương thức ‘Close’ của đối tượng workbook để đóng lại trên bảng tính
đã xác định. Cuối cùng chúng ta đã đề cập đến ‘Savechanges: = True’, có nghĩa là nếu chúng
ta đã thực hiện bất kỳ thay đổi trong bảng tính thì nó sẽ lưu các thay đổi.
Sub CloseWorkbookExample2()
Workbooks("D:\myFile.xlsx").Close Savechanges:=False
End Sub
ActiveWorkbook.Close Savechanges:=False
End Sub
Ví dụ trên đóng bẳng tính đang được chọn và không lưu lại những gì thay đổi.
Cú pháp:
view source
print?
Workbooks(“Workbook Name”).Save
Sub SaveWorkbookExample1()
Dim wb As Workbook
Set wb = Workbooks.Add
wb.Save
End Sub
Trong ví dụ trên, chúng ta đã tạo ra biến có tên wb trong câu lệnh đầu tiên. Chúng ta đã sử
dụng phương thức ‘Add’ của đối tượng Workbook để tạo ra bảng tính mới và sau đó gán nó
cho đối tượng wb trong câu lệnh thứ hai. Cuối cùng trong câu lệnh thứ ba, chúng ta đã sử
dụng phương thức ‘Save’ của đối tượng Workbook để lưu lại bảng tính vừa tạo.
Câu hỏi: Trong ví dụ trên, bảng tính trên đã được tạo ra và lưu ở đâu?
Trả lời: Trong ví dụ trên bảng tính trên đã được lưu tại thư mục Documents.
Ví dụ 1: Save Workbook hiện tại (đang được kích hoạt)
view source
print?
Sub SaveWorkbookExample1()
ActiveWorkbook.Save
End Sub
Trong ví dụ trên mọi thay đổi của Workbook đang được kích hoạt sẽ được lưu lại.
Note: Đối tượng ActiveWorkbook đại diện cho bảng tính hiện tại mà đang kích hoạt.
Phương thức SaveAs
Chúng ta có thể lưu bảng tính bằng cách sử dụng phương thức ‘SaveAs’ của đối tượng
Workbook trong Excel VBA.
Cú pháp:
view source
print?
Sub SaveAsWorkbookExample()
Dim wb As Workbook
Set wb = Workbooks.Add
wb.SaveAs Filename:="D:\test\Sample.xlsx"
End Sub
Trong ví dụ trên, chúng ta đã tạo ra biến có tên wb trong câu lệnh đầu tiên. Chúng ta đã sử
dụng phương thức ‘Add’ của đối tượng Workbook để thêm bảng tính mới và sau đó gán nó
cho đối tượng wb trong câu lệnh thứ hai. Cuối cùng trong câu lệnh thứ ba chúng ta đã sử dụng
phương thức ‘SaveAs’ của đối tượng Workbook để lưu bảng tính ở vị trí khác và tên file là
“D:\test\Sample.xlsx” (Bạn có thể thay đổi tên tập tin theo ý muốn của bạn).
Cú pháp:
view source
print?
Workbooks(“Workbook Name”).SaveCopyAs([Filename])
Sub WorkbookSaveCopyAsExample()
End Sub
Đối tượng Worksheet trong Excel VBA là một trong những đối tượng được sử dụng thường
xuyên nhất trong khi tự động hoá các tác vụ với VBA.
Đối tượng Worksheet đại diện cho các sheet trong Workbook, tức là mỗi Workbook chứa một
hoặc nhiều Worksheet.
Phương thức Mô tả
Tại sao chúng ta cần phải kích hoạt một Worksheet bằng VBA?
Khi chúng ta phải xử lý nhiều Worksheet (sheet trong một Workbook) và bạn muốn đọc hoặc
ghi vào một Worksheet (sheet) cụ thể thì bạn phải kích hoạt Worksheet đó.
Cú pháp:
view source
print?
Worksheets(“Worksheet Name”).Activate
' Or
Worksheets(“Worksheet Index”).Activate
Áp dụng cú pháp trên bạn sẽ kích hoạt được đối tượng Worksheet cụ thể của một Workbook
đang được kích hoạt.
Sub ActiveWorksheetExample1()
Worksheets("data").Activate
'Or
Sheets("data").Activate
End Sub
Sub ActiveWorksheetExample1()
Worksheets(2).Activate
'Or
Sheets(2).Activate
End Sub
Ví dụ:
view source
print?
Sub vidu3()
Dim wb As Workbook
' khai báo đối tượng ws
Set wb = Application.ActiveWorkbook
End Sub
Cú pháp:
view source
print?
Sub CopySheet_Beginning1()
Worksheets("Sheet3").Copy Before:=Worksheets(1)
End Sub
Ví dụ trên, chúng ta sao chép worksheet đang hoạt động đến vị trí đầu tiên trong cùng
Workbook.
view source
print?
Sub CopySheet_Beginning2()
ActiveSheet.Copy Before:=Worksheets(1)
End Sub
view source
print?
Sub CopySheet_Ending1()
Worksheets("Sheet3").Copy After:=Worksheets(Worksheets.Count)
End Sub
Ví dụ trên, chúng ta sao chép worksheet đang hoạt động đến vị trí cuối cùng trong cùng
Workbook.
view source
print?
Sub CopySheet_Ending2()
ActiveSheet.Copy After:=Worksheets(Worksheets.Count)
End Sub
Phương thức Delete
Phương thức Delete của đối tượng Worksheet trong VBA được sử dụng để xóa sheet khỏi
Workbook (file Excel). Khi bạn gọi phương thức Delete để xóa một sheet, nó sẽ hiển thị hộp
thoại nhắc người dùng xác nhận việc xóa theo mặc định. Nếu bạn click vào nút Delete trên
hộp thoại thì nó sẽ xóa sheet. Nó trả về giá trị Boolean. Điều đó có nghĩa là hộp thoại sẽ xuất
hiện với hai tùy chọn. Đó là Cancel (False) hoặc Delete (True).
Cú pháp:
view source
print?
Worksheets(“Sheet Name”).Delete
view source
print?
Sub DeleteSheetExample1()
Sheets("Sheet2").Delete
' or
Sheet2.Delete
End Sub
Ví dụ trên, sẽ hiển thị hộp thoại Excel và thông báo xác nhận tới người dùng để xóa “Sheet2”.
Sub DeleteSheetExample1()
ActiveSheet.Delete
End Sub
Ví dụ trên, chúng ta thực hiện xóa đối tượng Worksheet đang hoạt động từ một Workbook
bằng cách sử dụng phương thức Delete của đối tượng Worksheet.
Sub DeleteSheetExample1()
Application.DisplayAlerts = False
Sheets("Sheet2").Delete
Application.DisplayAlerts = True
End Sub
Đối tượng Range trong Excel VBA là một trong những đối tượng được sử dụng nhiều nhất
trong khi tự động hóa bất kỳ tác vụ nào với VBA. Chúng ta tham chiếu đến các Range khác
nhau trong một Worksheet và thực hiện các hoạt động khác nhau trên Range trong Excel.
Chúng ta có các thuộc tính và các phương thức khác nhau để xử lý các đối tượng Range
trong Excel.
Đối tượng Range là đại diện của một cell (hoặc cells) trên Worksheet, là đối tượng quan trọng
nhất của Excel VBA.
view source
print?
Range("B3").Value = 2
Kết quả:
Ví dụ 2: đặt một nút lệnh trên Worksheet và thêm dòng code sau:
view source
print?
Range("A1:A4").Value = 5
Kết quả:
Ví dụ 3: đặt một nút lệnh trên Worksheet và thêm dòng code sau:
view source
print?
Cells(3, 2).Value = 2
Kết quả:
Ví dụ 4: đặt một nút lệnh trên Worksheet và thêm dòng code sau:
view source
print?
Kết quả:
view source
print?
rangeObj .Value = 8
Kết quả:
Các phương thức của đối tượng Range
Dưới đây là các phương thức được sử dụng thường xuyên của đối tượng Range trong VBA:
Phương thức Mô tả
Clear Để xóa một Excel Range hoàn toàn bao gồm các định dạng và dữ liệu
ClearComments Để chỉ xóa các bình luận trong Excel Range cụ thể
ClearContents Để chỉ xóa nội dung/dữ liệu trong một Excel Range
ClearFormats Để chỉ xóa các định dạng của một Excel Range
ClearHyperlinks Để chỉ xóa các siêu liên kết trong một Excel Range
Copy Để sao chép một Excel Range đến một vị trí khác
CopyFromRecordset Sao chép dữ liệu từ recordset và dán vào một Excel Range
Cut Cắt Excel Range trong Worksheeet
ListNames Để liệt kê các Excel Range được đặt tên trong bảng tính
PasteSpecial Để dán dữ liệu với các tiêu chí khác nhau, như các giá trị, các định
dạng có hoạt động toán học hoặc chuyển đổi
Ví dụ:
view source
print?
rangeObj.Select
Kết quả:
Lưu ý: Để chọn các ô trên một Worksheet khác, bạn phải kích hoạt Worksheet này trước. Ví dụ, các
dòng code sau đây chọn ô B7 trên Worksheet thứ ba từ bên trái.
view source
print?
Worksheets(3).Activate
Worksheets(3).Range("B7").Select
Ví dụ:
view source
print?
Range("A1:A2").Select
Selection.Copy
Range("C3").Select
ActiveSheet.Paste
Kết quả:
Mặc dù phương thức Copy/Paste được cho phép sử dụng trong Excel VBA, nhưng tốt hơn là
bạn sử dụng dòng code dưới đây thay vì đoạn code trên.
view source
print?
Range("C3:C4").Value = Range("A1:A2").Value
ActiveSheet.Paste
Ví dụ:
view source
print?
Range("A1").ClearContents
view source
print?
Range("A1").Value = ""
Ví dụ:
view source
print?
Range("A1").Formula = "=Sum(B1:B5)"
Phương thức Mô tả
Rows Thuộc tính Rows cho phép truy cập vào một hàng cụ thể của range.
Columns Thuộc tính Columns cho phép truy cập vào một cột cụ thể trong một
range.
Ví dụ:
view source
print?
rangeObj.Rows(3).Select
Kết quả:
Ví dụ:
view source
print?
rangeObj.Columns(2).Select
Kết quả:
Thuộc tính Count
Thuộc tính Count được sử dụng để đếm số ô, hàng và cột của range.
Ví dụ 1:
view source
print?
MsgBox rangeObj.Count
Kết quả:
Ví dụ 2:
view source
print?
MsgBox rangeObj.Rows.Count
Kết quả:
Kiểu dữ liệu trong VBA
Bảng dưới đây thể hiển các kiểu dữ liệu được hỗ trợ trong VBA, bao gồm kích thước lưu trữ
và vùng giá trị.
LongPtr 4 bytes trên hệ thống -2,147,483,648 tới 2,147,483,647 trên hệ thống 32-bit,
32-bit, -9,223,372,036,854,775,808 tới
8 bytes trên hệ thống 9,223,372,036,854,775,807 trên hệ thống 64-bit
64-bit
Single 4 bytes -3.402823E38 tới -1.401298E-45 cho các giá trị âm;
1.401298E-45 tới 3.402823E38 cho các giá trị dương
Variant 22 bytes + độ dài của Giống như String có đội dài thay đổi
(kiểu ký tự) chuỗi ký tự (24 bytes
trên hệ thống 64-bit)
view source
print?
n = 100
MsgBox n
view source
print?
MsgBox str
Dim x As Integer
x = 6
Range("A1").Value = x
Kết quả:
Range("A1").Value = str
Kết quả:
view source
print?
Dim x As Integer
x = 5.5
Kết quả:
Đó không phải là giá trị đúng! Rõ ràng giá trị biến x được khởi tạo với giá trị 5.5 ở dòng code
thứ 2. Vậy tại sao kết quả lại là 6? Vì chúng ta đã khai báo kiểu dữ liệu của biến x là Integer
nên giá trị có chứa dấu phảy động sẽ được ép thành kiểu Integer.
Ví dụ 2: để sử dụng số có chứa dấu phảy động, chúng ta nên khai báo biến có kiểu giá trị là
Double
view source
print?
Dim x As Double
x = 5.5
Kết quả:
view source
print?
flag = True
End If
Kết quả:
Một toán tử (Operator) có thể được định nghĩa bằng cách sử dụng một biểu thức đơn giản – 4
+ 5 bằng 9. Ở đây, 4 và 5 được gọi là các toán hạng và + được gọi là toán tử.
Giả sử biến A có giá trị là 5 và biến B có giá trị là 10, sau đó:
Toán tử Mô tả Ví dụ
Mod Phép chia lấy phần dư hai toán hạng B Mod A sẽ cho 0
Giả sử biến A có giá trị là 5 và biến B có giá trị là 10, sau đó:
Toán tử Mô tả Ví dụ
= Kiểm tra nếu giá trị của hai toán hạng bằng nhau hay (A = B) là False.
không. Nếu có, thì điều kiện là đúng.
<> Kiểm tra nếu giá trị của hai toán hạng bằng nhau hay (A <> B) là True.
không. Nếu các giá trị không bằng nhau, thì điều kiện là
đúng.
> Kiểm tra nếu giá trị của toán hạng bên trái lớn hơn giá (A > B) là False.
trị của toán hạng bên phải không. Nếu có, thì điều kiện
là đúng.
< Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn (A < B) là True.
giá trị của toán hạng bên phải không. Nếu có, thì điều
kiện là đúng.
>= Kiểm tra nếu giá trị của toán hạng bên trái lớn hơn hoặc (A >= B) là False.
bằng giá trị của toán hạng bên phải không. Nếu có, thì
điều kiện là đúng.
<= Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn (A <= B) là True.
hoặc bằng giá trị của toán hạng bên phải không. Nếu có,
thì điều kiện là đúng.
Toán tử Mô tả Ví dụ
AND Nếu cả hai điều kiện là True, thì true. a<>0 AND b<>0 là
False.
OR Nếu một trong hai điều kiện là True, thì true. a<>0 OR b<>0 là true.
NOT Được sử dụng để đảo ngược trạng thái logic của toán NOT(a<>0 OR b<>0) là
hạng. Nếu một điều kiện có giá trị true, thì toán tử NOT false.
điều kiện đó sẽ là false.
XOR Nếu chỉ một trong hai điều kiện là true thì biểu thức là (a<>0 XOR b<>0) là
true, ngược lại là false. true.
Các toán tử móc nối
Bảng dưới đây trình bày các toán tử móc nối sau được hỗ trợ bởi VBA.
Giả sử biến A có giá trị là 5 và biến B có giá trị là 10, sau đó:
Toán tử Mô tả Ví dụ
Giả sử biến A có giá trị là “Hello” và biến B có giá trị là ” VBA!”, sau đó:
Toán tử Mô tả Ví dụ
Chú ý: Có thể áp dụng toán tử móc nối cho cả số và chuỗi. Đầu ra phụ thuộc vào ngữ cảnh, nếu các
biến có giá trị số hoặc giá trị chuỗi.
Một Function trong VBA (chức năng do người dùng tự định nghĩa) là một nhóm các mã tái
sử dụng, được gọi là bất cứ nơi nào trong chương trình của bạn. Điều này giúp loại bỏ sự việc
viết mã giống nhau lặp đi lặp lại. Điều này cho phép các lập trình viên phân chia một chương
trình lớn thành một số chức năng nhỏ và dễ quản lý.
Ngoài các Function sẵn có, VBA cũng cho phép người dùng tạo ra các Function của riêng bạn.
Function FunctionName([parameter-list])
statement 1
statement 2
statement 3
.......
statement n
End Function
view source
print?
statement 1
statement 2
statement 3
.......
statement n
End Function
Trong đó:
[parameter-list]: là danh sách tham số, có thể có không, một hoặc nhiều.
[data-type]: là kiểu giá trị trả về của function, có thể định nghĩa hoặc không.
Ví dụ: bạn có thể truyền hai số vào trong một Function và sau đó bạn mong muốn Function đó
trả về tích của hai số đã cho.
view source
print?
If IsMissing(Width) Then
Else
End If
End Function
Hoặc không cần chỉ rõ kiểu giá trị trả về của function:
view source
print?
If IsMissing(Width) Then
End If
End Function
Note: Một giá trị có thể được trả về với tên của chính Function đó, trong ví dụ trên là giá trị findArea
sẽ được trả về cho Function có tên findArea.
Gọi một Function trong một Functon khác hoặc trong một Sub
khác
Ví dụ:
view source
print?
Sub ClickButton()
area1 = findArea(10, 5)
area2 = findArea(10)
MsgBox "aria1 = " & area1 & ", area2 = " & area2
End Sub
Kết quả:
Gọi một Function trong một Cell của Worksheet
Để gọi một Function, hãy gọi hàm bằng cách sử dụng tên hàm như thể hiện trong ảnh chụp
màn hình sau.
Kết quả:
Sub trong VBA hay còn gọi là thủ tục trong VBA là tương tự như function, tuy nhiên có một số
khác biệt.
Các thủ tục Sub KHÔNG không có giá trị trả về trong khi các function có thể hoặc không trả
lại một giá trị.
Các thủ tục Sub được gọi với từ khóa Call hoặc không.
statement 1
statement 2
statement 3
.......
statement n
End Sub
Trong đó:
[parameter-list]: là danh sách tham số, có thể có không, một hoặc nhiều.
Ví dụ
Ví dụ sau hiển thị tích của hai số đã cho trong một hộp thoại thông báo.
MsgBox x * y
End Sub
Bạn có thể sử dụng hoặc không cần sử dụng từ khóa Call để gọi Sub.
Sub ClickButton()
End Sub
If IsMissing(width) Then
Else
End Function
Gọi Sub trong Cell của Worksheet thông qua một function
Bây giờ bạn sẽ chỉ có thể gọi Sub trong Cell của Worksheet thông qua một function như thể hiện
trong ảnh chụp màn hình sau đây:
Tích của hai số được tính và chỉ được hiển thị trong hộp thoại thông báo:
Kết quả hiển thị trong cell là 0, vì Sub trong VBA không có giá trị trả về:
Khối lệnh With-End With trong VBA cho phép bạn thực hiện nhiều thao tác trên một đối tượng
duy nhất. Đây là một cách khác để làm cho mã chạy nhanh hơn và hiệu quả hơn.
Cú pháp
With objectExpression
[statements]
End With
Trong đó:
objectExpression: Bắt buộc, nó là một biểu thức đối tượng.
statements: Không bắt buộc, một hoặc nhiều câu lệnh có thể tham chiếu đến các thành viên của
đối tượng objectExpression.
Sub WithExample()
With Range("B3")
.Interior.ColorIndex = 7
.Value = "Violet"
End With
End Sub
Ví dụ 2: hiển thị hộp thoại chọn file bằng khối lệnh With.
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.AllowMultiSelect = False
.InitialFileName = Application.ActiveWorkbook.path & "\"
.Filters.Clear
.Filters.Add "Excel 2007", "*.xlsx"
.Filters.Add "All Files", "*.*"
Mảng (Array) trong VBA được sử dụng để lưu trữ nhiều giá trị trong một biến duy nhất tại
một thời điểm. Khi một loạt các giá trị được lưu trữ trong một biến duy nhất, thì nó được gọi là
biến mảng.
view source
print?
Dim arr1()
Dim arr2(5)
Dim arr3
arr3 = Array("Java","C++","PHP")
TH không chỉ định rõ kiểu giá trị của mảng khi khai báo thì mảng có thể lưu giá trị bất
kỳ.
TH chỉ định rõ kiểu giá trị của mảng khi khai báo thì mảng chỉ có thể lưu kiểu giá trị
đó.
Ví dụ
view source
print?
Sub arrayExample1()
Dim i As Integer
For i = 0 To UBound(arr)
MsgBox ("Gia tri duoc luu trong Array co index " & i & ": " &
arr(i))
Next i
End Sub
Kết quả:
Ví dụ
view source
print?
Sub arrayExample2()
arr(0, 0) = "Apple"
arr(0, 1) = "Orange"
arr(0, 2) = "Grapes"
arr(0, 3) = "pineapple"
arr(1, 0) = "cucumber"
arr(1, 1) = "beans"
arr(1, 2) = "carrot"
arr(1, 3) = "tomato"
arr(2, 0) = "potato"
arr(2, 1) = "sandwitch"
arr(2, 2) = "coffee"
arr(2, 3) = "nuts"
MsgBox ("Gia tri duoc luu trong Array co index 0,1: " &
arr(0, 1))
MsgBox ("Gia tri duoc luu trong Array co index 2,2: " &
arr(2, 2))
End Sub
Kết quả:
Gia tri duoc luu trong Array co index 0,1: Orange
Gia tri duoc luu trong Array co index 2,2: coffee
Ví dụ
Trong ví dụ sau, một mảng đã được định nghĩa lại và các giá trị được bảo toàn khi kích thước hiện tại của
mảng được thay đổi.
view source
print?
Sub arrayExample3()
Dim i As Integer
ReDim a(5)
a(0) = "XYZ"
a(1) = 41.25
a(2) = 22
For i = 3 To 7
a(i) = i
Next
'hien thi cac phan tu cua mang a
For i = 0 To UBound(a)
MsgBox a(i)
Next
End Sub
Kết quả:
XYZ
41.25
22
3
4
5
6
7
Lưu ý: Khi thay đổi kích thước mảng nhỏ hơn ban đầu, dữ liệu trong các phần tử đã loại bỏ sẽ bị mất.
1 LBound
Trả về một số nguyên tương ứng với chỉ số nhỏ nhất của mảng đã cho.
2 UBound
Trả về một số nguyên tương ứng với chỉ số lớn nhất của mảng đã cho.
3 Split
Trả về một mảng chứa một số giá trị nhất định. Split dựa trên một dấu phân cách.
4 Join
Trả về một chuỗi có chứa một số lượng quy định của chuỗi con trong một mảng. Đây là
một chức năng đối lập với phương thức Split.
5 Filter
Ttrả về một mảng chứa một tập hợp con của một mảng chuỗi đã cho dựa trên một tiêu
chí lọc cụ thể.
6 IsArray
Trả về một giá trị boolean cho biết biến đầu vào có là mảng hay không.
7 Erase
Được sử dụng để giải phóng bộ nhớ được phân bổ cho các biến mảng.
Trong đó:
ArrayName: Một tham số bắt buộc. Tham số này tương ứng với tên của mảng.
dimension: Một tham số tùy chọn. Nếu nó là ‘1’, thì nó sẽ trả về giới hạn dưới của kích thước thứ nhất;
nếu nó là ‘2’, thì nó sẽ trả về giới hạn dưới của thứ hai, vv.
Ví dụ
view source
print?
Sub LBoundArrayExample()
Dim arr(5) As Variant
MsgBox ("Chi so nho nhat cu mang arr la: " & LBound(arr))
MsgBox ("Chi so nho nhat cua chieu dau tien cua mang arr2
la: " & _
LBound(arr2, 1))
MsgBox ("Chi so nho nhat cua chieu thu hai cua mang arr2
la: " & _
LBound(arr2, 2))
End Sub
Kết quả:
Trong đó:
ArrayName: Một tham số bắt buộc. Tham số này tương ứng với tên của mảng.
dimension: Một tham số tùy chọn. Nếu nó là ‘1’, thì nó sẽ trả về giới hạn dưới của kích thước thứ nhất;
nếu nó là ‘2’, thì nó sẽ trả về giới hạn dưới của thứ hai, vv.
Ví dụ
view source
print?
Sub UBoundArrayExample()
MsgBox ("Chi so nho nhat cu mang arr la: " & UBound(arr))
' For MultiDimension Arrays :
MsgBox ("Chi so nho nhat cua chieu dau tien cua mang arr2
la: " & _
UBound(arr2, 1))
MsgBox ("Chi so nho nhat cua chieu thu hai cua mang arr2
la: " & _
UBound(arr2, 2))
End Sub
Kết quả:
Trong đó:
Expression: Một tham số bắt buộc. Biểu thức chuỗi có thể chứa chuỗi với các dấu phân cách.
Delimiter: Một tham số tùy chọn. Tham số được sử dụng để chuyển đổi thành các mảng dựa trên dấu
phân cách.
Count: Một tham số tùy chọn. Số lượng các chuỗi con được trả về, và nếu được chỉ định là -1, thì tất cả
các chuỗi con được trả về.
Compare: Một tham số tùy chọn. Tham số này xác định phương thức so sánh nào sẽ được sử dụng.
Ví dụ
view source
print?
Sub SplitArrayExample()
Dim a As Variant
Dim b As Variant
' phan tach chuoi thanh mang dua tren dau phan cach '$'
b = UBound(a)
For i = 0 To b
MsgBox ("Gia tri trong mang co index " & i & " la:" &
a(i))
Next
End Sub
Kết quả:
Trong đó:
ArrayName: Một tham số bắt buộc. Một mảng có chứa các chuỗi con được nối.
Delimiter: Một tham số tùy chọn. Tham số được sử dụng để chuyển đổi thành các mảng dựa trên dấu
phân cách.
Ví dụ
view source
print?
Sub JoinArrayExample()
Dim a
Dim b As String
b = Join(a)
MsgBox ("Ket qua join khong su dung dau phan cach: b = " &
b)
b = Join(a, "$")
MsgBox ("Ket qua join su dung dau phan cach '$': b = " & b)
End Sub
Kết quả:
Ket qua join khong su dung dau phan cach: b = Red Blue
Yellow
Ket qua join su dung dau phan cach '$': b =
Red$Blue$Yellow
Trong đó:
inputstrings: Một tham số bắt buộc. Tham số này tương ứng với mảng các chuỗi được tìm kiếm.
value: Một tham số bắt buộc. ham số này tương ứng với chuỗi để tìm kiếm đối với tham số đầu vào.
include: Một tham số tùy chọn. Đây là một giá trị Boolean, cho biết có trả lại các chuỗi con bao gồm hay
loại trừ.
compare: Một tham số tùy chọn. Tham số này xác định phương thức so sánh nào sẽ được sử dụng.
Ví dụ
view source
print?
Sub FilterArrayExample()
Dim a, b, c, d As Variant
c = Filter(a, "e")
d = Filter(a, "Y")
For Each x In b
Next
For Each y In c
Next
For Each z In d
Next
End Sub
Kết quả:
Trong đó:
ArrayName: Một tham số bắt buộc. Tham số này tương ứng với tên của mảng.
Ví dụ
view source
print?
Sub IsArrayExample()
Dim a, b As Variant
b = "12345"
End Sub
Kết quả:
Trong đó:
ArrayName: Một tham số bắt buộc. Tham số này tương ứng với tên của mảng.
Ví dụ
view source
print?
Sub EraseArrayExample()
Dim numArray(3)
numArray(0) = "VBScript"
numArray(1) = 1.05
numArray(2) = 25
numArray(3) = #4/23/2013#
Dim dynamicArray()
MsgBox ("Gia tri thu nhat cua NumArray la: " & numArray(0))
MsgBox ("Gia tri thu hai cua NumArray la: " & numArray(1))
MsgBox ("Gia tri thu ba cua NumArray la: " & numArray(2))
MsgBox ("Gia tri thu tu cua NumArray la: " & numArray(3))
End Sub
Kết quả:
Collection trong VBA được sử dụng để lưu trữ một nhóm các giá trị. Collection có thể lưu trữ
một tập các hạng mục tương tự, ví dụ như một danh sách tên của các sinh viên hoặc tên quốc
gia. Sử dụng một collection hoặc array cho phép bạn nhanh chóng và dễ dàng thao tác một số
lượng lớn các hạng mục.
1. Mở VB Editor(Alt + F11).
2. Tools –> References…
3. Chọn “Microsoft Scripting Runtime”.
4. Click OK.
Truy cập tất cả các phần tử (For Each) Dim fruit As Variant
For Each fruit In coll
Debug.Print fruit
Next fruit
Note: phần tử đầu tiên của mảng trong VBA có chỉ số là 0. Nhưng phần tử đầu tiên của collection
trong VBA có chỉ số là 1.
3. Ví dụ về Collection trong VBA
Ví dụ 1:
view source
print?
Sub collectionExample1()
Dim i As Integer
fruitColl.Add "Apple"
fruitColl.Add "Mango"
fruitColl.Add "Lemon"
fruitColl.Add "Coconut"
For i = 1 To fruitColl.Count
Next i
fruitColl.Remove (1)
End Sub
Kết quả:
view source
print?
Trong đó:
Item: Một tham số bắt buộc, là giá trị của hạng mục.
Key: Một tham số tùy chọn, là key của hạng mục.
Before: Một tham số tùy chọn, lưu hạng mục tại vị trí trước vị trí chỉ định.
After: Một tham số tùy chọn, lưu hạng mục tại vị trí sau vị trí chỉ định.
Ngoài việc lưu trữ bằng việc đánh chỉ số tự động, VBA cho phép bạn lưu trữ phần tử của
collection với một Key. Hãy xem ví dụ dưới đây để hiểu về vấn đề này:
view source
print?
Sub collectionExample2()
Dim i As Integer
' hien thi cac phan tu bang phuong thuc Item() theo index
End Sub
Kết quả:
phan tu so 1: Coconut
phan tu so 2: Orange
phan tu so 3: Apple
phan tu "a": Apple
phan tu "C": Coconut
phan tu "O": Orange
phan tu Item(1): Coconut
phan tu Item(2): Orange
phan tu Item(3): Apple
Note: Key trong collection không phân biệt hoa thường.
Nhược điểm
Collection chỉ đọc. Có nghĩa là bạn có thể thêm hoặc xóa một phần tử nhưng bạn không thể
thay đổi giá trị của phần tử đó. Nếu bạn muốn thay đổi các giá trị trong một nhóm các giá trị thì
bạn cần phải sử dụng một mảng.
Trong VBA, chúng ta có thể sử dụng Array hoặc Collection để lưu trữ các nhóm của các giá trị.
Ví dụ, chúng ta có thể sử dụng chúng để lưu trữ danh sách tên khách hàng, điểm của sinh
viên, hoặc danh sách giá trị từ các cell trong một cột.
Dictionary trong VBA lưu trữ dữ liệu dưới dạng cặp key và value, các key không được trùng
nhau. Dictionary được sinh ra để lấp đầy 2 khuyết điểm chính của Collection, với Dictionary
chúng ta có thể:
Dưới đây là bảng hướng dẫn sử dụng nhanh collection trong VBA.
Task Example
view source
print?
Sub dictionaryExample1()
dict.CompareMode = vbTextCompare
' add phan tu vao dict
If dict.Exists(sFruit) Then
Else
End If
End Sub
Kết quả:
Với Debug trong Excel VBA chúng ta có thể tạm ngưng (pause) chương trình để xem giá trị của
các biến từ đó biết được luồng chạy của chương trình, thậm chí là thay đổi giá trị của các biến.
Đặc biệt Debug được sử dụng để tìm kiếm bug – một việc quan trọng trong phát triển phần mềm.
Để tạo Breakpoint, bạn phải thực hiện theo các thao tác sau:
Ví dụ:
Run chương trình (F5, hoặc click vào button mà bạn assign), chương trình sẽ dừng lại tại các
Breakpoint, tiếp theo bạn nên dùng các phím tắt để Debug.
Xem giá trị của biến sFruit: chọn biến sFruit -> click phải chuột -> chọn Add Watch.
Màn hình Add Watch.
Đến đây là Breakpoint cuối cùng, nhấn F5 để kết thúc chương trình.
Debug trong Excel VBA
Truyền tham chiếu và giá trị trong VBA
Lỗi cú pháp.
Lỗi runtime.
Lỗi Logic.
Lỗi cú pháp
Các lỗi cú pháp, còn gọi là lỗi phân tích cú pháp, xuất hiện tại thời điểm biên dịch code. Ví dụ,
dòng sau gây ra một lỗi cú pháp bởi vì nó thiếu một dấu đóng ngoặc ở dòng 4.
view source
print?
Sub ErrorHanlding_Demo1()
Dim str As String
str = "Hello!"
y = Ucase(str
End Sub
Lỗi runtime
Các lỗi runtime, còn được gọi là lỗi ngoại lệ, xảy ra trong quá trình thực thi.
Ví dụ, dòng sau gây ra lỗi runtime vì ở đây cú pháp là chính xác nhưng khi chạy nó đang cố
gọi hàm fnmultiply, nhưng hàm này không tồn tại.
view source
print?
Sub ErrorHanlding_Demo2()
Dim x As Integer
Dim y As Integer
x = fnadd(10, 20)
y = fnmultiply(10, 20)
End Sub
Function fnadd(x,y)
fnadd = x + y
End Function
Lỗi Logic
Lỗi logic có thể là loại lỗi khó khăn nhất để theo dõi. Những lỗi này không phải là kết quả của
lỗi cú pháp hoặc lỗi runtime. Thay vào đó, chúng xuất hiện khi bạn mắc lỗi trong logic khiến
cho đầu ra của chương trình không nhận được kết quả mong đợi.
Ví dụ, chia một số cho số không hoặc một tập lệnh được thực thi trong vòng lặp vô hạn.
Để phát hiện ra nhiều lỗi khi biên dịch hay nói cách khác là hạn chế lỗi khi runtime bạn nên:
Khai báo biến với kiểu dữ liệu (vì VBA không yêu cầu bạn phải khai báo biến).
Khai báo Option Explicit trình Editor bắt những lỗi cú pháp, biến không được định
nghĩa và nhiều hơn thế nữa.
Ví dụ: ví dụ sau trình Editor sẽ báo lỗi biên dịch “Variable not defined” ở dòng số 6 cho bạn.
view source
print?
Option Explicit
Sub ErrorHanlding_Demo1()
str = "Hello!"
y = UCase(str)
End Sub
Xử lý lỗi runtime
Bất kỳ lỗi runtime nào xảy ra đều gây hiện tượng dừng đột ngột. Bạn có thể sử dụng câu lệnh
On Error để bắt các lỗi runtime trong VBA với cú pháp như sau:
view source
print?
1 GoTo line
Cho phép xử lý lỗi bắt đầu ở dòng được chỉ định. Dòng được chỉ định phải ở trong
cùng một thủ tục với câu lệnh On Error.
2 GoTo 0
Vô hiệu hoá xử lý lỗi đã kích hoạt trong thủ tục hiện tại và đặt lại nó thành Nothing.
3 GoTo -1
Vô hiệu hóa ngoại lệ được bật trong thủ tục hiện tại và đặt lại nó thành Nothing.
4 Resume Next
Chỉ định rằng khi xảy ra lỗi runtime, điều khiển sẽ đi đến câu lệnh ngay sau câu lệnh
nơi xảy ra lỗi và việc thực hiện vẫn tiếp tục từ thời điểm đó.
view source
print?
Option Explicit
Public Const COL_A = "A"
Sub ErrorHanlding_Demo()
Dim i As Integer
For i = 1 To 5
Next i
Exit Sub
InvalidValue:
MsgBox "Error: " & Err.number & " : " & Err.Description
Resume Next
End Sub
Kết quả:
Click Square Root button: có 2 lỗi được bắt và show ra như sau:
Một điều khá quan trọng trong VBA đó là truyền tham chiếu và giá trị vào một Sub hoặc
Function.
Từ khóa ByRef được sử dụng để truyền tham chiếu và từ khóa ByVal được sử dụng để truyền
giá trị. Trong trường hợp bạn không sử dụng từ khóa nào thì đó là trường hợp truyền giá trị.
Truyền tham chiếu là truyền địa chỉ ô nhớ của biến, do đó khi thay đổi giá trị của biến bên trong
thủ tục thì giá trị của biến cũng bị thay đổi bên ngoài thủ tục.
Truyền giá trị là truyền giá trị của biến (không phải là địa chỉ ô nhớ), thủ tục sẽ tự động tạo ra
một địa chỉ ô nhớ mới để lưu trữ giá trị này, do đó khi thay đổi giá trị của biến truyền vào thủ tục
thì giá trị của biến không bị thay đổi bên ngoài thủ tục.
Sub PassTypeExample()
Dim test As Integer
test = 50
Call PassByValue(test)
' hien thi 50
MsgBox "test = " & test
Call PassByReference(test)
' hien thi 100
MsgBox "test = " & test
Call PassByReference(test)
' hien thi 100
MsgBox "test = " & test
End Sub
Sub PassByValue(ByVal test As Integer)
' value chi bi thay doi ben trong thu tuc
test = 100
End Sub
test = 50
test = 100
test = 100
Mệnh đề if-else trong VBA được sử dụng để kiểm tra giá trị dạng boolean của điều kiện.
Mệnh đề này trả về giá trị True hoặc False. Có các kiểu của mệnh đề if-else trong java như
sau:
Mệnh đề if
Mệnh đề if-else
Mệnh đề if-elseif-else
Mệnh đề if lồng nhau
Cú pháp:
view source
print?
If (condition) Then
' statement
End If
Ví dụ:
view source
print?
Sub viduIf()
age = 20
End If
End Sub
Kết quả:
2. Mệnh đề if-else
Mệnh đề if-else cũng kiểm tra giá trị dạng boolean của điều kiện. Nếu giá trị điều kiện là True
thì chỉ có khối lệnh sau if sẽ được thực hiện, nếu là False thì chỉ có khối lệnh sau else được
thực hiện.
Cú pháp:
view source
print?
If (condition) Then
Else
End If
Ví dụ:
view source
print?
Sub viduIfElse1()
number = 13
Else
End If
End Sub
Kết quả:
3. Mệnh đề if-elseif-else
Mệnh đề if-elseif-else cũng kiểm tra giá trị dạng boolean của điều kiện. Nếu giá trị điều kiện if
là True thì chỉ có khối lệnh sau if sẽ được thực hiện. Nếu giá trị điều kiện ifelse nào là True thì
chỉ có khối lệnh sau elseif đó sẽ được thực hiện… Nếu tất cả điều kiện của if và elseif là False
thì chỉ có khối lệnh sau else sẽ được thực hiện.
Cú pháp:
view source
print?
If (condition1) Then
...
Else
End If
Ví dụ:
view source
print?
Sub viduIfElse2()
marks = 75
MsgBox "Tach!"
Else
End If
End Sub
Kết quả:
Ví dụ:
view source
print?
Sub viduNestedIf()
Dim a As Integer
a = 23
If a > 0 Then
If a = 1 Then
ElseIf a = 2 Then
MsgBox "Number = 2"
ElseIf a = 3 Then
Else
End If
Else
End If
End Sub
Kết quả:
Click OK.
Vòng lặp for trong VBA được sử dụng để lặp một phần của chương trình nhiều lần. Nếu số
lần lặp là cố định thì vòng lặp for được khuyến khích sử dụng, còn nếu số lần lặp không cố
định thì nên sử dụng vòng lặp while hoặc do while.
Cú pháp
Dưới đây là cú pháp của một vòng lặp for trong VBA.
view source
print?
[statement 1]
[statement 2]
....
[statement 10]
[Exit For]
[statement 11]
[statement 22]
....
[statement n]
Next
Trong đó:
[Step stepcount] là tùy chọn, nó rất hữu ích khi đếm lùi, đếm nhiều đơn vị một vòng lặp. Hãy
xem các ví dụ dưới đây để hiểu các trường hợp sử dụng vòng lặp for trong VBA.
Ví dụ về vòng lặp for trong VBA
Ví dụ 1: Sử dụng từ khóa Step 2 để tăng biến đếm 2 đơn vị sau mỗi vòng lặp.
view source
print?
Sub ForExample1()
Dim i As Integer
For i = 0 To 10 Step 2
MsgBox "Gia tri cua i la: " & i
Next
End Sub
Kết quả:
view source
print?
Sub ForExample2()
Dim i As Integer
For i = 10 To 0 Step -2
Next
End Sub
Kết quả:
view source
print?
Sub ForExample3()
Dim i As Integer
For i = 1 To 5
Next
End Sub
Kết quả:
Ví dụ:
view source
print?
Sub ForExample4()
Dim i As Integer
For i = 0 To 10
If i > 3 Then
Exit For
Else
End If
Next
End Sub
Kết quả:
Vòng lặp For Each trong VBA được sử dụng để thực hiện một câu lệnh hoặc một nhóm các câu
lệnh cho mỗi phần tử của một mảng hoặc một collection.
Một vòng lặp For Each tương tự vòng lặp For. Tuy nhiên, vòng lặp For Each được thực hiện cho
mỗi phần tử của một mảng hoặc collection. Do đó, bộ đếm Step sẽ không tồn tại trong loại vòng
lặp này.
Cú pháp
Dưới đây là cú pháp của một vòng lặp For Each trong VBA.
MsgBox fruitNames
End Sub
Kết quả:
apple
orange
mango
Vòng lặp While-Wend trong VBA được sử dụng để lặp một phần của chương trình một vài lần.
Nếu điều kiện là True, tất cả các câu lệnh được thực hiện cho đến khi gặp từ khóa Wend. Nếu
điều kiện là False, vòng lặp sẽ thoát và nhảy tới câu lệnh tiếp theo sau từ khoá Wend.
Cú pháp
While (condition)
' Khối lệnh được lặp lại
' cho đến khi condition = False
Wend
counter = 10
While counter < 15
MsgBox "Gia tri hien tai cua counter la: " & counter
counter = counter + 1
Wend
End Sub
Kết quả:
TH này Tương tự như vòng lặp While-Wend, ngoại trừ Do-While thực hiện lệnh ít nhất một
lần ngay cả khi điều kiện là False vì nó thực hiện lệnh trước khi kiểm tra điều kiện.
view source
print?
Do
[statement 1]
[statement 2]
...
[statement l]
[Exit Do]
[statement m]
...
[statement n]
view source
print?
Sub doWhileExample1()
counter = 1
Do
MsgBox "Gia tri hien tai cua counter la: " & counter
counter = counter + 1
End Sub
Kết quả:
Gia tri hien tai cua counter la: 1
view source
print?
Do While condition
[statement 1]
[statement 2]
...
[statement l]
[Exit Do]
[statement m]
...
[statement n]
Loop
Ví dụ 2:
view source
print?
Sub doWhileExample2()
MsgBox "Gia tri hien tai cua counter la: " & counter
counter = counter + 1
Loop
End Sub
Kết quả:
Vòng lặp Do-Until trong VBA được sử dụng để lặp một phần của chương trình một vài lần
khi điều kiện là False. Điều kiện có thể được kiểm tra ở đầu vòng lặp hoặc ở cuối vòng lặp.
TH này Do-Util thực hiện lệnh ít nhất một lần ngay cả khi điều kiện là True vì nó thực hiện
lệnh trước khi kiểm tra điều kiện.
view source
print?
Do
[statement 1]
[statement 2]
...
[statement l]
[Exit Do]
[statement m]
...
[statement n]
Ví dụ 1:
view source
print?
Sub doUntilExample1()
counter = 1
Do
MsgBox "Gia tri hien tai cua counter la: " & counter
counter = counter + 1
End Sub
Kết quả:
view source
print?
Do Until condition
[statement 1]
[statement 2]
...
[statement l]
[Exit Do]
[statement m]
...
[statement n]
Loop
Ví dụ 2:
view source
print?
Sub doUntilExample2()
counter = 1
MsgBox "Gia tri hien tai cua counter la: " & counter
counter = counter + 1
Loop
End Sub
Kết quả:
Khi một người dùng muốn thực hiện một nhóm các câu lệnh tùy thuộc vào một giá trị của một
biểu thức, thì Select-Case sẽ được sử dụng. Mỗi giá trị được gọi là Case. Câu lệnh Case Else được
thực thi nếu biểu thức kiểm tra không khớp với bất kỳ trường hợp nào được chỉ định bởi người
dùng.
Case Else là một câu lệnh tùy chọn trong mệnh đề Select-Case, tuy nhiên, nó là tốt hơn khi luôn
luôn có một câu lệnh Case Else.
Sub SelectCaseExample()
Dim myVar As Integer
myVar = 1
Select Case myVar
Case 1
MsgBox "So nguyen duong nho nhat."
Case 2
MsgBox "So chan nho nhat."
Case 3
MsgBox "So nguyen to le nho nhat."
Case Else
MsgBox "Khong xac dinh."
End Select
End Sub
Kết quả:
String trong VBA (hay chuỗi) là một dãy ký tự, có thể bao gồm các chữ cái, số, ký tự đặc biệt
hoặc tất cả chúng.
Ví dụ:
view source
print?
str1 = "string"
str2 = "132.45"
str3 = "!@#$;*"
Str4 = "Asc23@#"
Ví dụ:
view source
print?
Sub StringExample1()
str2 = "VBA!"
End Sub
Kết quả:
Hello VBA! 1
Hello VBA! 2
2 InstrRev
Trả về lần xuất hiện đầu tiên của chuỗi con được chỉ định. Tìm kiếm xảy ra từ bên
phải sang trái.
3 Lcase
Trả về chuỗi chữ hoa của chuỗi được chỉ định.
4 Ucase
Trả về chuỗi chữ thường của chuỗi được chỉ định.
5 Left
Trả lại một số ký tự cụ thể từ phía bên trái của chuỗi.
6 Right
Trả lại một số ký tự cụ thể từ phía bên phải của chuỗi.
7 Mid
Trả lại một số ký tự cụ thể từ một chuỗi dựa trên các tham số được chỉ định.
8 Ltrim
Trả về một chuỗi sau khi loại bỏ các khoảng trống ở phía bên trái của chuỗi được chỉ
định.
9 Rtrim
Trả về một chuỗi sau khi loại bỏ các khoảng trống ở phía bên phải của chuỗi được chỉ
định.
10 Trim
Trả về một giá trị chuỗi sau khi loại bỏ khoảng trống cả đầu và cuối chuỗi.
11 Len
Trả về độ dài của chuỗi đã cho.
12 Replace
Trả về một chuỗi sau khi thay thế một chuỗi với một chuỗi khác.
13 Space
Điền vào một chuỗi với số ký tự space được chỉ định.
14 StrComp
Trả về một giá trị số nguyên sau khi so sánh hai chuỗi được chỉ định.
15 String
Trả về một chuỗi ký tự được chỉ định cho số lần được chỉ định.
16 StrReverse
Trả về một chuỗi sau khi đảo ngược chuỗi ký tự của chuỗi đã cho.
Các hàm xử lý Date và Time trong VBA giúp các nhà phát triển chuyển đổi ngày và thời gian
từ một định dạng này sang định dạng khác hoặc để lấy ra giá trị ngày hoặc giờ theo định dạng
phù hợp.
1 Date
trả về ngày hệ thống hiện tại.
2 CDate
chuyển đổi một chuỗi đầu vào cho trước thành kiểu Date.
3 DateAdd
trả về một ngày mà một khoảng thời gian xác định đã được thêm vào.
4 DateDiff
trả về sự khác biệt giữa hai khoảng thời gian.
5 DatePart
trả về một phần quy định của giá trị date đã cho.
6 DateSerial
trả về một ngày hợp lệ cho một năm, tháng và ngày cho trước.
7 FormatDateTime
định dạng ngày dựa trên các thông số được cung cấp.
8 IsDate
trả về một giá trị Boolean tham số được cung cấp có phải là một date hay không.
9 Day
trả về một số nguyên giữa 1 và 31 đại diện cho ngày của date đã cho.
10 Month
trả về một số nguyên giữa 1 và 12 đại diện cho tháng của date đã cho.
11 Year
trả về một số nguyên đại diện cho năm của date đã cho.
12 MonthName
trả về tên của tháng cụ thể cho date đã cho.
13 WeekDay
trả lại một số nguyên (1 đến 7) đại diện cho ngày trong tuần cho date đã cho.
14 WeekDayName
trả về tên ngày trong tuần cho date đã cho.
2 Hour
trả về một số nguyên giữa 0 và 23 đại diện cho phần giờ của time đã cho.
3 Minute
trả về một số nguyên từ 0 đến 59 đại diện cho phần phút của time đã cho.
4 Second
trả về một số nguyên giữa 0 và 59 đại diện cho phần giây của time đã cho.
5 Time
trả về thời gian hệ thống hiện tại.
6 Timer
trả lại số giây kể từ 12:00 AM.
7 TimeSerial
định dạng thời gian dựa trên các thông số được cung cấp.
8 TimeValue
chuyển đổi chuỗi đầu vào sang định dạng thời gian.