You are on page 1of 124

Hệ thống các đối tượng trong Excel VBA được kết nối với nhau bởi dấu chấm

(.).

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.

Nội dung chính:


 Các đối tượng trong Excel VBA
 Mỗi đối tượng có nhiều thành viên khác nhau

Các đối tượng trong Excel VBA

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.

Chỉ định tên Worksheet thao tác là: “Sheet1”

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

Mỗi đối tượng có nhiều thành viên khác nhau


Điều quan trọng cần lưu ý là mỗi đối tượng có nhiều thành viên khác nhau mà chúng ta có thể
sử dụng để tham chiếu đến các đối tượng khác nhau. Ví dụ, các thành viên của đối tượng
Worksheet có thể bao gồm: Ranges, PivotTables, Shapes, Charts, ListObjects, vv

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

Nội dung chính:


 Các phương thức của đối tượng Application
 Các thuộc tính của đối tượng Application
 Sử dụng các phương thức của Application
 Phương thức FindFile
 Phương thức Goto
 Phương thức Run
 Phương thức Wait
 Sử dụng các thuộc tính của Application
 Thuộc tính DisplayAlerts
 Thuộc tính Path
 Thuộc tính ScreenUpdating

Các phương thức của đối tượng Application


Dưới đây là các phương thức được sử dụng nhiều nhất của đối tượng Application.

Phương thức Mô tả

FindFile Để mở hộp thoại để mở một file.

Goto Để chọn bất kỳ range nào.

Run Để chạy một thủ tục hoặc một hàm

Wait Để tạm ngưng chương trình macro.

Các thuộc tính của đối tượng Application


Dưới đây là các thuộc tính được sử dụng nhiều nhất của đối tượng Application.
Properties Mô tả

DisplayAlerts Để đại diện cho hiển thị cảnh báo.

Path Để có được đường dẫn tuyệt đối của ứng dụng.

ScreenUpdating Để bật/tắt màn hình.

Sử dụng các phương thức của Application


Phương thức FindFile
Phương thức FindFile của Application trong VBA được sử dụng để mở một hộp thoại cho
phép người sử dụng mở một workbook hoặc một file. Phương thức này trả về giá trị Boolean
là true hoặc false. If giá trị trả về là true thì người dùng đã mở file thành công. Nếu người dùng
hủy hộp thoại thì giá trị trả về là false.

Cú pháp:

view source
print?

Application.FindFile

Ví dụ:

view source
print?

Sub Demo_FindFile()

Application.FindFile

End Sub

Phương thức Goto


Phương thức Goto của Application trong VBA được sử dụng để chọn bất kỳ range trên một
worksheet hoặc lựa chọn bất kỳ thủ tục visual basic trong workbook. Nếu workbook là đang
không hoạt động, nó sẽ khiến workbook này hoạt động.

Cú pháp:

view source
print?

Application. Goto ([Reference], [Scroll])

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

Phương thức Run


Phương thức Run của Application trong VBA được sử dụng để run một thủ tục hoặc function
được viết trong VBA.

Cú pháp:

view source
print?

Application.Run([Macro], [Arg1], [Arg2],…, [Arg30])

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

Phương thức Wait


Phương thức Wait của Application trong VBA được sử dụng để được sử dụng để tạm dừng
hoặc dừng macro trong một khoảng thời gian được chỉ định. Nó trả về một giá trị Boolean. Nếu
thời gian đã chỉ định đến, nó trả về true nếu không nó sẽ trả về false.

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.

Ví dụ 1: tạm ngưng macro đến 16h cùng ngày.

view source
print?

Sub Demo_Wait1()

Application.Wait "16:00:00"

End Sub

Ví dụ 2: tạm ngưng macro 20 giây.

view source
print?
Sub Demo_Wait2()

Application.Wait Now + TimeValue("00:00:20")

End Sub

Sử dụng các thuộc tính của Application


Thuộc tính DisplayAlerts
Thuộc tính DisplayAlerts của Application trong VBA có giá trị Boolean là True hoặc False. Giá
trị mặc định là True. Khi giá trị là True nó sẽ hiển thị cảnh báo hoặc thông báo trong khi chạy
macro. Nếu giá trị là False nó sẽ không hiển thị bất kỳ thông báo hoặc cảnh báo nào.

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

Application.DisplayAlerts = True ' tùy chọn vì mặc định là true

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

MsgBox "The application path is:" & Application.Path

End Sub

Kết quả:

The application path is: C:\Program Files\Microsoft


Office\Office15
Ví dụ 1.1: hiển thị đường dẫn tuyệt đối của thư mục chứa file excel macro (workbook).

view source
print?

Sub Path_Example1()

MsgBox "The workbook path is:" & Application.ActiveWorkbook.Path

End Sub

Kết quả:

The workbook path is: D:\Test


Ví dụ 2: hiên thị đường dẫn tuyệt đối của file excel macro.

view source
print?

Sub Path_Example2()

MsgBox "Workbook full path is: " & ThisWorkbook.FullName


End Sub

Kết quả:

Workbook full path is: D:\Test\MyFile.xlsm

Thuộc tính ScreenUpdating


Thuộc tính ScreenUpdating của Application trong VBA được sử dụng để cập nhật ON/OFF
màn hình. Nếu chúng ta thiết lập thuộc tính ScreenUpdating thành True thì nó sẽ mở màn hình
cập nhật. Khi chúng ta thiết lập thuộc tính ScreenUpdating của một đối tượng Application
thành False thì nó sẽ tắt màn hình cập nhật, điều này có nghĩa là sẽ tăng tốc độ macro. Đó là
một trong những kỹ thuật tối ưu hóa.

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.

Nội dung chính:


 Các phương thức của đối tượng Workbook
 Phương thức Activate
 Phương thức Close
 Phương thức Save
 Phương thức SaveAs
 Phương thức SaveCopyAs
 Các thuộc tính của đối tượng Workbook

Các phương thức của đối tượng Workbook


Dưới đây là các phương thức được sử dụng thường xuyên của đối tượng Workbook trong
VBA:

Phương thức Mô tả

Activate Để kích hoạt một Workbook.

Calculate Để làm mới tất cả tính toán trong một Workbook.

Close Để close một Workbook.


Save Để save một Workbook.

SaveAs Để SaveAs một Workbook.

SaveCopyAs Để SaveCopyAs một Workbook.

Phương thức Activate


Phương thức Activate của đối tượng Workbook trong VBA sẽ giúp bạn kích hoạt một
Workbook cụ thể. Rất hữu ích khi bạn mở nhiều workbooks và muốn truy cập một Workbook
cụ thể để thao tác hoặc đọc một số dữ liệu từ Active Workbook.

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

Ví dụ 1: Activate Workbook trong VBA với tên của Workbook


view source
print?

Sub ActiveWorkbookExample1()

' sử dụng tên của một Workbook

Application.Workbooks("myFile.xlsx").Activate

End Sub

Ví dụ 2: Activate Workbook trong VBA với chỉ số của Workbook


view source
print?

Sub ActiveWorkbookExample2()

' sử dụng chỉ số của một Workbook

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

' bạn có thể activate Workbook chứa macro đang chạy

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.

Giải quyết vấn đề


Để giải quyết vấn đề trên, có một giải pháp cho bạn đó là với mỗi Workbook bạn tạo ra một
biến tham chiếu. Sau đó, bất cứ khi nào muốn sử dụng (Activate) Workbook nào bạn chỉ cần
tham chiếu đến biến tương ứng.

Ví dụ:

