Bằng cách sử dụng Microsoft Outlook, việc gửi thư điện tử từ Excel thông qua macro trở nên tương đối dễ dàng. Chỉ cần tạo một tập tin Outlook và chỉnh sửa dựa trên dữ liệu từ bảng tính là xong.
Nhưng nếu bạn không dùng Outlook thì sao? Dưới đây là bí kíp giúp bạn tạo được một email cá nhân trực tiếp ngay từ Excel. Đoạn mã này do tôi tự phát triển và kiểm nghiệm thông qua ứng dụng Outlook Express (đây là ứng dụng không hỗ trợ VBA). Không phải bất kỳ địa chỉ email nào cũng có thể hoạt động được.
Ví dụ
Giả sử ta có một bảng tính đơn giản như hình ở dưới. Nhiệm vụ là phải gửi được email đến tất cả 3 người có tên trong danh sách, thông báo cho từng người số tiền thưởng trong năm mà họ được nhận.
Mẫu email đầu tiên sẽ có dạng như sau:
“Dear John Jones,
I am pleased to inform you that your annual bonus is $2,000.
William Rose
President”
Câu lệnh VBA
Dưới đây là nội dung câu lệnh VBA sử dụng để tạo và gửi email tự động:
“Private Declare Function ShellExecute Lib “shell32.dll” _
Alias “ShellExecuteA” (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Sub SendEMail()
Dim Email As String, Subj As String
Dim Msg As String, URL As String
Dim r As Integer, x As Double
For r = 2 To 4 ‘data in rows 2-4
‘ Get the email address
Email = Cells(r, 2)
‘ Message subject
Subj = “Your Annual Bonus”
‘ Compose the message
Msg = “”
Msg = Msg & “Dear ” & Cells(r, 1) & “,” & vbCrLf & vbCrLf
Msg = Msg & “I am pleased to inform you that your annual bonus is “
Msg = Msg & Cells(r, 3).Text & “.” & vbCrLf & vbCrLf
Msg = Msg & “William Rose” & vbCrLf
Msg = Msg & “President”
‘ Replace spaces with %20 (hex)
Subj = Application.WorksheetFunction.Substitute(Subj, ” “, “%20”)
Msg = Application.WorksheetFunction.Substitute(Msg, ” “, “%20”)
‘ Replace carriage returns with %0D%0A (hex)
Msg = Application.WorksheetFunction.Substitute(Msg, vbCrLf, “%0D%0A”)
‘ Create the URL
URL = “mailto:” & Email & “?subject=” & Subj & “&body=” & Msg
‘ Execute the URL (start the email client)
ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus
‘ Wait two seconds before sending keystrokes
Application.Wait (Now + TimeValue(“0:00:02”))
Application.SendKeys “%s”
Next r
End Sub”
Cách thức hoạt động của câu lệnh
Cách thức hoạt động của phần câu lệnh macro đầu tiên tương đối dễ hiểu. Macro sẽ chạy vòng xung quanh các hàng, chọn lấy địa chỉ hòm thư email và tự soạn thảo mẫu văn bản tương ứng. Hãy chú ý đến cách sử dụng hàm Substitute trong Excel. Hàm này có tác dụng thay thế các chuỗi kí tự dấu cách dòng và trở về dòng tiếp theo bằng các kí tự mã hex tương đương (vì các kí tự đó không sử dụng được trong link URL). Sau đó một đường link URL sẽ được tạo và được lưu trong biến “URL”. Thông qua hàm ShellExecute API, trình ứng dụng chạy đường link trên sẽ được kích hoạt.
Đến đây sẽ xuất hiện hộp thoại soạn thảo Outlook Express cho phép bạn gửi email đi. Lệnh Sendkeys sẽ được dùng để kích hoạt tổ hợp phím Alt+S (cũng chính là lệnh “gửi thư” trong Outlook Express). Sẽ mất khoảng 2 giây để đoạn mã có thể gửi thành công. Bạn có thể tùy chỉnh lại mức thời gian trễ này (giảm xuống còn 1 giây).
Sendkeys chỉ được sử dụng như giải pháp cuối cùng. Bởi vì do có độ trễ nhất định nên sẽ mất thời gian một chút khi chạy macro này.
Lưu ý 1: Độ dài email tối đa không quá 255 kí tự
Lưu ý 2: Hướng đi ban đầu của tôi là sử dụng phương pháp FollowHyperlink trong bảng tính. Tuy vậy tôi lại không có cách nào có thể chèn được khoảng trắng vào nội dung email. Bạn có thể tham khảo cách sửa lỗi này từ Ron de Bruin theo link phía dưới.
Cập nhật mới
Bugs hướng dẫn cách để chèn vào 1 đoạn ký tự tĩnh vào nội dung email, từ đó cho phép bạn có thể soạn thảo nhiều hơn 255 ký tự cho phép. Hãy sao chép nội dung kí tự vào Clipboard. Sau đó thêm chuỗi mã lệnh này đằng sau câu lệnh Application.Sendkeys theo mẫu dưới đây:
Application.SendKeys “{Tab}{Tab}{Tab}{Tab}{Tab}^{End}{Return}{Return}^v”
Lệnh này sẽ chạy liên tục qua phần tiêu đề cửa sổ soạn thảo email, trỏ xuống cuối đoạn văn bản, tự động xuống dòng 2 lần và cuối cùng là dán nội dung ký tự vừa được sao chép lên Clipboard vào trong văn bản đích. Số lần Tab cần dùng là bao nhiêu thì cần phải thử nhiều lần để biết chính xác.
Để biết thêm các cách gửi email khác trong Excel, vui lòng tham khảo trang web của Ron de Bruin tại đây: http://www.rondebruin.nl/