Gửi email tính lương cho từng người bằng Outlook

Liên hệ QC

Gửi email tính lương cho từng người bằng Outlook​


Gửi các bạn file và đoạn code để gửi email bảng lương (có đính kèm file) qua Outlook bằng Excel, rất tiện lợi cho những ai làm việc trong lĩnh vực nhân sự cũng như những ai muốn học hỏi về cách gửi mail hàng loạt từ Excel thông qua Outlook.

Ngoài ra, bạn có thể tham khảo thêm bài viết này nếu bạn dùng Lotus Note thay vì Outlook.

Mã:
Option Explicit

Sub GuiMail()
    Dim OutApp As Object, OutMail As Object
    Dim WB As Workbook, Ash As Worksheet, mailAddress As String, i As Integer, ir As Integer
    Dim Rcount As Long, FileName As String, Rnum As Long, strHeader As String, strRow As String
    On Error GoTo cleanup
    Set OutApp = CreateObject("Outlook.Application")
    Set Ash = Sheet1
    Rcount = Application.WorksheetFunction.CountA(Ash.Columns(1))
    For i = 1 To 18
          strHeader = strHeader & " " & "<th>" & Ash.Cells(1, i) & "</th>"
    Next
    If Rcount >= 2 Then
        For Rnum = 2 To Rcount
            strRow = ""
            For ir = 1 To 18
                strRow = strRow & " " & "<td>" & Ash.Cells(Rnum, ir) & "</td>"
                Sheets("Form").Cells(2, ir) = Ash.Cells(Rnum, ir)
            Next
            mailAddress = ""
            On Error Resume Next
            mailAddress = Application.WorksheetFunction. _
                          VLookup(Ash.Cells(Rnum, 1).Value, _
                                Worksheets("Mailinfo").Range("A1:C" & _
                                Worksheets("Mailinfo").Rows.Count), 3, False)
            Sheets("Form").Copy
            Set WB = ActiveWorkbook
            FileName = Ash.Cells(Rnum, 1) & ".xls"
            Kill "C:\" & FileName
            On Error GoTo 0
            WB.SaveAs FileName:="C:\" & FileName
            If mailAddress <> "" Then
                Set OutMail = OutApp.CreateItem(0)
                With OutMail

                    .To = mailAddress
                    .Subject = "Chi tiet bang luong: " & Ash.Range("B" & Rnum) _
                                & " (Voi he so chuc danh la " & Ash.Range("C" & Rnum) & ")"
                    .Attachments.Add WB.FullName
                    .HTMLBody = "<B>Dear " & Ash.Range("B" & Rnum) & ",</B><BR>" & _
                           "Xin vui long xem chi tiet bang luong nhu ben duoi:<BR><BR>" & _
                                "<table border=1><tr>" & _
                                strHeader & _
                                "</tr><tr>" & _
                                strRow & _
                                "</tr>" & _
                                "</table>" & _
                                "<BR>" & _
                            "Neu thay co gi thac mac xin vui long phan hoi som.<BR>" & _
                              "<B>Xin Cam on,</B>" & _
                            "<BR>" & _
                            "<B>HLMT<B>"
                    .Display  'Or use Send
                End With
                On Error GoTo 0
                Set OutMail = Nothing
            End If
            WB.ChangeFileAccess Mode:=xlReadOnly
            Kill WB.FullName
            WB.Close SaveChanges:=False
        Next Rnum
    End If
   
MsgBox "Da tao xong email gui", vbInformation
'ThisWorkbook.Close (False)
cleanup:
    Set OutApp = Nothing: Set OutMail = Nothing

End Sub

Một số câu hỏi khác, bạn có thể vào topic sau để bàn luận thêm: http://www.giaiphapexcel.com/forum/showthread.php?48211

Một số bài viết có liên quan:
1/ Dùng Excel để gửi mail trong Lotus Note
2/ Conditional Formatting cho biểu đồ bằng VBA
3/ Khi nào nên sử dụng Msgbox, Inputbox và Userform?
4/ 8 thủ thuật trong VBE bạn nên biết
5/ Kích hoạt macro từ nút bấm ngoài bảng tính
6/ Làm thế nào để thay thế các chữ OK, CANCEL,... nhàm chán của Msgbox
7/ Giới thiệu VBA trong Excel
8/ Viết code để nhìn thấy ai là người cập nhật bảng tính của bạn lần gần đây nhất
9/ 4 cách sử dụng Immediate Window trong VBA hiệu quả hơn
10/ 3 gợi ý nhỏ mang lại thành công trong khai báo biến trong VBA
 
Chỉnh sửa lần cuối bởi điều hành viên:
Hay hơn nữa nếu anh update thêm cả phần gửi file đính kèm nữa.