view source
print?

' khai báo đối tượng wb

Dim wbInput As Workbook

Dim wbOutput As Workbook

' gán wbInput bằng Workbook đang hoạt động (ActiveWorkbook)

Set wbInput = Application.ActiveWorkbook

' gán wbOutput bằng Workbooks.Open để mở file D:\test\Output.xlsx

Set wbOutput = Application.Workbooks.Open("D:\test\Output.xlsx")


Sau đó, khi nào bạn sử dụng đến hai đối tượng wbInput, wbOutput thì nó tự động được kích
hoạt, Khi đó bạn không cần phải gọi phương thức Activate nữa.

Có 6 cách để khởi tạo đối tượng Workbook


Từ khóa Set được sử dụng để để khởi tạo đối tượng Workbook.

Có 6 cách để khởi tạo đối tượng Workbook như sau:

view source
print?

' 1. khởi tạo bằng Workbook hiện tại (ThisWorkbook)

Set wb = Application.ThisWorkbook

' 2. Khởi tạo bằng Workbook đang hoạt động (ActiveWorkbook)

Set wb = Application.ActiveWorkbook

' 3. Khởi tạo bằng cách mở một Workbook khác (Workbooks.Open)

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)

' 6. tạo ra một Workbook mới

Set wb = Workbooks.Add

Phương thức Close


Bạn có thể đóng một Workbook (tương ứng một file excel) bởi việc sử dụng phương thức
Close của đối tượng Workbook trong Excel VBA.
Cú pháp:
view source
print?

Workbooks(“Workbook Name”).Close ([SaveChanges], [Filename],


[RouteWorkbook])

Ví dụ 1: Close Workbook trong VBA với Savechanges: = True


view source
print?

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.

Ví dụ 2: Close Workbook trong VBA với Savechanges: = False


view source
print?

Sub CloseWorkbookExample2()

Workbooks("D:\myFile.xlsx").Close Savechanges:=False

End Sub

Ví dụ trên giống như ví dụ 1. Sự khác biệt là chúng ta sử dụng ‘Savechanges:=False’, điều đó


có nghĩa là nếu chúng ta thực hiện bất kỳ thay đổi trong bảng tính nó sẽ không được lưu lại.

Ví dụ 3: Close Workbook đang được activate


view source
print?
Sub CloseWorkbookExample3()

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.

Phương thức Save


Chúng ta có thể lưu bảng tính bằng cách sử dụng phương thức ‘Save’ của đối tượng
Workbook trong Excel VBA.

Cú pháp:
view source
print?

Workbooks(“Workbook Name”).Save

Ví dụ 1: Save Workbook trong VBA


view source
print?

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?

Workbooks(“Workbook Name”).SaveAs([Filename], [FileFormat],


[Password],

[WriteResPassword], [ReadOnlyRecommended], [CreateBackup],

[AccessMode As XlSaveAsAccessMode = xlNoChange],


[ConflictResolution],

[AddToMru], [TextCodepage], [TextVisualLayout], [Local])

Ví dụ: SaveAs Workbook trong VBA


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

Phương thức SaveCopyAs


Với phương thức SaveCopyAs của đối tượng Workbook trong VBA, bạn có thể lưu một bản
sao của Workbook đang mở.

Tại sao cần sử dụng phương thức SaveCopyAS?


Đôi khi bạn muốn lưu bảng tính với những thay đổi và bạn không muốn sửa đổi bảng tính đã
mở. Vì vậy, chỉ cần bạn cần phải sử dụng phương thức ‘SaveCopyAs’ của đối tượng
Workbook.

Cú pháp:
view source
print?

Workbooks(“Workbook Name”).SaveCopyAs([Filename])

Ví dụ: SaveCopyAs Workbook trong VBA


view source
print?

Sub WorkbookSaveCopyAsExample()

ThisWorkbook.SaveCopyAs ThisWorkbook.Path & "\" & "ver1_" &


ThisWorkbook.Name

End Sub

Các thuộc tính của đối tượng Workbook


Dưới đây là các thuộc tính được sử dụng thường xuyên của đối tượng Workbook trong VBA:
Properties Mô tả

Path Để lấy ra đường dẫn tuyệt đối của Workbook.

FullName Để lấy ra tên đầy đủ đối của Workbook.

Sheets Lấy ra một collection của Charts và Worksheets..

Worksheets Để lấy ra tất cả các Worksheet của Workbook.

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

Nội dung chính:


 Các phương thức của đối tượng Worksheet
 Phương thức Activate
 Phương thức Copy
 Phương thức Delete

Các phương thức của đối tượng Worksheet


Dưới đây là các phương thức được sử dụng thường xuyên của đối tượng Worksheet trong
VBA:

Phương thức Mô tả

Activate Để kích hoạt một Worksheet.

Calculate Để làm mới tất cả tính toán trong một Worksheet.

Copy Để copy một Worksheet.

Delete Để xóa một Worksheet.

Move Để di chuyển một Worksheet.


Select Để chọn một Worksheet.

Phương thức Activate


Phương thức Activate của đối tượng Worksheet trong VBA được sử dụng để kích hoạt một
Worksheet cụ thể của một Workbook đang được kích hoạ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.

Ví dụ 1: Activate Worksheet trong VBA với tên của Worksheet


view source
print?

Sub ActiveWorksheetExample1()

' sử dụng tên của một Worksheet

Worksheets("data").Activate

'Or

Sheets("data").Activate
End Sub

Ví dụ 2: Activate Worksheet trong VBA với chỉ số của Worksheet


view source
print?

Sub ActiveWorksheetExample1()

' sử dụng tên của một Worksheet

Worksheets(2).Activate

'Or

Sheets(2).Activate

End Sub

Cách tiếp cận tốt nhất


Lưu ý: Luôn luôn sử dụng tên của Worksheet, thay vì chỉ số của Worksheet. Và cách tiếp cận
tốt nhất là gán Worksheet cho một đối tượng và sau đó làm bất cứ nhiệm vụ nào bạn muốn
làm với đối tượng Worksheet cụ thể đó.

Tạo biến tham chiếu đến Worksheet


Vấn đề: Khi bạn phải làm việc với nhiều Workshet (nhiều sheet), mỗi Workbook có nhiều
Worksheet. Bạn phải sử dụng phương thức Activate với hết Workshet 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.

Giải quyết vấn đề


Để giải quyết vấn đề trên, có một giải pháp cho bạn đó là với mỗi Worksheet bạn tạo ra một
biến tham chiếu. Sau đó, bất cứ khi nào muốn sử dụng (Activate) Worksheet nào bạn chỉ cần
tham chiếu đến biến tương ứng.

Ví dụ:

view source
print?

Sub vidu3()

' khai báo đối tượng wb

Dim wb As Workbook
' khai báo đối tượng ws

Dim wsInput As Worksheet

Dim wsOutput As Worksheet

' gán wb cho active Workbook

Set wb = Application.ActiveWorkbook

' gán wsInput cho đối tượng Worksheet có tên "input"

Set wsInput = wb.Sheets("input")

' gán wsOutput cho đối tượng Worksheet có tên "output"

Set wsOutput = wb.Sheets("output")

End Sub

Xem ví dụ cụ thể tại ví dụ đối tượng Workbook và Worksheet

Phương thức Copy


Phương thức Copy của đối tượng Worksheet trong VBA được sử dụng để sao chép một
Worksheet từ vị trí này sang ví trí khác trong cùng một Workbook hoặc Workbook đang tồn tại
hoặc Workbook mới khác.

