Chào các bác, hôm nay em muốn chia sẻ một chút về cách tự động hóa việc gửi email thông báo khi có thay đổi trong file Excel. Tình huống là thế này, em có một file theo dõi tiến độ dự án, và em muốn tự động gửi email cho quản lý mỗi khi có một task nào đó được đánh dấu là hoàn thành. Thay vì phải ngồi kiểm tra thủ công rồi gửi email, em nghĩ đến việc dùng VBA để làm việc này.
Ý tưởng là em sẽ dùng một sự kiện trong VBA, cụ thể là Worksheet_Change. Sự kiện này sẽ kích hoạt mỗi khi có sự thay đổi trên một sheet nhất định. Trong sự kiện này, em sẽ kiểm tra xem có dòng nào vừa được đánh dấu hoàn thành hay không (ví dụ, cột trạng thái chuyển từ 'Đang làm' sang 'Hoàn thành').
Nếu phát hiện có sự thay đổi, em sẽ lấy thông tin của dòng đó (tên task, người phụ trách, ngày hoàn thành) và soạn một email. Để gửi email, em sẽ sử dụng đối tượng Outlook.Application. Nếu máy tính của các bác đã cài Outlook, cách này sẽ rất tiện.
Code cơ bản sẽ trông như thế này:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim outlookApp As Object
Dim mailItem As Object
Dim lastRow As Long
Dim changedCell As Range
' Chỉ chạy khi thay đổi ở cột trạng thái (ví dụ cột D)
If Not Intersect(Target, Range("D:D")) Is Nothing Then
For Each changedCell In Target
If changedCell.Value = "Hoàn thành" Then
lastRow = changedCell.Row
' Lấy thông tin từ các cột khác (ví dụ A, B, C)
Dim taskName As String
taskName = Cells(lastRow, "A").Value
Dim assignedTo As String
assignedTo = Cells(lastRow, "B").Value
Dim completionDate As String
completionDate = Cells(lastRow, "C").Value
On Error Resume Next ' Bỏ qua lỗi nếu Outlook chưa mở
Set outlookApp = GetObject(, "Outlook.Application")
If outlookApp Is Nothing Then
Set outlookApp = CreateObject("Outlook.Application")
End If
On Error GoTo 0
Set mailItem = outlookApp.CreateItem(0) ' 0 = olMailItem
With mailItem
.To = "quanly@example.com"
.Subject = "Thông báo: Task '