Bài này kyo thấy có gửi file đính kèm, tuy nhiên gửi file đính kèm dưới hình thức lưu file mới, gửi, rồi xóa file đã lưu trong ổ đĩa.

Mã:
...
            FileName = Ash.Cells(Rnum, 1) & ".xls"
            Kill "C:\" & FileName
            On Error GoTo 0
            WB.SaveAs FileName:="C:\" & FileName
            If mailAddress <> "" Then
                Set OutMail = OutApp.CreateItem(0)
                With OutMail


                    .To = mailAddress
                    .Subject = "Chi tiet bang luong: " & Ash.Range("B" & Rnum) _
                                & " (Voi he so chuc danh la " & Ash.Range("C" & Rnum) & ")"
                   .Attachments.Add WB.FullName
                    .HTMLBody = "<B>Dear " & Ash.Range("B" & Rnum) & ",</B><BR>" & _
                           "Xin vui long xem chi tiet bang luong nhu ben duoi:<BR><BR>" & _
                                "<table border=1><tr>" & _
                                strHeader & _
                                "</tr><tr>" & _
                                strRow & _
                                "</tr>" & _
                                "</table>" & _
                                "<BR>" & _
                            "Neu thay co gi thac mac xin vui long phan hoi som.<BR>" & _
                              "<B>Xin Cam on,</B>" & _
                            "<BR>" & _
                            "<B>HLMT<B>"
                    .Display  'Or use Send
                End With
                On Error GoTo 0
                Set OutMail = Nothing
            End If
            WB.ChangeFileAccess Mode:=xlReadOnly
            Kill WB.FullName
            WB.Close SaveChanges:=False
...

Đoạn code tô đậm có thể tùy biến để lấy file trực tiếp ngay từ ổ đĩa.

kyo.
 
Lần chỉnh sửa cuối:
Upvote 0
chào cả nhà!
mình mới ra trường và đang làm cho công ty sản xuất bao bì, bây giờ mình rất cần 1 file excel ghi nhận nguyên vật liệu sử dụng? sử dụng bao nhiêu? phế phẩm bao nhiêu %? thành phẩm, kiểu như theo dõi theo dây chuyền luôn ak công nhân làm đạt hay không đạt...ai có file tương tự như vậy cho xin nha!
xin cân thành cám ơn! @$@!^%@$@!^%@$@!^%@$@!^%@$@!^%@$@!^%@$@!^%
 
Upvote 0
Xin chào cả nhà! Chắc chắn code này chạy tốt rồi, tuy nhiên nó hơi khó dùng vì code html ẩn chìm trong code vba. Em cũng xin phép share một code khác dễ dùng hơn, coi như thêm một sự lựa chọn cho mọi người.
[video=youtube;dcZEEBtIW4o]https://www.youtube.com/watch?v=dcZEEBtIW4o[/video]
 
Upvote 0
Xin chào cả nhà! Chắc chắn code này chạy tốt rồi, tuy nhiên nó hơi khó dùng vì code html ẩn chìm trong code vba. Em cũng xin phép share một code khác dễ dùng hơn, coi như thêm một sự lựa chọn cho mọi người.
[video=youtube;dcZEEBtIW4o]https://www.youtube.com/watch?v=dcZEEBtIW4o[/video]

Đoạn code trên thuần VBA mà bạn, có thể do quite nhầm. Kyo sửa lại code đi.
Mà diễn đàn có nữ cao thủ VBA xuất hiện rồi --=0
 
Upvote 0
Đoạn code trên thuần VBA mà bạn, có thể do quite nhầm. Kyo sửa lại code đi.
Mà diễn đàn có nữ cao thủ VBA xuất hiện rồi --=0

Bài đó là quảng cáo mà anh.
Nếu bạn đó có nhã ý muốn chia sẻ thì đã gửi link tải file trực tiếp hoặc chép code ra rồi.
Anh xem ở bên youtube của bạn đó, có nhiều bài giới thiệu như vậy.
Ngoài ra, tiếng nói trong video là phần mềm máy tính, không phải thu âm trực tiếp.
 
Upvote 0
Bài đó là quảng cáo mà anh.
Nếu bạn đó có nhã ý muốn chia sẻ thì đã gửi link tải file trực tiếp hoặc chép code ra rồi.
Anh xem ở bên youtube của bạn đó, có nhiều bài giới thiệu như vậy.
Ngoài ra, tiếng nói trong video là phần mềm máy tính, không phải thu âm trực tiếp.
c
Code và file ví dụ em có đăng ở dưới video. trong video thì không nói tới gửi email kèm định dạng. nhưng nó có hỗ trợ. chỉ việc thay bodybằng bodyhtml là được
 