Cú pháp:
view source
print?

Sheets(“Worksheet Number”).Copy([Before], [After])

Ví dụ 1: Copy Worksheet trong VBA với Before


Ví dụ sau sao chép sheet “Sheet3” tới vị trí trước sheet đầu tiên trong cùng Workbook. Trường
hợp ‘1’ đại diện cho số chỉ mục Worksheet đầu tiên.
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

Ví dụ 2: Copy Worksheet trong VBA với After


Ví dụ sau sao chép sheet “Sheet3” tới vị trí trước sheet cuối cùng trong cùng Workbook.
Trường hợp Worksheets.Count đại diện cho số chỉ mục Worksheet cuối cùng.

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

Ví dụ 1: Xóa Worksheet trong VBA


Ví dụ sau xóa sheet có tên “Sheet2” từ một Workbook.

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

Ví dụ 2: Xóa Worksheet trong VBA


view source
print?

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.

Ví dụ 3: Xóa Worksheet trong VBA – không hiển thị alert


view source
print?

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.

Nội dung chính:


 Ví dụ đối tượng Range trong Excel VBA
 Đối tượng Range
 Đối tượng Cells
 Khai báo một đối tượng Range
 Các phương thức của đối tượng Range
 Phương thức Select
 Phương thức Copy/Paste
 Phương thức ClearContents
 Phương thức ClearFormats
 Phương thức Clear
 Phương thức Formula
 Các thuộc tính của đối tượng Range
 Thuộc tính Rows
 Thuộc tính Columns
 Thuộc tính Count

Ví dụ đối tượng Range trong Excel VBA


Đối tượng Range
Ví dụ 1: đặt một nút lệnh trên Worksheet và thêm dòng code sau:

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

Đối tượng Cells


Thay vì Range, bạn có thể sử dụng Cells. Sử dụng Cells đặc biệt hữu ích khi bạn muốn lặp
qua các ranges.

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?

Range(Cells(1, 1), Cells(4, 1)).Value = 5

Kết quả:

Khai báo một đối tượng Range


Bạn có thể khai báo một đối tượng Range bằng cách sử dụng các từ khoá Dim và Set.

view source
print?

Dim rangeObj As Range

Set rangeObj = Range("A1:C4")

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ả

Select Để chọn Range được yêu cầu trong Worksheet

AddComment Để thêm bình luận vào Excel Range

AdvancedFilter Áp dụng các bộ lọc nâng cao trên Excel Range

Calculate Để làm mới các phép tính trong Excel Range

Formula Để thêm công thức cho Excel Range

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

Delete Để xóa một Range trong Worksheet

Find Để tìm kiếm và một Cell có dữ liệu cần thiết

Insert Để chèn một dãy các Cell, Row hoặc Column

ListNames Để liệt kê các Excel Range được đặt tên trong bảng tính

Merge Để hợp nhất Excel Range

Paste Để dán dữ liệu

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

Phương thức Select


Một phương pháp quan trọng của đối tượng Range là phương thức Select. Phương thức
Select được sử dụng để chọn một range.

Ví dụ:

view source
print?

Dim rangeObj As Range

Set rangeObj = Range("A1:C4")

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

Phương thức Copy/Paste


Phương thức Copy và Paste sử dụng để sao chép một dãy và dán nó vào một nơi khác trên
Worksheet.

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

Phương thức ClearContents


Phương thức ClearContents được sử dụng để chỉ xóa nội dung của một Excel Range.

Ví dụ:

view source
print?

Range("A1").ClearContents

Hoặc đơn giản hơn bằng cách sử dụng code sau:

view source
print?

Range("A1").Value = ""

Phương thức ClearFormats


Phương thức ClearFormats được sử dụng để chỉ xóa định dạng của một Excel Range.

Phương thức Clear


Phương thức Clear được sử dụng để xóa một Excel Range hoàn toàn bao gồm các định dạng
và dữ liệu.

Phương thức Formula


Phương thức Formula được sử dụng để thêm công thức cho Excel Range.

Ví dụ:

view source
print?

Range("A1").Formula = "=Sum(B1:B5)"

Các thuộc tính của đối tượng Range


Dưới đây là các thuộc tính được sử dụng thường xuyên của đối tượng Range trong VBA:

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.

Count Được sử dụng để đếm số ô, hàng và cột của range.

Thuộc tính Rows


Thuộc tính Rows cho phép truy cập vào một hàng cụ thể của range.

Ví dụ:

view source
print?

Dim rangeObj As Range


Set rangeObj = Range("A1:C4")

rangeObj.Rows(3).Select

Kết quả:

Thuộc tính Columns


Thuộc tính Columns cho phép truy cập vào một cột cụ thể của range.

Ví dụ:

view source
print?

Dim rangeObj As Range

Set rangeObj = Range("A1:C4")

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?

Dim rangeObj As Range

Set rangeObj = Range("A1:C4")

MsgBox rangeObj.Count

Kết quả:

Ví dụ 2:

view source
print?

Dim rangeObj As Range

Set rangeObj = Range("A1:C4")

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

Kiểu giá trị Kích thước Vùng giá trị

Byte 1 byte 0 to 255

Boolean 2 bytes True hoặc False

Integer 2 bytes -32,768 tới 32,767

Long 4 bytes -2,147,483,648 tới 2,147,483,647

LongLong 8 bytes -9,223,372,036,854,775,808 tới


9,223,372,036,854,775,807 (Chỉ hợp lệ trên hệ thống
64-bit.)

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

Double 8 bytes -1.79769313486231E308 tới -4.94065645841247E-324


cho các giá trị âm;
4.94065645841247E-324 tới 1.79769313486232E308
cho các giá trị dương
Currency 8 bytes -922,337,203,685,477.5808 tới
922,337,203,685,477.5807

Decimal 14 bytes +/-79,228,162,514,264,337,593,543,950,335 với số


không có dấu phảy động (.);
+/-7.9228162514264337593543950335 với 28 ký tự
bên phải sau dấu thập phân;
số nhỏ nhất non-zero +/-
0.0000000000000000000000000001

Date 8 bytes January 1, 100 tới December 31, 9999

Object 4 bytes Bất kỳ đối tượng tham chiếu

String (độ 10 bytes + string 0 tới xấp xỉ 2 tỉ


dài thay đổi) length

String (độ Độ dài của String 1 tới xấp xỉ 65,400


dài cố định)

Variant 16 bytes Bất kỳ giá trị số nào


(kiểu số)

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)

Biến trong VBA


Bạn có thể khai báo biến với kiểu dữ liệu cụ thể hoặc KHÔNG cần khai báo biến trong VBA.
VBA luôn tự động lưu các biến vào lần đầu tiên chúng được sử dụng. Những biến được không
được khai báo là một dạng của biến thể của kiểu dữ liệu Variant.

Ví dụ 1: KHÔNG cần khai báo biến trong VBA

view source
print?

n = 100
MsgBox n

Ví dụ 2: Khai báo biến với kiểu dữ liệu cụ thể trong VBA.

view source
print?

Dim str As Integer

str = "Hello VBA!"

MsgBox str

Ví dụ biến trong VBA


Tạo macro file như trong bài này tạo một Macro trong Excel.

Kiểu dữ liệu Integer


view source
print?

Dim x As Integer

x = 6

Range("A1").Value = x

Kết quả:

Kiểu dữ liệu String


view source
print?

Dim str As String

str = "Hello Excel VBA!"

Range("A1").Value = str

Kết quả:

Kiểu dữ liệu Double


