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

Liên hệ QC

zine

Thành viên mới
Tham gia
21/8/07
Bài viết
27
Được thích
13
Hi các anh chị
Em có bảng tính lương cho tất cả CBCNV trong công ty
Bây giờ em muốn sau khi tính lương, gửi cách tính lương chi tiết của từng người cho người đó qua email.(thông tin lương của người nào, chỉ người đó biết)
Em gửi kèm file, mọi người có cách gì giúp em nhé, đa tạ.
 

File đính kèm

  • Gui email tu dong theo danh sach.xlsx
    13.2 KB · Đọc: 2,820
Khi mình xuất ra nó sẽ tự bun ra mà bạn. Nếu chưa chỉnh về Shrink to fit thì nó sẽ bị che mất.

Với dữ liệu khoảng 50 cột...híc, quá dài.
Cảm ơn "chàng Ngốc đáng ghét" về bài viết vô cùng bổ ích này.
em nhờ anh test bài sau khi xong anh hé....
 
Upvote 0
Ay da, nếu mình protect và clock sheet dữ liệu lại thì không thể xuất gởi email được. Làm sao đây bạn ơi, giúp mình với
 
Upvote 0

File đính kèm

  • guimail.xls
    47 KB · Đọc: 346
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn bạn lần nữa nhé. Mình làm được rồi. Thanks bạn nhiều
Mình còn 2 vấn đề nhỏ nữa thôi, mong bạn chỉ mình khắc phục nốt luôn nhé

VD1: Subject của email xuất ra

Mình biết khúc này là code quy định dạng cho subject xuất ra

-------------------------------------------------
With OutMail
.To = mailAddress
.Subject = "Chi tiet bang luong: " & Application.WorksheetFunction. _
VLookup(Cws.Cells(Rnum, 1).Value, _
Worksheets("Mailinfo").Range("A1:C" & _
Worksheets("Mailinfo").Rows.Count), 2, False)
.HTMLBody = RangetoHTML(rng)
-------------------------------------------------------

Nhưng đây là code lấy thông tin của cột 2 trong sheet mailinfo để tham chiếu đính vào subject
Nhưng bây giờ mình muốn lấy dữ liệu 1 cột trong bảng xuất body của email đính kèm vào thì mình sửa như thế nào bạn?
VD: mình muốn subject là : Chi tiết bảng lương + "Dữ liệu ở ô tương ứng ở cột 3 trong bảng dữ liệu"


VD2 : Mình có cài sẵn chữ ký trong Microsoft Outlook.
Nhưng khi email xuất ra bằng macro này thì không đi kèm với chữ ký đã cài đặt sẵn
Làm sao để mình có thể trích xuất email kèm với chữ kỹ đã cài đặt sẵn.

Mong bạn chỉ mình giúp
 
Upvote 0
Chỉnh sửa theo yêu cầu của bạn.