Upvote 0
Xời, gửi tự động hàng loạt bằng Outlook chán chết. Phải mất công cấu hình thằng Outlook trước, rồi mắc lỗi phải mở nó ra thì outbox mới chạy, thư mới thực sự gửi đi. Sao không làm thẳng từ gmail? Chả phụ thuộc vào Outlook nữa, tiện!
 
Upvote 0
Xời, gửi tự động hàng loạt bằng Outlook chán chết. Phải mất công cấu hình thằng Outlook trước, rồi mắc lỗi phải mở nó ra thì outbox mới chạy, thư mới thực sự gửi đi. Sao không làm thẳng từ gmail? Chả phụ thuộc vào Outlook nữa, tiện!
Bạn có gì hay giới thiệu cho mọi người tham khảo với.
Mà gmail là cái gì vậy bạn? Gmail gửi được email đi à? Hay nhỉ, giờ mới biết nhé.
 
Upvote 0
Upvote 0
Xin chào cả nhà! Chắc chắn code này chạy tốt rồi, tuy nhiên nó hơi khó dùng vì code html ẩn chìm trong code vba. Em cũng xin phép share một code khác dễ dùng hơn, coi như thêm một sự lựa chọn cho mọi người.
[video=youtube;dcZEEBtIW4o]https://www.youtube.com/watch?v=dcZEEBtIW4o[/video]

Cám ơn chia sẻ của bạn. Nhưng mình chưa hiểu rõ làm sao để có cái mail xem trước ở phía trên, có thanh cuộn?
Bạn có thể hướng dẫn 1 chút giúp mình không. Cám ơn bạn.
 
Upvote 0
Bài này kyo thấy có gửi file đính kèm, tuy nhiên gửi file đính kèm dưới hình thức lưu file mới, gửi, rồi xóa file đã lưu trong ổ đĩa.

Mã:
...
            FileName = Ash.Cells(Rnum, 1) & ".xls"
            Kill "C:\" & FileName
            On Error GoTo 0
            WB.SaveAs FileName:="C:\" & FileName
            If mailAddress <> "" Then
                Set OutMail = OutApp.CreateItem(0)
                With OutMail


                    .To = mailAddress
                    .Subject = "Chi tiet bang luong: " & Ash.Range("B" & Rnum) _
                                & " (Voi he so chuc danh la " & Ash.Range("C" & Rnum) & ")"
                   .Attachments.Add WB.FullName
                    .HTMLBody = "<B>Dear " & Ash.Range("B" & Rnum) & ",</B><BR>" & _
                           "Xin vui long xem chi tiet bang luong nhu ben duoi:<BR><BR>" & _
                                "<table border=1><tr>" & _
                                strHeader & _
                                "</tr><tr>" & _
                                strRow & _
                                "</tr>" & _
                                "</table>" & _
                                "<BR>" & _
                            "Neu thay co gi thac mac xin vui long phan hoi som.<BR>" & _
                              "<B>Xin Cam on,</B>" & _
                            "<BR>" & _
                            "<B>HLMT<B>"
                    .Display  'Or use Send
                End With
                On Error GoTo 0
                Set OutMail = Nothing
            End If
            WB.ChangeFileAccess Mode:=xlReadOnly
            Kill WB.FullName
            WB.Close SaveChanges:=False
...

Đoạn code tô đậm có thể tùy biến để lấy file trực tiếp ngay từ ổ đĩa.

kyo.
Chưa xài chưa sử dụng vì không xài outlook, nhưng xin Duy cho anh hỏi nếu mình add nhiều file thì mình xài nhiều dòng này hay là thêm dòng nào khác ngoài dòng này
.Attachments.Add WB.FullName (nếu thêm mấy file thì tương ứng có mấy câu lệnh này?)
 
Upvote 0
Cám ơn chia sẻ của bạn. Nhưng mình chưa hiểu rõ làm sao để có cái mail xem trước ở phía trên, có thanh cuộn?
Bạn có thể hướng dẫn 1 chút giúp mình không. Cám ơn bạn.
uổi, sao giờ mới thấy cái này chứ. Cái mail mà bạn nhìn thấy chỉ toàn là công thức thôi mà, mình làm ra nhìn cho đẹp, chứ nó không có giá trị gì trong việc gửi email cả, Bạn tải file về xem sẽ rõ hơn.
 
Upvote 0
Hi các anh,

Em hỏi thêm về topic này.

Em muốn gửi email tự động mà có nội dung trong body mail.

Các anh cho em xin code và cách set-up code này ạ.

Em cảm ơn.

1616660252806.png
 
Upvote 0
Web KT
Back
Top Bottom