Ví dụ 1:

view source
print?

Dim x As Integer

x = 5.5

Range("A1").Value = "x = " & x

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

Range("A1").Value = "x = " & x

Kết quả:

Kiểu dữ liệu Boolean


Ví dụ:

view source
print?

Dim flag As Boolean

flag = True

If flag = True Then


MsgBox "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ử.

Có 4 loại toán tử trong VBA như sau:

 Các toán tử số học


 Các toán tử so sánh
 Các toán tử logic (hoặc quan hệ)
 Các toán tử móc nối

Nội dung chính:


 1. Các toán tử số học
 Các toán tử so sánh
 3. Các toán tử logic (hoặc quan hệ)
 Các toán tử móc nối

1. Các toán tử số học


Bảng dưới đây trình bày các toán tử số học 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ụ

+ Phép cộng hai toán hạng A + B sẽ cho 15

– Phép trừ hai toán hạng A – B sẽ cho -5

* Phép nhân hai toán hạng A * B sẽ cho 50

/ Phép chia lấy phần nguyên hai toán hạng B / A sẽ cho 2

Mod Phép chia lấy phần dư hai toán hạng B Mod A sẽ cho 0

^ Lũy thừa hai toán hạng B ^ A sẽ cho 100000

Các toán tử so sánh


Bảng dưới đây trình bày các toán tử so sánh 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ụ

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

3. Các toán tử logic (hoặc quan hệ)


Bảng dưới đây trình bày các toán tử logic sau được hỗ trợ bởi VBA.

Giả sử biến A có giá trị là 10 và biến B có giá trị là 0, sau đó:

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ụ

+ Cộng hai biến số A + B sẽ cho 15

& Nối hai chuỗi A & B sẽ cho 510

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ụ

+ Cộng hai biến số A + B sẽ cho “Hello


VBA!”

& Nối hai chuỗi A & B sẽ cho “Hello


VBA!”

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.

Nội dung chính:


 Cú pháp của Function trong VBA
 Đặc điểm của Function trong VBA
 Ví dụ Function trong VBA
 Gọi một Function trong VBA
 Gọi một Function trong một Functon khác hoặc trong một Sub khác
 Gọi một Function trong một Cell của Worksheet

Cú pháp của Function trong VBA


Không có định nghĩa kiểu trả về cụ thể:
view source
print?

Function FunctionName([parameter-list])

statement 1

statement 2

statement 3

.......

statement n

End Function

Định nghĩa kiểu trả về cụ thể:

view source
print?

Function FunctionName([parameter-list]) As [data-type]

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.

Đặc điểm của Function trong VBA


Một Function trong VBA có thể có giá trị trả về hoặc không. Điều này là cần thiết nếu bạn
muốn Function trả về một giá trị.

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.

Ví dụ Function trong VBA


Ví dụ: viết một Function tính tích của hai số, với tham số thứ hai là tùy chọn (có thể nhập hoặc
không). Nếu tham số thứ hai không được truyền vào thì Function này trả về tích của số thứ
nhất với chính nó. Ngược lại nếu tham số thứ hai được truyền vào thì Function này trả về tích
của số thứ nhất và thứ hai.

Chỉ rõ kiểu giá trị trả về của function là Double:

view source
print?

Function findArea(Height As Double, Optional Width As Variant) As


Double

If IsMissing(Width) Then

findArea = Height * Height

Else

findArea = Height * Width

End If

End Function

Hoặc không cần chỉ rõ kiểu giá trị trả về của function:

view source
print?

Function findArea(Height As Double, Optional Width As Variant)

If IsMissing(Width) Then

findArea = Height * Height


Else

findArea = Height * Width

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 VBA


Bạn có thể gọi lại function trong một Functon khác hoặc trong một Sub khác, hoặc trong một
Cell của Worksheet.

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

Dim area1 As Double

Dim area2 As Double

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.

Nội dung chính:


 Cú pháp của Sub trong VBA
 Gọi một Sub trong VBA
o Gọi Sub trong một Sub khác
o Gọi Sub trong một Function khác
o Gọi Sub trong Cell của Worksheet thông qua một function
Cú pháp của Sub trong VBA
Sub SubName([parameter-list])

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.

Sub Area(x As Double, y As Double)

MsgBox x * y

End Sub

Gọi một Sub trong VBA


Bạn có thể gọi lại Sub trong một Functon khác hoặc trong một Sub khác.

Bạn có thể sử dụng hoặc không cần sử dụng từ khóa Call để gọi Sub.

Gọi Sub trong một Sub khác


Ví dụ:

Sub ClickButton()

Call Area(10, 10)

End Sub

Gọi Sub trong một Function khác


Ví dụ:

Function findArea(height As Double, Optional width As Double)

If IsMissing(width) Then

Call Area(height, height)

Else

Call Area(height, width)


End If

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.

Nội dung chính:


 Cú pháp
 Ví dụ khối lệnh With-End With trong VBA

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.

Ví dụ khối lệnh With-End With trong VBA


Ví dụ 1: thiết lập màu background và giá trị cho range bằng khối lệnh With.

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.

Public Sub selectInputFile()


Dim fd As Office.FileDialog

Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd

.AllowMultiSelect = False
.InitialFileName = Application.ActiveWorkbook.path & "\"
.Filters.Clear
.Filters.Add "Excel 2007", "*.xlsx"
.Filters.Add "All Files", "*.*"

If .Show = True Then


SelectedFile = .SelectedItems(1)
End If
End With
End Sub
Kết quả:
Nội dung bài học:

 Khai báo mảng trong VBA


 Gán giá trị cho mảng trong VBA
 Mảng đa chiều trong VBA
 Mảng động trong VBA
 Các phương thức xử lý mảng trong VBA

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.

Nội dung chính:


 1. Khai báo mảng trong VBA
 2. Gán giá trị cho mảng
 3. Mảng đa chiều trong VBA
 5. Các phương thức xử lý mảng trong VBA
 Phương thức LBound
 Phương thức UBound
 Phương thức Split
 Phương thức Join
 Phương thức Filter
 Phương thức IsArray
 Phương thức Erase

1. Khai báo mảng trong VBA


Mảng được khai báo giống như một biến kết hợp sử dụng dấu ngoặc đơn.

view source
print?

' Method 1: khai báo mảng không kích thước

Dim arr1()

' Method 2: khai báo mảng có kích thước

Dim arr2(5)

' Method 3: Sử dụng phương thức Array

Dim arr3

arr3 = Array("Java","C++","PHP")

' Method 4: chỉ định rõ kiểu giá trị của mảng

Dim arr4() As String

Các tính chất của mảng trong VBA

 Chỉ số mảng không được âm.


 Chỉ số mảng bắt đầu từ 0 (ZERO).
 Các mảng VBA có thể lưu trữ bất kỳ loại biến nào trong một mảng. Do đó, một mảng
có thể lưu trữ một số nguyên, chuỗi hoặc các ký tự trong một biến mảng.
2. Gán giá trị cho mảng
Các giá trị được gán cho mảng bằng cách chỉ định một giá trị chỉ số mảng với mỗi một giá trị
được gán.

 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

Dim arr(5) ' Khai bao mang

arr(0) = "1" ' String

arr(1) = "VBScript" ' String

arr(2) = 100 ' Number

arr(3) = 2.45 ' Decimal Number

arr(4) = #10/7/2013# ' Date

arr(5) = #12:45:00 PM# ' Time

' duyet cac phan tu cua mang

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

Gia tri duoc luu trong Array co index 0: 1


