Các sự kiện và thao tác với Workbook bằng VBA

Các thao tác như mở, đóng hay tự động lưu File Excel (Workbook) thì Excel đã có sẵn. Nhưng bạn có biết, VBA cũng có thể thực hiện các thao tác đó.

Tuy vậy, khi chỉ làm việc với một Workbook thì các hàm thực hiện các thao tác đó có vẻ hơi phức tạp. Mà ở đây, mình muốn đề cập với bạn là thao tác đến một Workbook khác từ Workbook mà bạn đang làm việc.

Vậy để rõ hơn thì trong bài viết này, mình sẽ chia sẻ với bạn về các sự kiện phổ biến trong Workbook và cách thao tác đóng, mở và lưu Workbook khác từ một Workbook.

Các sự kiện và thao tác với Workbook bằng VBA

Cũng giống như Worksheet, Workbook trong VBA sẽ hỗ trợ nhiều sự hiện. Nhưng trong bài này, mình sẽ tổng hợp một số sự kiện và thao tác với Workbook phổ biến khi sử dụng VBA.

Sự kiện Workbook_Open()

Cách sử dụng:

  • Sự kiện Workbook_Open() sẽ thực hiện ngay khi bạn mở một Workbook.

⚠ Tuy vậy, nếu bạn chưa cho phép Workbook tự động chạy Macro thì sự kiện sẽ không thực thi, cho đến lúc bạn cho phép chạy tự động chạy Macro mỗi khi mở.

Khai báo:

💡 Lưu ý: Đối với các sự kiện của Workbook thì bạn sẽ phải khai báo trong ThisWorkbook.

workbook-vba-excel-166-1
Private Sub Workbook_Open()
End Sub
Code language: VB.NET (vbnet)

Ví dụ: Tạo một bảng thông báo nhắc lịch mỗi khi mở Workbook.

Cách thực hiện: Là bạn sẽ cần một cột ngày (định dạng Date) và trong sự kiện Workbook_Open() bạn sẽ sử dụng vòng lặp For để quét tất cả các ngày. Và kiểm tra bằng hàm IF, nếu ngày đó bằng với ngày hiện tại thì hiện thông tin bên cột Task bằng MsgBox.

workbook-vba-excel-166-4

Qua phân tích ở trên: chúng ta sẽ có một hàm tương tự như sau:

Private Sub Workbook_Open()
Dim i As Integer
Dim today As Long
Dim lastRow As Integer
today = Day(Now())
MsgBox today
lastrow = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
For i = lastrow To 2 Step -1
If (Day(Sheets(1).Cells(i, 1).Value2) = today) Then
MsgBox Sheets(1).Cells(i, 2).Value
End If
Next i
End Sub
Code language: VB.NET (vbnet)

Trong đó:

  • Đoạn lệnh Sheets(1).Range(“A” & Rows.Count).End(xlUp).Row: sẽ giúp bạn lấy được vị trí sử dụng cuối cùng của cột A trong Sheet1.
  • Day(Now()): hàm để lấy ngày hiện tại.
  • Day(Sheets(1).Cells(i, 1).Value2): hàm để lấy ngày của Cells trong cột A.

👍Kết quả: Mỗi khi mở Workbook lên, bạn sẽ nhận được tất cả các thông báo đã lên lịch trong ngày hôm nay.

workbook-vba-excel-166-3

Sự kiện Workbook_BeforeClose()

Cách sử dụng:

  • Sự kiện này sẽ thực thi trước khi Workbook đóng lại.

Khai báo:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub
Code language: VB.NET (vbnet)
Ví dụ: Để ứng dụng sự kiện này có lẽ thực hiện tác vụ lưu trước khi đóng là hợp lý hơn cả.

💡 Vì nếu bạn thêm vào sự kiện này các lệnh như Save/ Save As thì Excel sẽ tự động lưu mỗi khi bạn đóng Workbook lại. Và Excel sẽ không nhắc lưu trước khi đóng.

Các lệnh Save và SaveAs Workbook bằng VBA, bạn có thể xem trong phần cuối bài viết.