Mã:
Sub GuiMail()
    Dim OutApp As Object, OutMail As Object
    Dim Ash As Worksheet, Cws As Worksheet
    Dim Rcount As Long, Rnum As Long
    Dim FilterRange As Range, FieldNum As Integer, mailAddress As String
    On Error GoTo cleanup
    Set OutApp = CreateObject("Outlook.Application")
    With Application
        .EnableEvents = False
        .ScreenUpdating = False
    End With
    Set Ash = ActiveSheet
    Ash.Cells.EntireColumn.AutoFit
    Set FilterRange = Ash.Range("A1:I" & Ash.Rows.Count)
    FieldNum = 1
    Set Cws = Worksheets.Add
    FilterRange.Columns(FieldNum).AdvancedFilter _
            Action:=xlFilterCopy, _
            CopyToRange:=Cws.Range("A1"), _
            CriteriaRange:="", Unique:=True
    Rcount = Application.WorksheetFunction.CountA(Cws.Columns(1))
    If Rcount >= 2 Then
        For Rnum = 2 To Rcount
            FilterRange.AutoFilter Field:=FieldNum, _
                                   Criteria1:=Cws.Cells(Rnum, 1).Value
            mailAddress = ""
            On Error Resume Next
            mailAddress = Application.WorksheetFunction. _
                          VLookup(Cws.Cells(Rnum, 1).Value, _
                                Worksheets("Mailinfo").Range("A1:C" & _
                                Worksheets("Mailinfo").Rows.Count), 3, False)
            On Error GoTo 0
            If mailAddress <> "" Then
                With Ash.AutoFilter.Range
                    On Error Resume Next
                    Set rng = .SpecialCells(xlCellTypeVisible)
                    On Error GoTo 0
                End With
                Set OutMail = OutApp.CreateItem(0)
                On Error Resume Next
                With OutMail
                    .BodyFormat = olFormatHTML
                    .To = mailAddress
                    .Subject = "Chi tiet bang luong: " & Ash.Range("B" & Rnum) _
                                & " (Voi he so chuc danh la " & Ash.Range("C" & Rnum) & ")"
                    .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>" & _
                                "<th>H" & ChrW(7885) & " tên</th>" & _
                                "<th>H" & ChrW(7879) & " s" & ChrW(7889) & " ch" & ChrW(7913) & "c danh</th>" & _
                                "<th>S" & ChrW(7889) & " ngày công</th>" & _
                                "<th>L" & ChrW(432) & ChrW(417) & "ng CD</th>" & _
                                "<th>Ph" & ChrW(7909) & " c" & ChrW(7845) & "p " & ChrW(273) & "i" & ChrW(7879) & "n thoai</th>" & _
                                "<th>Ph" & ChrW(7909) & " c" & ChrW(7845) & "p " & ChrW(273) & "oàn th" & ChrW(7875) & "</th>" & _
                                "<th>Tr" & ChrW(7915) & " BHXH,BHTY</th>" & _
                                "<th>L" & ChrW(432) & ChrW(417) & "ng CK</th></tr><tr>" & _
                                "<td>" & Ash.Range("B" & Rnum) & "</td>" & _
                                "<td>" & Ash.Range("C" & Rnum) & "</td>" & _
                                "<td>" & Ash.Range("D" & Rnum) & "</td>" & _
                                "<td>" & Ash.Range("E" & Rnum) & "</td>" & _
                                "<td>" & Ash.Range("F" & Rnum) & "</td>" & _
                                "<td>" & Ash.Range("G" & Rnum) & "</td>" & _
                                "<td>" & Ash.Range("H" & Rnum) & "</td>" & _
                                "<td>" & Ash.Range("I" & Rnum) & "</td></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
            Ash.AutoFilterMode = False
        Next Rnum
    End If
    MsgBox "Da tao xong email gui", vbInformation
    ThisWorkbook.Close (False)
cleanup:
    Set OutApp = Nothing: Set OutMail = Nothing
    Application.DisplayAlerts = False
    Cws.Delete
    Application.DisplayAlerts = True

    With Application
        .EnableEvents = True
        .ScreenUpdating = True
    End With

End Sub

Bạn test thử file đính kèm nhé.
 

File đính kèm

  • guimail 1.0.xls
    49 KB · Đọc: 480
Upvote 0
Dứ liệu bảng lương em cần gửi 18 cột lận! Không áp dụng được. Có thể mở rộng số cột nữa không anh?

Code này của anh Hai Lúa hay thiệt là hay, quá tuyệt vời với những công việc gửi mail lương hàng nghìn nhân viên như thế này.
 
Upvote 0
Dứ liệu bảng lương em cần gửi 18 cột lận! Không áp dụng được. Có thể mở rộng số cột nữa không anh?
Dùng vòng lặp duyệt qua 18 cột là ok