Gia tri duoc luu trong Array co index 1: VBScript
Gia tri duoc luu trong Array co index 2: 100
Gia tri duoc luu trong Array co index 3: 2.45
Gia tri duoc luu trong Array co index 4: 7/10/2013
Gia tri duoc luu trong Array co index 5: 12:45:00 PM

3. Mảng đa chiều trong VBA


Mảng trong VBA không chỉ giới hạn trong một chiều, mà chúng có thể có tối đa 60 chiều. Các
mảng hai chiều là những mảng được sử dụng phổ biến nhất.

Ví dụ
view source
print?
Sub arrayExample2()

Dim arr(2, 3) As Variant ' mang arr co 3 hang va 4 cot

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

4. Mảng động trong VBA


Từ khóa ReDim được sử dụng để khai báo mảng động trong VBA và phân bổ hoặc tái phân bổ không gian
lưu trữ.
Cú pháp
view source
print?
ReDim [Preserve] arrayName(new_size)
Trong đó:
Preserve: Một tham số tùy chọn, được sử dụng để bảo toàn dữ liệu trong một mảng hiện có khi bạn thay
đổi kích thước của mảng.
arrayName: Một tham số bắt buộc, là tên của biến mảng.
new_size : Một tham số bắt buộc, cho biết kích thước của mảng.

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 a() As Variant

Dim i As Integer

ReDim a(5)

a(0) = "XYZ"

a(1) = 41.25

a(2) = 22

ReDim Preserve a(7)

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.

5. Các phương thức xử lý mảng trong VBA


Có nhiều phương thức có sẵn trong VBA giúp các nhà phát triển xử lý các mảng một cách hiệu quả. Tất
cả các phương thức được sử dụng kết hợp với các mảng được liệt kê dưới đây. Xem chi tiết bằng cách
click vào tên của phương thức.
No. Mô tả chức năng

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.

Phương thức LBound


LBound trả về chỉ số nhỏ nhất của mảng được chỉ định. Do đó, LBound của mảng là ZERO.
Cú pháp
view source
print?
LBound(ArrayName[,dimension])

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

arr(0) = "1" ' String

arr(1) = "VBScript" ' String

arr(2) = 100 ' Number

arr(3) = 2.45 ' Decimal Number

arr(4) = #10/7/2013# ' Date

arr(5) = #12:45:00 PM# ' Time

MsgBox ("Chi so nho nhat cu mang arr la: " & LBound(arr))

' TH mang da chieu:

Dim arr2(3, 2) As Variant

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

Chi so nho nhat cu mang arr la: 0


Chi so nho nhat cua chieu dau tien cua mang arr2 la: 0
Chi so nho nhat cua chieu thu hai cua mang arr2 la: 0

Phương thức UBound


LBound trả về chỉ số lớn nhất của mảng được chỉ định. Do đó, giá trị này tương ứng với kích thước của
mảng.
Cú pháp
view source
print?
UBound(ArrayName[,dimension])

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

Dim arr(5) As Variant

arr(0) = "1" ' String

arr(1) = "VBScript" ' String

arr(2) = 100 ' Number

arr(3) = 2.45 ' Decimal Number

arr(4) = #10/7/2013# ' Date

arr(5) = #12:45:00 PM# ' Time

MsgBox ("Chi so nho nhat cu mang arr la: " & UBound(arr))
' For MultiDimension Arrays :

Dim arr2(3, 2) As Variant

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

Chi so nho nhat cu mang arr la: 5


Chi so nho nhat cua chieu dau tien cua mang arr2 la: 3
Chi so nho nhat cua chieu thu hai cua mang arr2 la: 2

Phương thức Split


Phương thức Split trả về một mảng có chứa một số giá trị cụ thể được phân chia dựa trên dấu phân
cách.
Cú pháp
view source
print?
Split(expression[,delimiter[,count[,compare]]])

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.

 0 = vbBinaryCompare: Thực hiện phép so sánh nhị phân.


 1 = vbTextCompare – Thực hiện so sánh văn bản.

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

a = Split("Red $ Blue $ Yellow", "$")

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

Gia tri trong mang co index 0 la:Red


Gia tri trong mang co index 0 la: Blue
Gia tri trong mang co index 0 la: Yellow
Phương thức Join
Phương thức 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.
Cú pháp
view source
print?
Join(ArrayName[,delimiter])

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

' Join su dung dau phan cach space

a = Array("Red", "Blue", "Yellow")

b = Join(a)

MsgBox ("Ket qua join khong su dung dau phan cach: b = " &
b)

' Join su dung dau phan cach $

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

Phương thức Filter


Phương thức Filter trả 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ể.
Cú pháp
view source
print?
Filter(inputstrings,value[,include[,compare]])

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.

 0 = vbBinaryCompare: Thực hiện phép so sánh nhị phân.


 1 = vbTextCompare – Thực hiện so sánh văn bản.

Ví dụ

view source
print?
Sub FilterArrayExample()

Dim a, b, c, d As Variant

a = Array("Red", "Blue", "Yellow")


b = Filter(a, "B")

c = Filter(a, "e")

d = Filter(a, "Y")

For Each x In b

MsgBox ("Ket qua Filter 1: " & x)

Next

For Each y In c

MsgBox ("Ket qua Filter 2: " & y)

Next

For Each z In d

MsgBox ("Ket qua Filter 3: " & z)

Next

End Sub

Kết quả:

Ket qua Filter 1: Blue


Ket qua Filter 2: Red
Ket qua Filter 2: Blue
Ket qua Filter 2: Yellow
Ket qua Filter 3: Yellow

Phương thức IsArray


Phương thức IsArray trả về một giá trị boolean cho biết biến đầu vào có là mảng hay không.
Cú pháp
view source
print?
IsArray(ArrayName)

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

a = Array("Red", "Blue", "Yellow")

b = "12345"

MsgBox ("a la mot mang: " & IsArray(a))

MsgBox ("b la mot mang: " & IsArray(b))

End Sub

Kết quả:

a la mot mang: True


b la mot mang: False
Phương thức Erase
Phương thức Erase được sử dụng để đặt lại các giá trị của các mảng kích thước cố định và giải phóng bộ
nhớ của mảng động. Nó hoạt động tùy thuộc vào loại mảng.
Cú pháp
view source
print?
Erase ArrayName

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

ReDim dynamicArray(9) ' phan bo khong gian luu tru.

Erase numArray ' cac phan tu duoc khoi tao.


Erase dynamicArray ' giai phong bo nho duoc su dung
boi array.

' tat ca cac gia tri da bi xoa

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

Gia tri thu nhat cua NumArray la:


Gia tri thu hai cua NumArray la:
Gia tri thu ba cua NumArray la:
Gia tri thu bon cua NumArray la:

Nội dung bài học:

 Add reference “Microsoft Scripting Runtime” (* bắt buộc).


 Hướng dẫn nhanh về việc sử dụng Collection trong VBA.
 Ví dụ về Collection trong VBA.
 Phương thức Add trong Collection.
 Ưu/Nhược điểm của Collection trong VBA.

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.

Nội dung chính:


 1. Add reference “Microsoft Scripting Runtime”
 2. Hướng dẫn nhanh về việc sử dụng Collection
 3. Ví dụ về Collection trong VBA
 4. Phương thức Add trong Collection
 5. Ưu/Nhược điểm của Collection trong VBA
 Ưu điểm
 Nhược điểm

1. Add reference “Microsoft Scripting Runtime”


