Em cũng không rành chỗ này bác. Vậy nó làm nhiệm vụ gì và nếu không có câu lệnh ấy thì sao mà thấy ai cũng viết như vậy?
ws được khai báo kiểu Worksheet, tức là một loại Object.
Trong workbook có một mớ đối tượng dạng worksheet. Sheet1 được mặc định là biến trỏ vào sheet đầu tiên (tạm gọi ở đây là 'sheet-1')
Set ws = Sheet1
là trỏ thêm ws vào đối tượng 'sheet-1'. Tức là cả ws và Sheet1 đều trỏ vào 'sheet-1'.
Nothing trong VBA là một tình trạng "không xác định".
Set ws = Nothing tức à đưa nó về tình trạng không xác định (có thể coi như là không trỏ vào cái gì cả).
Công dụng:
Hệ thống dọn rác trong VBA có nhiệm vụ dọn và lấy lại bộ nhớ trước đó được chiếm hữu bởi những biến và bây giờ không sử dụng nữa.
VBA mặc định rằng nếu đối tượng nào không còn con trỏ nào trỏ vào thì coi như nó không còn sử dụng. Và VBA sẽ dọn nó, lấy lại bộ nhớ.
Việc dọn rác này khá quan trọng với các đối tượng được dựng lên do lệnh New, hàm CreateObject,...
Set x = CreateObject("object gì đó") là lệnh dựng lên một đối tượng "object gì đó" và trỏ biến x vào.
Set y = x là lệnh trỏ y vào cùng đối tượng với x.
Set x = Nothing tách x ra khỏi cái "object gì đó" ở trên.
Tuy nhiên bộ phận dọn rác vẫn chưa giải phóng "object gì đó" là bởi vì VBA biết y vẫn còn trỏ vào đấy.
Set y = Notinhg tách y ra khỏi "object gì đó".
Bây giờ thì không còn gì trỏ vào, "object gì đó" sẽ được VBA giải phóng.
Công dụng thứ nhất:
Giải phóng đối tượng. Như giải thích trên.
Công dụng thứ hai:
Tách biến ra khỏi đối tượng. Như ở bài #9.
Trong bài #9, biến ws là biến nội. Khi End Sub thì biến nội tự động bị diệt, và ws không còn tồn tại để trỏ vào Sheet1 nữa. Vì vậy, trên hiện tại ở bài #9, lệnh Set ws = Nothing không quan trọng lắm.
Tuy nhiên, đối với một người viết code chia ra nhiều sub's và function's thì Set biến = Nothing khi không cần nó nữa là một thói quen tốt.
1. code dễ copy paste từ đoạn này sang đoạn khác, từ sub/function này sang sub/function khác.
2. nếu ws là biến toàn cục thì việc Set nó về Nothing sau khi sử dụng là việc cần thiết để tránh rắc rối sau này.