Thao tác mở/ đóng/ lưu một Workbook khác bằng VBA

Workbook khác, ở đây có nghĩa là: Nếu bạn đang làm việc trên Workbook 1 và bạn muốn mở và đóng một Workbook thứ 2 thì bạn có thể sử dụng VBA từ Workbook 1 để thực hiện.

Các cách mở một Workbook khác

Sub open_workbook()
Workbooks.Open Filename:="đường dẫn đến File"
End Sub
Code language: VB.NET (vbnet)

💡 Để lấy được đường dẫn File chính xác, bạn có thể vào Properties của File ⇒ Security copy đường dẫn.

workbook-vba-excel-166-2

Nếu trong trường hợp một File ở dạng Share Public và được mở từ nhiều User khác thì cách trên sẽ không mở được. Thay vào đó, bạn có thể mở File ở chế độ Read Only:

Sub open_workbook_readonly()
Workbooks.Open Filename:="đương dẫn đến File", ReadOnly:=True
End Sub
Code language: VB.NET (vbnet)
Hoặc bạn có thể sử dụng cách sau:
Sub open_workbook_readonly() 
Workbooks.Open(FileName,<del>UpdateLinks</del>,ReadOnly)
End Sub
Code language: VB.NET (vbnet)

💡 Lưu ý: với cách mở trên sẽ có rất nhiều tham số, nhưng ở đây mình chỉ sử dụng đến 3 tham số đầu tiên là:

  • FileName: đường dẫn đến File
  • UpdateLinks: bỏ trống.
  • ReadOnly: =1 sẽ mở file ở chế độ Readonly, 0 sẽ mở File mặc định.

👉 Bạn có thể tham khảo thêm về các tham số ở đây.

Đối với các File có sử dụng VBA thì bạn có thể cho phép tự động chạy Macro như sau:

Sub auto_runmacro()
Workbooks.Open Filename:="đường dẫn đến File"
ActiveWorkbook.RunAutoMacros xlAutoOpen
End Sub
Code language: VB.NET (vbnet)

Các cách lưu và đóng một Workbook khác

Sau khi mở và thao tác dữ liệu từ Workbook, bạn sẽ cần lưu/ đóng Workbook đó lại. Ở đây mình có 2 cách sau:

Dim tenworkbook As String
Dim duongdanfile As String
'------------------------------
Sub open_workbook()
duongdanfile = "D:\OneDrive\9.MMO\Post\VBA\checkbox-vba.xlsm"
Workbooks.Open Filename:=duongdanfile
tenworkbook = ActiveWorkbook.Name
End Sub
'------------------------------
Sub save_workbook()
Workbooks(tenworkbook).Close SaveChanges:=True
End Sub
Code language: VB.NET (vbnet)

Trong đó:

  • Lệnh Workbooks(tenworkbook).Close SaveChanges:=True sẽ thực hiện lưu các thay đổi và đóng File.

Ngoài ra, bạn có thể lưu thành Workbook mới với Save As như sau:

Sub saveas_workbook()
Workbooks(tenworkbook).SaveAs Filename:="đường dẫn mới"
End Sub
Code language: JavaScript (javascript)

💡Bạn có thể áp dụng vào một số tình huống như mở ⇒ đọc dữ liệu ⇒ đóng từ Workbook đang đóng bằng cách kết hợp các thông tin trên. Ví dụ: bạn hãy tạo một ứng dụng đọc dữ liệu từ Workbook đang đóng bằng các bước sau: Khai báo một biến Workbook ⇒ mở và gán một Workbook thứ 2 bằng VBA vào biến ⇒ đọc dữ liệu ⇒ gán dữ liệu vào Workbook đang sử dụng ⇒ đóng Workbook thứ 2.


OK! Trên đây là các sự kiện và thao tác khá phổ biến khi sử dụng VBA thao tác với một Workbook mà mình muốn chia sẻ với các bạn.

Hy vọng bài viết này hữu ích với các bạn.

BÌNH LUẬN

Please enter your comment!
Please enter your name here