Trước tiên, để sử dụng Collection trong VBA, bạn cần phải add reference “Microsoft Scripting
Runtime”, các bước thực hiện như sau:

 1. Mở VB Editor(Alt + F11).
 2. Tools –> References…
 3. Chọn “Microsoft Scripting Runtime”.

 4. Click OK.

2. Hướng dẫn nhanh về việc sử dụng Collection


Dưới đây là bảng hướng dẫn sử dụng nhanh collection trong VBA.
Task Examples

Khai báo Dim coll As Collection

Khởi tạo lúc run time Set coll = New Collection

Khai báo và khởi tạo Dim coll As New Collection

Add phần tử vào Collection coll.Add “Apple”

Truy cập phần tử coll(1) hoặc coll(2)

Truy cập phần tử đầu tiên coll(1)

Truy cập phần tử cuối cùng coll(coll.Count)

Get số lượng phần tử coll.Count

Truy cập tất cả các phần tử (For) Dim i As Long


For i = 1 To coll.Count
Debug.Print coll(i)
Next i

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

Remove phần tử coll.Remove(1)

Remove tất cả các phần tử Set coll = Nothing


(Dim coll As New Collection) coll.Add “Apple”

Remove tất cả các phần tử Set coll = Nothing


(Dim coll As Collection Set coll = New Collection
Set coll = New Collection) coll.Add “Apple”

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

' khai bao collection fruitColl

Dim fruitColl As Collection

' khoi tao coll

Set fruitColl = New Collection

' Add cac phan tu vao coll

fruitColl.Add "Apple"

fruitColl.Add "Mango"

fruitColl.Add "Lemon"

fruitColl.Add "Coconut"

' phan tu dau tien

MsgBox "Phan tu dau tien: " & fruitColl(1)

' phan tu cuoi cung

MsgBox "Phan tu cuoi cung: " & fruitColl(fruitColl.Count)


' truy cap cac phan tu (For)

For i = 1 To fruitColl.Count

MsgBox "Phan tu " & i & ": " & fruitColl(i)

Next i

' xoa phan tu dau tien

fruitColl.Remove (1)

MsgBox "So phan tu con lai: " & fruitColl.Count

' xoa tat ca phan tu

Set fruitColl = Nothing

' fruitColl.Add "Apple" ' error vi fruitColl da bi xoa

End Sub

Kết quả:

Phan tu dau tien: Apple


Phan tu cuoi cung: Coconut
Phan tu 1: Apple
Phan tu 2: Mango
Phan tu 3: Lemon
Phan tu 4: Coconut
So phan tu con lai: 3

4. Phương thức Add trong Collection


Phương thức Add được sử dụng để thêm mới phần tử vào collection.
Cú pháp:

view source
print?

Add (Item, [Key], [Before], [After])

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

Dim fruitColl As New Collection

' add phan tu vao fruitColl

fruitColl.Add Item:="Apple", Key:="A"

fruitColl.Add Item:="Coconut", Key:="C", Before:=1

fruitColl.Add Item:="Orange", Key:="O", After:="C"

' hien thi cac phan tu theo index

MsgBox "phan tu so 1: " & fruitColl(1)

MsgBox "phan tu so 2: " & fruitColl(2)


MsgBox "phan tu so 3: " & fruitColl(3)

' hien thi cac phan tu theo key

MsgBox "phan tu ""a"": " & fruitColl("a")

MsgBox "phan tu ""C"": " & fruitColl("C")

MsgBox "phan tu ""O"": " & fruitColl("O")

' hien thi cac phan tu bang phuong thuc Item() theo index

MsgBox "phan tu Item(1): " & fruitColl.Item(1)

MsgBox "phan tu Item(2): " & fruitColl.Item(2)

MsgBox "phan tu Item(3): " & fruitColl.Item(3)

' xoa collection

Set fruitColl = Nothing

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.

5. Ưu/Nhược điểm của Collection trong VBA


Ưu điểm
Dễ sử dụng, không cần phải khai báo kích thước trước khi sử dụ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.

Nội dung bài học:

 Add reference “Microsoft Scripting Runtime” (* bắt buộc).


 Hướng dẫn nhanh về việc sử dụng Dictionary trong VBA.
 Ví dụ về Dictionary trong VBA.

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

1. Kiểm tra Key đã tồn tại chưa.


2. Có thể thay đổi giá trị của phần tử.

Nội dung chính:


 1. Add reference “Microsoft Scripting Runtime” (* bắt buộc).
 2. Hướng dẫn nhanh về việc sử dụng Dictionary trong VBA.
 3. Ví dụ về Dictionary trong VBA.

1. Add reference “Microsoft Scripting Runtime” (* bắt


buộc).
Trước tiên, để sử dụng Dictionary trong VBA, bạn cần phải add reference “Microsoft Scripting
Runtime”, các bước thực hiện giống như trong bài Collection trong VBA.

2. Hướng dẫn nhanh về việc sử dụng Dictionary trong VBA.


Hàm VLookup trong Excel hoạt động tương tự như một Dictionary. Bạn có thể tra một giá trị
dựa trên một key duy nhất.

Dưới đây là bảng hướng dẫn sử dụng nhanh collection trong VBA.

Task Example

Khai báo và khởi tạo (early Dim dict As Scripting.Dictionary


binding) Set dict = New Scripting.Dictionary

Khai báo và khởi tạo (late Dim dict As Object


binding) Set dict = CreateObject(“Scripting.Dictionary”)

Add phần tử mới dict.Add Key, Value


e.g. dict.Add “Apples”, 50

Chay đổi giá trị của một key. Tự dict(Key) = Value


động thêm mới nếu key chưa e.g. dict(“Oranges”) = 60
tồn tại

Lấy ra một giá trị từ dictionary Value = dict(Key)


bằng việc sử dụng key e.g. appleCount = dict(“Apples”)

Check key tồn tại dict.Exists(Key)


e.g. If dict.Exists(“Apples”) Then

Remove phần tử dict.Remove Key


e.g. dict.Remove “Apples”

Remove tất cả các phần tử dict.RemoveAll

Duyệt các phần tử (For Each) Dim key As Variant


For Each key In dict.Keys
Task Example

Debug.Print key, dict(key)


Next key

Duyệt các phần tử (for loop – Dim i As Long


chỉ TH early binding) For i = 0 To dict.Count – 1
Debug.Print dict.Keys(i), dict.Items(i)
Next i

Lấy số phần tử của dict dict.Count

Thiết lập key phân biệt hoa dict.CompareMode = vbBinaryCompare


thường (dictionary phải là
empty).

Thiết lập key không phân biệt dict.CompareMode = vbTextCompare


hoa thường (dictionary phải là
empty).

3. Ví dụ về Dictionary trong VBA.


Dưới đây là ví dụ tra từ điển các loại quả trong tiếng anh bằng việc sử dụng đối tượng
Dictionary.

view source
print?

Sub dictionaryExample1()

' khoi tao dictionary dict

Dim dict As New Scripting.Dictionary

' thiet lap key khong phan biet hoa thuong

dict.CompareMode = vbTextCompare
' add phan tu vao dict

dict.Add Key:="Apple", Item:="Qua Tao"

dict.Add Key:="Peach", Item:="Qua Dao"

dict.Add Key:="Plum", Item:="Qua Man"

dict.Add Key:="Orange", Item:="Qua Cam"

dict.Add Key:="Lemon", Item:="Qua Chanh"

dict.Add Key:="Cucumber", Item:="Qua Dua Chuot"

Dim sFruit As String

' Ask user to enter fruit

