Bài viết: Gửi email tính lương cho từng người bằng Outlook

Hai Lúa Miền Tây

Chuyên gia GPE
Thành viên BQT
Administrator
Tham gia ngày
18 Tháng ba 2008
Bài viết
7,201
Thích
13,941
Điểm
1,910
#1
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:

kyo

Nguyễn Khắc Duy
Thành viên BQT
Administrator
Tham gia ngày
4 Tháng sáu 2006
Bài viết
900
Thích
2,599
Điểm
910
#3
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:

xu mai

Thành viên mới
Tham gia ngày
25 Tháng mười 2016
Bài viết
1
Thích
0
Điểm
0
#4
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! @$@!^%@$@!^%@$@!^%@$@!^%@$@!^%@$@!^%@$@!^%
 
Tham gia ngày
11 Tháng mười một 2016
Bài viết
596
Thích
418
Điểm
235
#5
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.
 

PhanTuHuong

Excel & AutoCad & VBA & VB.NET
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,729
Thích
23,058
Điểm
1,860
#6
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.
Đ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
 
Tham gia ngày
6 Tháng một 2011
Bài viết
8,242
Thích
9,237
Điểm
560
#7
Đ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.
 
Tham gia ngày
11 Tháng mười một 2016
Bài viết
596
Thích
418
Điểm
235
#8
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
 

songmai

Thành viên chính thức
Tham gia ngày
6 Tháng tám 2007
Bài viết
52
Thích
12
Điểm
670
#9
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!
 
Tham gia ngày
6 Tháng một 2011
Bài viết
8,242
Thích
9,237
Điểm
560
#10
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é.
 
Tham gia ngày
6 Tháng một 2011
Bài viết
8,242
Thích
9,237
Điểm
560
#12

Hai Lúa Miền Tây

Chuyên gia GPE
Thành viên BQT
Administrator
Tham gia ngày
18 Tháng ba 2008
Bài viết
7,201
Thích
13,941
Điểm
1,910
#13
Tham gia ngày
12 Tháng mười hai 2016
Bài viết
1
Thích
1
Điểm
165
#14
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.
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.
 

phihndhsp

Thành viên gạo cội
Tham gia ngày
26 Tháng mười hai 2009
Bài viết
3,279
Thích
2,360
Điểm
560
#15
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?)
 
Tham gia ngày
11 Tháng mười một 2016
Bài viết
596
Thích
418
Điểm
235
#16
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.
 
Tham gia ngày
20 Tháng năm 2011
Bài viết
4,593
Thích
4,026
Điểm
560
#17
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?)
1 file là 1 dòng. 2 file là 1 dòng, cứ thế. Tôi đã xài vậy.
 
Tham gia ngày
8 Tháng tư 2008
Bài viết
169
Thích
128
Điểm
680
#18
Top