Mã:
Sub GuiMail()
    Dim OutApp As Object, OutMail As Object
    Dim Ash As Worksheet, mailAddress As String
    Dim Rcount As Long, 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>"
            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)
           On Error GoTo 0
            If mailAddress <> "" Then
                Set OutMail = OutApp.CreateItem(0)
                On Error Resume Next
                With OutMail
                    .To = mailAddress
                    .Subject = "Chi tiet bang luong: " & Ash.Range("B" & Rnum) _
                                & " (Voi he so chuc danh la " & Ash.Range("C" & Rnum) & ")"
                    .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
            Ash.AutoFilterMode = False
        Next Rnum
    End If
    
MsgBox "Da tao xong email gui", vbInformation
'ThisWorkbook.Close (False)
cleanup:
    Set OutApp = Nothing: Set OutMail = Nothing

End Sub
 

File đính kèm

  • guimail 1.1.xls
    52.5 KB · Đọc: 400
Lần chỉnh sửa cuối:
Upvote 0
Dùng vòng lặp duyệt qua 18 cột là ok

Em cảm ơn anh Hai Lúa, (tên là Lúa nhưng kiến thức thì không Lúa chút nào)

File này đã đáp ứng được yêu cầu với dữ liệu nhiều cột của em.

Anh cho em hỏi thêm, trong trường hợp em không muốn gửi bảng lương trực tiếp vào email mà muốn đính kèm (như 1 file đính kèm) cho nhân viên tải xuống xem thì làm như thế nào ạ?
 
Upvote 0
Em cảm ơn anh Hai Lúa, (tên là Lúa nhưng kiến thức thì không Lúa chút nào)

File này đã đáp ứng được yêu cầu với dữ liệu nhiều cột của em.

Anh cho em hỏi thêm, trong trường hợp em không muốn gửi bảng lương trực tiếp vào email mà muốn đính kèm (như 1 file đính kèm) cho nhân viên tải xuống xem thì làm như thế nào ạ?
Tạo sheet form, đưa dữ liệu qua, copy vào ổ C, chèn đính kèm file, xóa file vừa tạo.
Em test code sau thử nhé.

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
 

File đính kèm

  • guimail 1.2.xls
    53 KB · Đọc: 414
Upvote 0
HLMT oi, đoạn code trên chưa giải quyết được vấn đề 2 là

VD2 : Mình có cài sẵn chữ ký trong Microsoft Outlook.
Nhưng khi email xuất ra bằng macro này thì không đi kèm với chữ ký đã cài đặt sẵn
Làm sao để mình có thể trích xuất email kèm với chữ kỹ đã cài đặt sẵn.

HLMT giúp mình với
 
Upvote 0
HLMT oi, đoạn code trên chưa giải quyết được vấn đề 2 là

VD2 : Mình có cài sẵn chữ ký trong Microsoft Outlook.
Nhưng khi email xuất ra bằng macro này thì không đi kèm với chữ ký đã cài đặt sẵn
Làm sao để mình có thể trích xuất email kèm với chữ kỹ đã cài đặt sẵn.

HLMT giúp mình với

Cái này thì bạn tự sửa trong code đó, thay nội dung HLMT...bằng nội dung bạn muốn rồi lưu lại là được.
 
Upvote 0
Vì thật sự chữ ký của mình không phải mang nghĩa "chữ ký" đơn thuần. Nó giống như một đoạn văn bản dài mà bắt buộc đính kèm trong email, email nào cũng phải có
Vì nó dài quá và hơi phức tạp nên mình không đưa trực tiếp vào code được, nên mình mới đưa vào phần signature trong outlook
Nên đó là lý do mình cần thêm Vấn đề 2 đó bạn
 
Upvote 0
Vì thật sự chữ ký của mình không phải mang nghĩa "chữ ký" đơn thuần. Nó giống như một đoạn văn bản dài mà bắt buộc đính kèm trong email, email nào cũng phải có
Vì nó dài quá và hơi phức tạp nên mình không đưa trực tiếp vào code được, nên mình mới đưa vào phần signature trong outlook
Nên đó là lý do mình cần thêm Vấn đề 2 đó bạn
Đưa nó vào 1 nơi nào đó ở file excel, xong rồi tham chiếu xuống code.
 