sFruit = InputBox("Enter fruit: ")

' check fruit ma nguoi dung nhap trong dict

If dict.Exists(sFruit) Then

MsgBox sFruit & " nghia la " & dict(sFruit)

Else

MsgBox sFruit & " khong ton tai."

End If

' xoa dict de giai phong bo nho


Set dict = Nothing

End Sub

Kết quả:

Nhập “lemon” -> click OK.

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.

Nội dung chính:


 Các khái niệm trong Debug
 Làm thế nào để debug
 Các phím tắt để Debug
 Ví dụ Debug trong Excel VBA

Các khái niệm trong Debug


Breakpoint – là điểm tạm ngưng chương trình.
Làm thế nào để debug
Trong VBA không phân biết chế độ Debug và chế độ Run, có nghĩa để Debug thì bạn chỉ cần tạo
các Breakpoint rồi run bình thường.

Để tạo Breakpoint, bạn phải thực hiện theo các thao tác sau:

 Mở màn hình VBA editor (Ctrl + F11).


 Click vào thanh nề trái (hoặc F9) để Add/Remove Breakpoint.

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.

Các phím tắt để Debug


Dưới đây là các phím tắt để Debug trong Excel VBA:

 F9: Add/Remove Breakpoint.


 F5: nhảy đến breakpoint tiếp theo.
 F8: nhảy đến câu lệnh tiếp tiếp.
 Ctrl + F8: nhảy đến câu lệnh tiếp theo hoặc vị trí con trỏ chuột.
 Shift + F8: thoát ra khởi hàm hoặc nhảy đến câu lệnh tiếp theo.
 Ctrl + Shift + F8: nhảy đến Breakpoint tiếp theo.
 Ctrl + W: chỉnh sửa chế độ xem giá trị của biến.

Ví dụ Debug trong Excel VBA


Sử dụng ví dụ trong bài Dictionary trong VBA để Debug.

Add các Breakpoint.


Run chương trình.
Nhấn F5 -> nhấn F5 -> Nhập giá trị “lemon” -> click OK.

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

Nội dung chính:


 1. Các loại lỗi
 Lỗi cú pháp
 Lỗi runtime
 Lỗi Logic
 Xử lý lỗi trong VBA
 Xử lý lỗi cú pháp
 Xử lý lỗi runtime

1. Các loại lỗi


Có ba loại lỗi trong lập trình:

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

Xử lý lỗi trong VBA


Xử lý lỗi cú pháp
Trình VBA Editor trong Excel hỗ trợ xử lý lỗi cú pháp, khi biên dịch trình Editor sẽ chỉ cho bạn
vị trí của những lỗi cú pháp.

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

Dim str As String

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?

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

No. Từ khóa & Mô tả

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

Đối tượng Err


Đối tượng này được sử dụng để lấy ra thông tin lỗi, ví dụ Err.Number cung cấp mã số lỗi và
Err.Description cung cấp cho các mô tả lỗi.

Ví dụ xử lý lỗi trong VBA


Ví dụ cho một bảng tính, tính căn bậc hai của các giá trị của cell A1 đến A5 và điền vào cell B1
đến B5 tương ứng.

view source
print?

Option Explicit
Public Const COL_A = "A"

Public Const COL_B = "B"

Sub ErrorHanlding_Demo()

Dim i As Integer

On Error GoTo InvalidValue:

For i = 1 To 5

Cells(i, COL_B).Value = Sqr(Cells(i, COL_A).Value)

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:

Lỗi 1: không thể tính căn bậc hai của số âm.

Lỗi 2: kiểu dữ liệu không phù hợp.

Kết quả tính căn bậc hai:

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.

Ví dụ truyền tham chiếu và giá trị


Dưới đây là ví dụ truyền tham chiếu và giá trị trong VBA.

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

Sub PassByReference(ByRef test As Integer)


' value cung bi thay doi ben ngoai thu tuc
test = 100
End Sub

Sub PassByValue2(test As Integer)


' value chi bi thay doi ben trong thu tuc
test = 200
End Sub
Kết quả:

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

Nội dung chính:


 1. Mệnh đề if
 2. Mệnh đề if-else
 3. Mệnh đề if-elseif-else
 4. Mệnh đề if lồng nhau
1. Mệnh đề if
Mệnh đề if được sử dụng để kiểm tra giá trị dạng boolean của điều kiện. Khối lệnh sau if được
thực thi nếu giá trị của điều kiện là True

Cú pháp:

view source
print?

If (condition) Then

' statement

End If

Ví dụ:

view source
print?
Sub viduIf()

Dim age As Integer

age = 20

If (age >= 18) Then

MsgBox "Du tuoi lao dong."

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

' khối lệnh này được thực thi


' nếu condition là true

Else

' khối lệnh này được thực thi

' nếu condition = false

End If

Ví dụ:

view source
print?

Sub viduIfElse1()

Dim number As Integer

number = 13

If (number Mod 2 = 0) Then

MsgBox "number " & number & " la so chan."

Else

MsgBox "number " & number & " la so le."

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

' khối lệnh này được thực thi

' nếu condition1 là true

ElseIf (condition2) Then

' khối lệnh này được thực thi

' nếu condition2 là true

ElseIf (condition3) Then

' khối lệnh này được thực thi

' nếu condition3 là true

...
Else

' khối lệnh này được thực thi

' nếu tất cả những điều kiện trên là false

End If

Ví dụ:

view source
print?

Sub viduIfElse2()

Dim marks As Integer

marks = 75

If (marks < 50) Then

MsgBox "Tach!"

ElseIf (marks >= 80 And marks < 90) Then

MsgBox "Xep loai B"

ElseIf (marks >= 90 And marks < 100) Then

MsgBox "xep loai A"

Else

MsgBox "Xep loai TB"

End If

End Sub
Kết quả:

4. Mệnh đề if lồng nhau


Một câu lệnh If hoặc ElseIf bên trong câu lệnh If hoặc ElseIf khác được biết đến như là mệnh
đề if lồng nhau. Các câu lệnh if bên trong được thực thi dựa trên các câu lệnh if bên ngoài.

Ví dụ:

view source
print?

Sub viduNestedIf()

Dim a As Integer

a = 23

If a > 0 Then

MsgBox "Number la mot so duong"

If a = 1 Then

MsgBox "Number = 1"

ElseIf a = 2 Then
MsgBox "Number = 2"

ElseIf a = 3 Then

MsgBox "Number = 3"

Else

MsgBox "Number khong phai la 0,1,2 hoac 3"

End If

ElseIf a < 0 Then

MsgBox "Number la mot so am"

Else

MsgBox "Number la so 0"

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.

Nội dung chính:


 Cú pháp
 Ví dụ về vòng lặp for trong VBA
 Ví dụ về thoát vòng lặp for trong VBA

Cú pháp
Dưới đây là cú pháp của một vòng lặp for trong VBA.

view source
print?

For counter = start To end [Step stepcount]