Upvote 0
Đưa nó vào 1 nơi nào đó ở file excel, xong rồi tham chiếu xuống code.

Thêm vấn đề nữa ạ.
Theo code trên thì khi attach file là attach cả bảng. (em đã test)
Vậy có thể chỉnh sửa được là:

File attach trong email sẽ chỉ có thông tin cá nhân của người được nhận (không bao gồm các dòng khác của nhân viên khác)
Dòng tiêu đề vẫn giữ nguyên.

Và tạo chữ ký trong 1 sheet nào đó, rồi tham chiếu xuống code được không anh?

Anh có thể làm giúp em vấn đề này luôn không ạ?

Em cảm ơn anh nhiều!
 
Upvote 0
Thêm vấn đề nữa ạ.
Theo code trên thì khi attach file là attach cả bảng. (em đã test)
Vậy có thể chỉnh sửa được là:

File attach trong email sẽ chỉ có thông tin cá nhân của người được nhận (không bao gồm các dòng khác của nhân viên khác)
Dòng tiêu đề vẫn giữ nguyên.

Và tạo chữ ký trong 1 sheet nào đó, rồi tham chiếu xuống code được không anh?

Anh có thể làm giúp em vấn đề này luôn không ạ?

Em cảm ơn anh nhiều!

Xem coi được chưa nhé.

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(8, 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>" & _
                            "<BR>" & _
                            Ash.Range("O9")
                    .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
 

File đính kèm

  • guimail 1.2.xls
    56.5 KB · Đọc: 697
Upvote 0
Tuyệt quá! Em cảm ơn anh Hai Lúa rất rất nhiều!

Em tải file về, sửa code cho nó lưu vào ổ D theo ý muốn, và sửa đoạn code:
Mã:
.display
Thành
Mã:
.Send

Để tự động gửi mail hàng loạt, không cần nhấn send từng mail một.

Thật tuyệt vời!

Hic có nhiều bài viết hay của anh từ trước mà em chưa được đọc nên thời gian qua việc gửi mail lương cho nhân viên cũng vẫn còn chưa khắc phục được theo ý mình.

Giờ theo code này, sau kỳ lương có thể ngồi ung dung ...uống trà chanh...hihi.
 
Upvote 0
Chủ đề này hay quá nhưng trường hợp của mình lại khác một chút. Mình có 1 file thông tin nhân viên gồm 1 sheet có mã nhân viên, tên nhân viên, địa chỉ mail. Mỗi nhân viên mình có 1 file tính lương cụ thể (có nhiều thông tin trên phiếu này), tên file là mã số của nhân viên. Như vậy mình có cách nào gởi mail đính kèm từng file cho từng nhân viên không? Mọi người giúp nhé.
 
Upvote 0
Chủ đề này hay quá nhưng trường hợp của mình lại khác một chút. Mình có 1 file thông tin nhân viên gồm 1 sheet có mã nhân viên, tên nhân viên, địa chỉ mail. Mỗi nhân viên mình có 1 file tính lương cụ thể (có nhiều thông tin trên phiếu này), tên file là mã số của nhân viên. Như vậy mình có cách nào gởi mail đính kèm từng file cho từng nhân viên không? Mọi người giúp nhé.

Có thể được đó bạn, bạn cho 1 vài file và form mẫu có 1 ít nhân viên trong đó rồi đưa lên đây xem thử nhé.
 
Upvote 0
Bạn xem giúp mình với, cảm ơn nhiều
 

File đính kèm

  • Goi mail tu dong.xls
    24.5 KB · Đọc: 197
Upvote 0
Web KT
Back
Top Bottom