[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ả:

Gia tri cua i la: 0


Gia tri cua i la: 2
Gia tri cua i la: 4
Gia tri cua i la: 6
Gia tri cua i la: 8
Gia tri cua i la: 10
Ví dụ 2: Sử dụng từ khóa Step -2 để giảm biến đếm 2 đơn vị sau mỗi vòng lặp.

view source
print?

Sub ForExample2()

Dim i As Integer

For i = 10 To 0 Step -2

MsgBox "Gia tri cua i la: " & i

Next

End Sub

Kết quả:

Gia tri cua i la: 10


Gia tri cua i la: 8
Gia tri cua i la: 6
Gia tri cua i la: 4
Gia tri cua i la: 2
Gia tri cua i la: 0
Ví dụ 3: không cần sử dụng từ khóa Step, biến đếm i tăng dần từ 1 đến 5.

view source
print?

Sub ForExample3()

Dim i As Integer

For i = 1 To 5

MsgBox "Gia tri cua i la: " & i

Next

End Sub

Kết quả:

Gia tri cua i la: 1


Gia tri cua i la: 2
Gia tri cua i la: 3
Gia tri cua i la: 4
Gia tri cua i la: 5

Ví dụ về thoát vòng lặp for trong VBA


Từ khóa Exit For được sử dụng để thoát vòng lặp for trong VBA.

Ví dụ:

view source
print?

Sub ForExample4()

Dim i As Integer
For i = 0 To 10

If i > 3 Then

Exit For

Else

MsgBox "Gia tri cua i la: " & i

End If

Next

End Sub

Kết quả:

Gia tri cua i la: 0


Gia tri cua i la: 1
Gia tri cua i la: 2
Gia tri cua i la: 3

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.

Nội dung chính:


 Cú pháp
 ví dụ về vòng lặp For Each trong VBA

Cú pháp
Dưới đây là cú pháp của một vòng lặp For Each trong VBA.

For Each element In Group


[statement 1]
[statement 2]
....
[statement 10]
[Exit For]
[statement 11]
[statement 12]
[statement n]
Next

ví dụ về vòng lặp For Each trong VBA


Sub ForEachExample()
' khai bao mang fruits
fruits = Array("apple", "orange", "mango")
Dim fruitNames As Variant

' duyet mang fruits su dung vong lap For Each.


For Each Item In fruits
fruitNames = fruitNames & Item & vbCrLf
Next

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.

Nội dung chính:


 Cú pháp
 Ví dụ về vòng lặp While-Wend trong VBA

Cú pháp
While (condition)
' Khối lệnh được lặp lại
' cho đến khi condition = False
Wend

Ví dụ về vòng lặp While-Wend trong VBA


Sub whileWendExample()
Dim counter As Integer

counter = 10
While counter < 15
MsgBox "Gia tri hien tai cua counter la: " & counter
counter = counter + 1
Wend
End Sub
Kết quả:

Gia tri hien tai cua counter la: 10


Gia tri hien tai cua counter la: 11
Gia tri hien tai cua counter la: 12
Gia tri hien tai cua counter la: 13
Gia tri hien tai cua counter la: 14
Vòng lặp Do-While 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à True. Điều kiện có thể được kiểm tra ở đầu vòng lặp hoặc ở cuối vòng lặp.

Nội dung chính:


 Cú pháp: kiểm tra điều kiện ở cuối vòng lặp
 Cú pháp: kiểm tra điều kiện ở đầu vòng lặp

Cú pháp: kiểm tra điều kiện ở cuối vòng lặp


Dưới đây là cú pháp của vòng lặp Do-While trong VBA với điều kiện được kiểm tra ở cuối
vòng lặp.

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]

Loop While condition


Ví dụ 1:

view source
print?

Sub doWhileExample1()

Dim counter As Integer

counter = 1

Do

MsgBox "Gia tri hien tai cua counter la: " & counter

counter = counter + 1

Loop While counter < 1

End Sub

Kết quả:
Gia tri hien tai cua counter la: 1

Cú pháp: kiểm tra điều kiện ở đầu vòng lặp


Dưới đây là cú pháp của vòng lặp Do-While trong VBA với điều kiện được kiểm tra ở đầu vòng
lặp.

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

Dim counter As Integer


counter = 1

Do While counter < 5

MsgBox "Gia tri hien tai cua counter la: " & counter

counter = counter + 1

Loop

End Sub

Kết quả:

Gia tri hien tai cua counter la: 1


Gia tri hien tai cua counter la: 2
Gia tri hien tai cua counter la: 3
Gia tri hien tai cua counter la: 4

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.

Nội dung chính:


 Cú pháp: kiểm tra điều kiện ở cuối vòng lặp
 Cú pháp: kiểm tra điều kiện ở đầu vòng lặp

Cú pháp: kiểm tra điều kiện ở cuối vòng lặp


Dưới đây là cú pháp của vòng lặp Do-Until trong VBA với điều kiện được kiểm tra ở 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]

Loop Until condition

Ví dụ 1:
view source
print?

Sub doUntilExample1()

Dim counter As Integer

counter = 1

Do

MsgBox "Gia tri hien tai cua counter la: " & counter

counter = counter + 1

Loop Until counter > 1

End Sub

Kết quả:

Gia tri hien tai cua counter la: 1

Cú pháp: kiểm tra điều kiện ở đầu vòng lặp


Dưới đây là cú pháp của vòng lặp Do-Until trong VBA với điều kiện được kiểm tra ở đầu vòng
lặp.

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

Dim counter As Integer

counter = 1

Do Until counter > 5

MsgBox "Gia tri hien tai cua counter la: " & counter

counter = counter + 1

Loop

End Sub

Kết quả:

Gia tri hien tai cua counter la: 1


Gia tri hien tai cua counter la: 2
Gia tri hien tai cua counter la: 3
Gia tri hien tai cua counter la: 4
Gia tri hien tai cua counter la: 5
Mệnh đề Select-Case trong VBA được sử dụng để thực thi 1 hoặc nhiều khối lệnh từ nhiều điều
kiện.

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.

Nội dung chính:


 Cú pháp mệnh đề Select-Case trong VBA
 Ví dụ mệnh đề Select-Case trong VBA

Cú pháp mệnh đề Select-Case trong VBA


Dưới đây là cú pháp mệnh đề Select-Case trong VBA:

Select Case expression


Case expressionlist1
statement1
statement2
....
Case expressionlist2
statement1
statement2
....
Case expressionlistn
statement1
statement2
....
Case Else
elsestatement1
elsestatement2
....
End Select
Ví dụ mệnh đề Select-Case trong VBA
Dưới đây là ví dụ về mệnh đề Select-Case trong VBA:

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

So nguyen duong nho nhat.

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@#"

Nội dung chính:


 Nối chuỗi trong VBA
 Các hàm xử lý chuỗi trong VBA

Nối chuỗi trong VBA


Để cộng 2 chuỗi trong VBA, bạn có thể sử dụng toán tử + hoặc &.

Ví dụ:
view source
print?

Sub StringExample1()

Dim str1 As String

Dim str2 As String

Dim str As String

str1 = "Hello "

str2 = "VBA!"

str = str1 + str2

MsgBox str & " 1"

MsgBox str + " 2"

End Sub

Kết quả:

Hello VBA! 1
Hello VBA! 2

Các hàm xử lý chuỗi trong VBA


Có các hàm VBA String có sẵn giúp các nhà phát triển làm việc với các chuỗi rất hiệu quả.
Dưới đây là các hàm VBA String được hỗ trợ trong VBA.

No. Hàm & Mô tả


1 InStr
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ừ trái
sang phải.

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.

Nội dung chính:


 Các hàm xử lý Date
 Các hàm xử lý Time

Các hàm xử lý Date


Bảng dưới đây thể hiện danh sách các hàm xử lý Date trong VBA.

No. Hàm & Mô tả

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.

Các hàm xử lý Time


Bảng dưới đây thể hiện danh sách các hàm xử lý Time trong VBA.

No. Hàm & Mô tả


1 Now
trả về ngày và giờ hệ thống hiện tại.

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.

You might also like