Gửi email tính lương cho từng người (1 người xem)

  • Thread starter Thread starter zine
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

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

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ạ.

Bạn sử dụng code sau thử nhé

Mã:
Sub SendMail()
    Dim OutApp As Object
    Dim OutMail As Object
    Dim cell As Range
    Dim Addresslist As Scripting.Dictionary
    Application.ScreenUpdating = False
    Set Addresslist = New Scripting.Dictionary
    Set OutApp = CreateObject("Outlook.Application")
    OutApp.Session.Logon

    For Each cell In Columns("B").Cells.SpecialCells(xlCellTypeConstants)
        If cell.Value Like "?*@?*.?*" And _
           LCase(Cells(cell.Row, "J").Value) = "yes" Then
            On Error Resume Next
            Addresslist.Add cell.Value, cell.Value
            If Err.Number = 0 Then
                Set OutMail = OutApp.CreateItem(0)
                With OutMail
                    .To = cell.Value
                    .Subject = "Phieu luong: " & Cells(cell.Row, "A").Value
                    .Body = "Dear " & Cells(cell.Row, "A").Value _
                          & vbNewLine & vbNewLine & _
                            "Xin vui long xem chi tiet bang luong nhu ben duoi:" & _
                            vbNewLine & vbNewLine & _
                           "+ He So Chuc Danh: " & Cells(cell.Row, "C").Value & _
                              vbNewLine & _
                           "+ So ngay cong: " & Cells(cell.Row, "D").Value & _
                            vbNewLine & _
                           "+ Luong CD: " & Cells(cell.Row, "E").Value & _
                            vbNewLine & _
                           "+ Phu cap DT: " & Cells(cell.Row, "F").Value & _
                            vbNewLine & _
                           "+ Phu cap doan the: " & Cells(cell.Row, "G").Value & _
                            vbNewLine & _
                           "+ Tru BHXH, BHYT: " & Cells(cell.Row, "H").Value & _
                            vbNewLine & _
                           "+ Luong CK: " & Cells(cell.Row, "I").Value & _
                           vbNewLine & vbNewLine & _
                           "Cam on"
                    .Display  'Or use Send
                End With
                Set OutMail = Nothing
            End If
            On Error GoTo 0
        End If
    Next cell

    Set OutApp = Nothing
    Set Addresslist = Nothing
    Application.ScreenUpdating = True
End Sub

http://www.rondebruin.nl/mail/folder3/message.htm

Tham khảo thêm file nhé.
 

File đính kèm

Upvote 0
Cảm ơn anh domfootwear
Theo fiel anh gửi, Khi nhấn nút gửi, macro chạy ra các mail để gửi, mình ấn nút send thì sẽ gửi mail cho từng người.
Cho em hỏi thêm là, có thể sửa đoạn mã trên, để khi nhấn nút gửi (chạy macro), nó tự động gửi luôn mà không hiện ra Email khởi tạo nữa. (Vì danh sách dài, nếu để hiện ra các cửa sổ pop up thì quá nhiều cửa sổ)
 
Upvote 0
Cảm ơn anh domfootwear
Theo fiel anh gửi, Khi nhấn nút gửi, macro chạy ra các mail để gửi, mình ấn nút send thì sẽ gửi mail cho từng người.
Cho em hỏi thêm là, có thể sửa đoạn mã trên, để khi nhấn nút gửi (chạy macro), nó tự động gửi luôn mà không hiện ra Email khởi tạo nữa. (Vì danh sách dài, nếu để hiện ra các cửa sổ pop up thì quá nhiều cửa sổ)

Bạn thử sửa như sau

Mã:
.Display

Thành

Mã:
.Send
 
Upvote 0
Thanks bác, tìm mãi không dc, hoá ra là chỗ Display
 
Upvote 0
Em đã gửi bảng lương dc rùi, nhưng còn ba vấn đề chưa giải quyết được:
- Khi muốn gửi chi tiết các khoản mục (BHXH, số ngày công tính lương, ngày công thực tế ...) khoảng 11 chỉ tiêu, thì đoạn code trên bị báo lỗi là "Too many line continuations...". HÌnh như là do nhièu dòng
quá (tổng cộng không một đoạn code không dc quá 25 dòng). Có cách nào khắc phục không ạ
- Không gõ được tiếng Việt với Body của mail (không gõ được trong vba)
- Vì email gửi dưới dạng Texl nên nhìn không dc pro, có cách nào tạo ra email dạng bảng (table)không ạ? (Ví dụ: Bảng có 4 cột và các hàng: Cột gồm: cột 1 là số thứ tự, cột 2 là nội dung, cột 3 là giá trị, cột 4 là đơn vị tính. Hàng gồm các nội dung chính : Hàng 1: Lương ngày, Hàng 2: Thuế, Hàng 3: Bảo hiểm ....
 
Lần chỉnh sửa cuối:
Upvote 0
Mình có xem đoạn code này để thực hiên, nhưng nó báo lỗi,
Quote:
Code:
Mã:
Sub Send_Row_Or_Rows_1() 
' Don't forget to copy the function RangetoHTML in the module. ' Working in Office 2000-2010     
Dim OutApp As Object     
Dim OutMail As Object     
Dim rng As Range    
 Dim Ash As Worksheet    
 Dim Cws As Worksheet     
Dim Rcount As Long     
Dim Rnum As Long     
Dim FilterRange As Range     
Dim FieldNum As Integer     
Dim mailAddress As String      
On Error GoTo cleanup     
Set OutApp = CreateObject("Outlook.Application")      
With Application         
.EnableEvents = False         
.ScreenUpdating = False    
 End With      
'Set filter sheet, you can also use Sheets("MySheet")     
Set Ash = ActiveSheet      
'Set filter range and filter column (Column with names)     
Set FilterRange = Ash.Range("A1:H" & Ash.Rows.Count)     
FieldNum = 1   
'Filter column = A because the filter range start in A      
'Add a worksheet for the unique list and copy the unique list in A1     
Set Cws = Worksheets.Add     
FilterRange.Columns(FieldNum).AdvancedFilter _  
           Action:=xlFilterCopy, _ 
            CopyToRange:=Cws.Range("A1"), _ 
            CriteriaRange:="", Unique:=True      

'Count of the unique values + the header cell    
 Rcount = Application.WorksheetFunction.CountA(Cws.Columns(1))     
 'If there are unique values start the loop    
 If Rcount >= 2 Then
         For Rnum = 2 To Rcount
              'Filter the FilterRange on the FieldNum column 
            FilterRange.AutoFilter Field:=FieldNum, _ 
                                   Criteria1:=Cws.Cells(Rnum, 1).Value 
             'Look for the mail address in the MailInfo worksheet
             mailAddress = ""             
On Error Resume Next             
mailAddress = Application.WorksheetFunction. _ 
                      Worksheets("Mailinfo").Rows.Count), 2, 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      
              .to = mailAddress         
            .Subject = "Test mail"         
            .HTMLBody = RangetoHTML(rng)           
          .Display  'Or use Send                
 End With                 
On Error GoTo 0                 
 Set OutMail = Nothing            
 End If             
 'Close AutoFilter             
Ash.AutoFilterMode = False         
 Next Rnum     
End If 
 cleanup:     
Set OutApp = Nothing     
Application.DisplayAlerts = False     
Cws.Delete    
Application.DisplayAlerts = True      
With Application         
.EnableEvents = True         
.ScreenUpdating = True    
 End With 
End Sub
Nguồn:http://www.rondebruin.nl/mail/folder3/row2.htm


Cao thủ nào chỉ giúp em sửa lỗi đoạn mã với. Không biết đoạn mã trên có đúng là gửi email cho từng người theo bảng không

Hic, làm sao để đoạn code hiển thị rõ ràng, không bị dàn trải, như bác domfootwear thể hiện nhỉ
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Bạn xem file đính kèm nhé.
 

File đính kèm

Upvote 0
Em thấy cái này rất hay quá, tuy nhiên do thông tin về lương bên em quá nhiều mà file này ít thông tin quá nên không thể hiện hết được ( khoản tầm 20 thông tin). Các anh có cách nào không thì hướng dẫn giúp em với.
Trân trọng và cảm ơn
 
Upvote 0
Em cũng đang cần gửi mail cho từng người phiếu lương chi tiết, nhưng em ko hiểu cách hướng dẫn trên là dùng cho mail nào? em chưa thử làm, bác nào cho em xin số điện thoại giúp em với a, hoặc alo giúp em tới số: 0916.075.605 a
 
Lần chỉnh sửa cuối:
Upvote 0
Em cũng đang cần gửi mail cho từng người phiếu lương chi tiết, nhưng em ko hiểu cách hướng dẫn trên là dùng cho mail nào? em chưa thử làm, nếu bác nào có số cố định mà đang ở hà nội thì cho em xin để em hỏi chút a

Bạn dùng Outlook, tải file hướng dẫn ở trên, nhớ là theo trình tự cột nhé.
 
Upvote 0
Cho em hỏi mình muốn nó gửi theo ngày giờ và tự động như vậy có được không ạ. Thanks !!!
 
Upvote 0
mình có bảng tính excel, mình muốn nó tự động copy bản đó, xong chạy outlook, paste bảng đó vào body thì làm sao, mong các bạn chị giúp.

cảm ơn nhiều
 
Upvote 0
Các bác ơ giúp mình với, Mình thấy file trên hay quá, mình cũng dow về dùng nhưng sao khi nhấn nút send nó cửa hiện của sổ gửi Email của Ms Word không hà, không có nút send (gửi), mình đang xài win 7, dùng trình mail Windows live mail

Giup minh voi,
Cam on cac cao thủ nhiều lắm

Các anh chị giúp mình thì vui lòng gửi qua Email giup minh nhe: namnhoai@yahoo.com
 
Upvote 0
Ôi, giờ mới đọc được topic này. Theo mình nghĩ thì nó sẽ rất hữu ích với công việc văn phòng và giao tiếp.

Nhưng tiếc là mình không rành lắm về VBA (không biết có lớp nào dạy cái này không nhể?). Và hơn thế nữa, mong mọi người bàn thảo nhiều hơn nữa chủ đề này để mình học hỏi.
 
Upvote 0
Bạn ơi, thanks bạn rất nhiều về file gởi email này
Nhưng khi mình trích xuất dạng bảng ra thì nó các cột trong bảng thể hiện thiếu giá trị trong ô excel tương ứng
VD ô của mình có text là : 12345678
Trước khi bấm nút "gửi mail" thì mình có kéo ô đó nhỏ lại cho dễ hiển thị, nên nó chỉ hiển thị : 12345 (thực chất giá trị vẫn là 123456)
Khi email xuất ra thì ô tương ứng chỉ thể hiện đúng màn hình excel thể hiện là 12345 , chứ không phải là 12345678

Bạn hướng dẫn mình sửa code với
 
Upvote 0
Bạn ơi, thanks bạn rất nhiều về file gởi email này
Nhưng khi mình trích xuất dạng bảng ra thì nó các cột trong bảng thể hiện thiếu giá trị trong ô excel tương ứng
VD ô của mình có text là : 12345678
Trước khi bấm nút "gửi mail" thì mình có kéo ô đó nhỏ lại cho dễ hiển thị, nên nó chỉ hiển thị : 12345 (thực chất giá trị vẫn là 123456)
Khi email xuất ra thì ô tương ứng chỉ thể hiện đúng màn hình excel thể hiện là 12345 , chứ không phải là 12345678

Bạn hướng dẫn mình sửa code với
Bạn thử file ở file đính kèm nhé.
 

File đính kèm

Upvote 0
Bạn ơi, bạn dùng Shrink to fit trong excel để dữ liệu tự thu nhỏ trong 1 ô phải không ?
Nhưng không được bạn ơi, ghi xuất email gởi, nó vẫn mất dữ liệu chứ không tự thu nhỏ vào trong 1 ô như excel
 
Upvote 0
Bạn ơi, bạn dùng Shrink to fit trong excel để dữ liệu tự thu nhỏ trong 1 ô phải không ?
Nhưng không được bạn ơi, ghi xuất email gởi, nó vẫn mất dữ liệu chứ không tự thu nhỏ vào trong 1 ô như excel

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.

[video=youtube;3QP9aMoFkuc]http://www.youtube.com/watch?v=3QP9aMoFkuc&amp;feature=youtu.be[/video]
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn sự nhiệt tình của bạn rất nhiều. Còn up clip cho mình xem nữa. Thật chân thành cám ơn bạn
Nhưng trong cái clip, bạn ơi, rõ ràng là lúc bạn xuất email, nó bị mất dữ liệu kìa, bạn nhìn kỹ ô chứa Tên trong email xem, còn có "Lê Phát" àh, thiếu "Đởm"
Bạn khắc phục giúp mình với
 
Upvote 0
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

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

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

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

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

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
Upvote 0
Bạn tự dịch mấy dòng tiếng Anh đó là hiểu ngay mà.
Tôi đoán là chương trình out look không cho gửi và bạn phải update chương trình diệt virut!

Người ta đang dùng code để gửi mail mà bạn. Cái người ta hỏi là làm sao tắt cái thông báo ấy khi chạy code gửi mail ấy.
 
Upvote 0
Người ta đang dùng code để gửi mail mà bạn. Cái người ta hỏi là làm sao tắt cái thông báo ấy khi chạy code gửi mail ấy.
Đúng đó các anh chị ah, làm sao để tắt được cái thông báo đó khi gửi mail ấy ạ.
Hôm trước có vọc được code này cũng trên GPE, khi gửi mail thì không bị thông báo như code bên trên:
Mã:
Sub Send_Files()
Dim OutApp As Object
Dim OutMail As Object
Dim sh As Worksheet
Dim cell As Range, FileCell As Range, rng As Range
With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With
Set sh = Sheets("Sheet1")
Set OutApp = CreateObject("Outlook.Application")
OutApp.Session.Logon
For Each cell In sh.Columns("B").Cells.SpecialCells(xlCellTypeConstants)
    'Enter the file names in the C:Z column in each row
    Set rng = sh.Cells(cell.Row, 1).Range("C1:Z1")
    If cell.Value Like "?*@?*.?*" And Application.WorksheetFunction.CountA(rng) > 0 Then
        Set OutMail = OutApp.CreateItem(0)
        With OutMail
            .To = cell.Value
            .Subject = "Dear Mr/Mrs"
            .Body = "Hi " & cell.Offset(0, -1).Value
            For Each FileCell In rng.SpecialCells(xlCellTypeConstants)
                If Trim(FileCell) <> "" Then
                    If Dir(FileCell.Value) <> "" Then
                        .Attachments.Add FileCell.Value
                    End If
                End If
            Next FileCell
            .Send
        End With
        Set OutMail = Nothing
    End If
Next cell
Set OutApp = Nothing
With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With
End Sub

Anh chị xem giúp em nhé.
 
Upvote 0
Đúng đó các anh chị ah, làm sao để tắt được cái thông báo đó khi gửi mail ấy ạ.
Hôm trước có vọc được code này cũng trên GPE, khi gửi mail thì không bị thông báo như code bên trên:
Mã:
Sub Send_Files()
Dim OutApp As Object
Dim OutMail As Object
Dim sh As Worksheet
Dim cell As Range, FileCell As Range, rng As Range
With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With
Set sh = Sheets("Sheet1")
Set OutApp = CreateObject("Outlook.Application")
OutApp.Session.Logon
For Each cell In sh.Columns("B").Cells.SpecialCells(xlCellTypeConstants)
    'Enter the file names in the C:Z column in each row
    Set rng = sh.Cells(cell.Row, 1).Range("C1:Z1")
    If cell.Value Like "?*@?*.?*" And Application.WorksheetFunction.CountA(rng) > 0 Then
        Set OutMail = OutApp.CreateItem(0)
        With OutMail
            .To = cell.Value
            .Subject = "Dear Mr/Mrs"
            .Body = "Hi " & cell.Offset(0, -1).Value
            For Each FileCell In rng.SpecialCells(xlCellTypeConstants)
                If Trim(FileCell) <> "" Then
                    If Dir(FileCell.Value) <> "" Then
                        .Attachments.Add FileCell.Value
                    End If
                End If
            Next FileCell
            .[COLOR=#ff0000]Display[/COLOR]
        End With
        Set OutMail = Nothing
    End If
  [COLOR=#ff0000]SendKeys "%{s}"[/COLOR][COLOR=#ff0000], True[/COLOR]
Next cell
Set OutApp = Nothing
With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With
End Sub

Anh chị xem giúp em nhé.
Thử cái dòng màu đỏ xem sao
 
Lần chỉnh sửa cuối:
Upvote 0
Thử cái dòng màu đỏ xem sao

Em có thử đoạn trên của anh nhưng cái thông báo đó vẫn còn.
Search trên mạng họ có hướng dẫn code như thế này:
Mã:
                 [COLOR=#008000]' Declare Windows' API functions[/COLOR]
                [COLOR=#000080]Private Declare Function[/COLOR] RegisterWindowMessage _
        Lib "user32" Alias "RegisterWindowMessageA" _
        (ByVal lpString As String) As Long
                
                [COLOR=#000080]Private Declare Function[/COLOR] FindWindow Lib "user32" _
        Alias "FindWindowA" (ByVal lpClassName As Any, _
        ByVal lpWindowName As Any) As Long
                
                [COLOR=#000080]Private Declare Function[/COLOR] SendMessage Lib "user32" _
        Alias "SendMessageA" (ByVal hwnd As Long, _
        ByVal wMsg As Long, ByVal wParam As Long, _
        lParam As Any) As Long
                
                [COLOR=#000080]Private Sub[/COLOR] SomeProc()
                [COLOR=#000080]Dim[/COLOR] wnd As Long
                [COLOR=#000080]Dim[/COLOR] uClickYes As Long
                [COLOR=#000080]Dim[/COLOR] Res As Long
                
                [COLOR=#008000]' Register a message to send
                [/COLOR]uClickYes = RegisterWindowMessage("CLICKYES_SUSPEND_RESUME")
                
                [COLOR=#008000]' Find ClickYes Window by classname
                [/COLOR]wnd = FindWindow("EXCLICKYES_WND", 0&)
                
                [COLOR=#008000]' Send the message to Resume ClickYes
                [/COLOR]Res = SendMessage(wnd, uClickYes, 1, 0)
                
                [COLOR=#008000]' ...
                ' Do some Actions
                ' ...
                [/COLOR]
                [COLOR=#008000]' Send the message to Suspend ClickYes
                [/COLOR]Res = SendMessage(wnd, uClickYes, 0, 0)
                
                [COLOR=#000080]End Sub[/COLOR]

Các anh chị tham khảo nhé !
 
Upvote 0
Thông báo đó là do outlook security khi gởi mail hàng loạt bằng vba nhằm tránh spam đó mà . Hôm trước mình viết code gởi mail bảng chi tiết lương hơn 500 nhân viên Outlook cung báo vậy. Có 2 cách khắc phục : nếu bạn rành về hệ thống thì vào Regedit sửa còn không thí có tool để enable một số port trong out look la ok . bạn cần thì mail cho mình khongventoan@gmail.com
 
Upvote 0
Upvote 0
Gửi Hai lua mien Tay,
Cho mình hỏi 1 chút, về file gửi email đến từng người thì có thể sửa lại một số điểm như sau nữa không :
+ Định dạng số liệu hiển thị trên email có dấu , ngăn cách hàng nghìn như định dạng vốn có trong exel.
+ File exel đính kèm email gửi cho mỗi người có thể hiển thị công thức được không ? Vì mọi người rất muốn cách tính toán như thế nào.
+ Số cột hiển thị trên email bằng số cột hiển thị trên file exel( file của bạn làm có 18 cột, nếu xóa đi 1 cột chẳng hạn thì trên email vẫn còn hiện lên cột đó dù ko có dữ liệu; giờ mình muốn ko hiển thị cột đó nữa)
Many thanks !
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Gửi Hai lua mien Tay,
Cho mình hỏi 1 chút, về file gửi email đến từng người thì có thể sửa lại một số điểm như sau nữa không :
+ Định dạng số liệu hiển thị trên email có dấu , ngăn cách hàng nghìn như định dạng vốn có trong exel.
+ File exel đính kèm email gửi cho mỗi người có thể hiển thị công thức được không ? Vì mọi người rất muốn cách tính toán như thế nào.
+ Số cột hiển thị trên email bằng số cột hiển thị trên file exel( file của bạn làm có 18 cột, nếu xóa đi 1 cột chẳng hạn thì trên email vẫn còn hiện lên cột đó dù ko có dữ liệu; giờ mình muốn ko hiển thị cột đó nữa)
Many thanks !

Bạn gửi form của bạn lên xem thử nhé.
 
Upvote 0
Mình gửi đây, bạn xem nhé.
Mình có thêm 1 đề xuất nữa là khi nhấn gửi email thì nghĩa là gửi đi luôn mà ko cần nhấn send cho mỗi người nữa
--
Chỗ hiển thị cột thì mình biết cách sửa rồi nhé, sửa 18 thành số cột mong muốn hiển thị là ok
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình gửi đây, bạn xem nhé.
Mình có thêm 1 đề xuất nữa là khi nhấn gửi email thì nghĩa là gửi đi luôn mà ko cần nhấn send cho mỗi người nữa
--
Chỗ hiển thị cột thì mình biết cách sửa rồi nhé, sửa 18 thành số cột mong muốn hiển thị là ok

Bạn đã làm rồi mà, chỉnh gửi luôn thay vì hiển thị thì bạn thay .Display thành .Send là được.
 
Upvote 0
Còn vụ hiển thị số liệu có dấu, ở hàng nghìn và hiện công thức trong file attach nữa; bạn sửa lại giúp mình nhé.
 
Upvote 0
Còn vụ hiển thị số liệu có dấu, ở hàng nghìn và hiện công thức trong file attach nữa; bạn sửa lại giúp mình nhé.
Phần diễn giải công thức, bạn nên thêm vào phần tiêu đề cột cho dể nhìn.

Mã:
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 16
          strHeader = strHeader & " " & "<th>" & Ash.Cells(1, i) & "</th>"
    Next
    If Rcount >= 2 Then
        For Rnum = 2 To Rcount
            strRow = ""
            For ir = 1 To 16
                strRow = strRow & " " & "<td>" & Format(Ash.Cells(Rnum, ir), "#,##0") & "</td>"
                Sheets("Form").Cells(8, ir) = Format(Ash.Cells(Rnum, ir), "#,##0")
            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 "d:\" & FileName
            On Error GoTo 0
            WB.SaveAs FileName:="d:\" & FileName
            If mailAddress <> "" Then
                Set OutMail = OutApp.CreateItem(0)
                With OutMail
                    .To = mailAddress
                    .Subject = " Chi ti" & ChrW(7871) & "t thu" & ChrW(7871) & " TNCN T5.2013: " & Ash.Range("B" & Rnum)
                    .Attachments.Add WB.FullName
                    .HTMLBody = "Dear Anh/Ch" & ChrW(7883) & ",</B><BR>" & _
                           "Xin vui lòng xem chi ti" & ChrW(7871) & "t thu" & ChrW(7871) & " TNCN T5.2013 nh" & ChrW(432) & " bên d" & ChrW(432) & ChrW(7899) & "i:<BR><BR>" & _
                                "<table border=1><tr>" & _
                                strHeader & _
                                "</tr><tr>" & _
                                strRow & _
                                "</tr>" & _
                                "</table>" & _
                                "<BR>" & _
                            "N" & ChrW(7871) & "u có gì th" & ChrW(7855) & "c m" & ChrW(7855) & "c xin vui lòng ph" & ChrW(7843) & "n h" & ChrW(7891) & "i s" & ChrW(7899) & "m<BR>" & _
                              "<B>Best regards,</B>" & _
                            "<BR>" & _
                            "<B>ABC<B>" & _
                            "<BR>" & _
                            Ash.Range("O5")
                    .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

Bạn test thử nhé.
 

File đính kèm

Upvote 0
Mình test thì thấy ở file exel vẫn không hiển thị công thức.
Còn dòng "Xin vui lòng xem chi tiết..."
và "Nếu có gì thắc mắc..."
thì bị lỗi font chữ.
Còn số liệu format ở email thì hiển thị đúng theo ý mình rồi.
 
Upvote 0
Mình test thì thấy ở 1./ file exel vẫn không hiển thị công thức.
Còn dòng "Xin vui lòng xem chi tiết..."
và "Nếu có gì thắc mắc..."
thì 2./ bị lỗi font chữ.
Còn số liệu format ở email thì hiển thị đúng theo ý mình rồi.
1./ Bài 54 tôi đã nói "Phần diễn giải công thức, bạn nên thêm vào phần tiêu đề cột cho dể nhìn." và tôi cũng làm form cho bạn xem rồi.
2./ Máy tôi thì test ok.
 
Upvote 0
1.Mình hiểu là ko thể hiện được công thức trên file exel mà chỉ hiện được bằng dòng tiêu đề thôi.
2.Lỗi font thì mình tự sửa được trong code rồi.
Cám ơn bạn nhiều nhé.
 
Upvote 0
1.Mình hiểu là ko thể hiện được công thức trên file exel mà chỉ hiện được bằng dòng tiêu đề thôi.
2.Lỗi font thì mình tự sửa được trong code rồi.
Cám ơn bạn nhiều nhé.
1./ Cũng có thể hiển thị được công thức nhưng nó rất rườm rà, ghi tiêu đề thế là người ta hiểu rồi bạn.
2./ "Người thông minh không chịu học thì có khác gì đất tốt mà không được cày xới...." ---> Nó hiển thị đúng không bạn?
 
Upvote 0
dear anh
file gửi lại này quả là rất hay
nhưng em thấy khi gửi nó lại gửi hết luôn
lệnh yes ở cột j không còn tác dụng
anh có thể xem lại được không anh
thanks
 
Upvote 0
Gửi mail thông báo tự động

Chào các bác

Em hiện giờ đang có 1 file excel, em muốn dùng file này để gửi mail thông báo lương tự động đến từng người. Mỗi người sẽ nhận được mail đính kèm file excel, nội dung file đính kèm là thông báo lương tương ứng với tên từng người trong file. Nội dung em muốn lấy là từ cột D1 đến cột BO1, cột cuối cùng là email của từng người nhận. Em gửi qua MS Outlook 2007 các bác nhé.

Trong file này em có 1 số dữ liệu được lấy bằng cách lookup từ 1 số file khác, không biết có vấn đề gì không ạ?

Em kém VBA lắm, nên mong các bác giúp em. Em xin cảm ơn các bác trước ạ!
 

File đính kèm

Upvote 0
Chào các bác

Em hiện giờ đang có 1 file excel, em muốn dùng file này để gửi mail thông báo lương tự động đến từng người. Mỗi người sẽ nhận được mail đính kèm file excel, nội dung file đính kèm là thông báo lương tương ứng với tên từng người trong file. Nội dung em muốn lấy là từ cột D1 đến cột BO1, cột cuối cùng là email của từng người nhận. Em gửi qua MS Outlook 2007 các bác nhé.

Trong file này em có 1 số dữ liệu được lấy bằng cách lookup từ 1 số file khác, không biết có vấn đề gì không ạ?

Em kém VBA lắm, nên mong các bác giúp em. Em xin cảm ơn các bác trước ạ!

Chào bạn,
Mình gởi file giải quyết vấn đề bạn muốn làm đây.
Đây là file mình làm riềng khong dựa trên file của bạn, có gì update lên file của bạn hay link data vao file mình gởi.
Nhân đây mình xin cám ơn tác giả trong trang web này vì mình dựa vào đó để tạo ra cái riêng của mình. Xin cám ơn.
 

File đính kèm

Upvote 0
Upvote 0
Chào bạn,
Mình gởi file giải quyết vấn đề bạn muốn làm đây.
Đây là file mình làm riềng khong dựa trên file của bạn, có gì update lên file của bạn hay link data vao file mình gởi.
Nhân đây mình xin cám ơn tác giả trong trang web này vì mình dựa vào đó để tạo ra cái riêng của mình. Xin cám ơn.
Cảm ơn bác đã giúp em, nhưng khi em update lên file của em thì nó không chạy bác ạ.
Không biết bác có thể giúp em được không ạ, bác sửa luôn trong file của em giúp em với!
 
Upvote 0
Cảm ơn bác đã giúp em, nhưng khi em update lên file của em thì nó không chạy bác ạ.
Không biết bác có thể giúp em được không ạ, bác sửa luôn trong file của em giúp em với!

Trong sheet "Mailinfo" mình có để cột C, bạn muốn gởi mail tới người nào thì đặt địa chỉ mail người đó vào tương ứng, chú ý phải mở Outlook lên trước khi gởi mail nha.

Mình gởi lại file vì có người chạy bị lỗi vì 1 biến chưa khai báo.

chào.
 

File đính kèm

Upvote 0
Tìm cái đề tài này khắp các diễn đàn khác mà thấy phức tạp quá,nhìn cái này dễ hiểu hơn rồi,thank Hai Lúa Miền Tây nhiều
 
Upvote 0
Chào các anh/chị
Mình mới biết đến chức năng gửi phiếu lương tự động bằng Macro qua mail
Mình có đọc và xem các file đính kèm trên nhưng có phần chưa biết là
Cái nút vàng "sendmail" tạo ra như thế nào để khi mình nhấn vào nó sẽ gửi hàng loạt thư
Cám ơn các anh/chị
 
Upvote 0
dear anh

trong sheet Send_Mail em muốn chỉnh lại khi send mail thì cột tựa đề là hai dòng nhưng chỉnh hoài không được nhờ anh hỗ trợ giúp em.

EX:

Các khoản được miễn/ giảm thuế (dòng 1)

BHXH BHYT KPCĐ TNCN (dòng 2 có 3 cột)


thanks!
 
Lần chỉnh sửa cuối:
Upvote 0
Gửi anh HLMT: Em đang thử áp dụng code trên để gửi email cho giáo viên (gửi file điểm, file lý lịch học sinh,...). Sau khi chỉnh sửa thì code của em chỉ có như vầy:
[GPECODE=vb]Sub GuiMail(DiaChi As String, Optional TieuDe As String, Optional NoiDung As String, Optional FileDK As String)
Dim OutApp As Object, OutMail As Object
On Error GoTo CleanUp
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = DiaChi
If TieuDe <> "" Then .Subject = TieuDe
If NoiDung <> "" Then .HTMLBody = NoiDung
If FileDK <> "" Then .Attachments.Add FileDK
.Send
End With
CleanUp:
Set OutApp = Nothing: Set OutMail = Nothing
End Sub[/GPECODE]
Sau đó em sẽ truyền tham số vào cho code chạy tùy theo chức năng. Tuy nhiên khi chạy code, em gặp vấn đề là: Email được tạo theo đúng yêu cầu nhưng chờ mãi không thấy gửi đi, chỉ khi nào mở Outlook và vào Outbox, click chọn các email đã tạo thì chúng mới được gửi đi.

Không biết code của em có vấn đề gì nhỉ? Và trong code trên, các tham số 2, 3, 4 em khai báo như vậy có ổn không nhỉ?
 
Upvote 0
Gửi anh HLMT: Em đang thử áp dụng code trên để gửi email cho giáo viên (gửi file điểm, file lý lịch học sinh,...). Sau khi chỉnh sửa thì code của em chỉ có như vầy:
[GPECODE=vb]Sub GuiMail(DiaChi As String, Optional TieuDe As String, Optional NoiDung As String, Optional FileDK As String)
Dim OutApp As Object, OutMail As Object
On Error GoTo CleanUp
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = DiaChi
If TieuDe <> "" Then .Subject = TieuDe
If NoiDung <> "" Then .HTMLBody = NoiDung
If FileDK <> "" Then .Attachments.Add FileDK
.Send
End With
CleanUp:
Set OutApp = Nothing: Set OutMail = Nothing
End Sub[/GPECODE]
Sau đó em sẽ truyền tham số vào cho code chạy tùy theo chức năng. Tuy nhiên khi chạy code, em gặp vấn đề là: Email được tạo theo đúng yêu cầu nhưng chờ mãi không thấy gửi đi, chỉ khi nào mở Outlook và vào Outbox, click chọn các email đã tạo thì chúng mới được gửi đi.

Không biết code của em có vấn đề gì nhỉ? Và trong code trên, các tham số 2, 3, 4 em khai báo như vậy có ổn không nhỉ?
Em mới phát hiện ra một vấn đề (có thể là cũ rích với mọi người): Nếu bật Outlook trước khi chạy code thì Email được gửi bình thường, nhưng nếu không bật Outlook trước đó thì dù .Send hay .DisplayApplication.SendKeys "%S", True vẫn không ăn thua.

Em đang nghĩ đến vấn đề: Sử dụng Sendkeys để bật Outlook lên (giống như chuỗi thao tác: nhấn Window+R để mở hộp thoại Run, gõ vào Outlook và Enter), sau đó lại Sendkeys để gửi các thư trong Outbox nhưng mà lại không có mã nào tương ứng với phím Window cả.
 
Upvote 0
Em mới phát hiện ra một vấn đề (có thể là cũ rích với mọi người): Nếu bật Outlook trước khi chạy code thì Email được gửi bình thường, nhưng nếu không bật Outlook trước đó thì dù .Send hay .DisplayApplication.SendKeys "%S", True vẫn không ăn thua.

Em đang nghĩ đến vấn đề: Sử dụng Sendkeys để bật Outlook lên (giống như chuỗi thao tác: nhấn Window+R để mở hộp thoại Run, gõ vào Outlook và Enter), sau đó lại Sendkeys để gửi các thư trong Outbox nhưng mà lại không có mã nào tương ứng với phím Window cả.

Mở outlook thì mình có hàm shell

Shell("Outlook")
 
Upvote 0
Mở outlook thì mình có hàm shell

Shell("Outlook")
Như vậy, em thêm câu lệnh Shell "Outlook" vào trước câu lệnh With ở trên, thấy tạm thời chấp nhận được, nghĩa là có gửi email đến đúng nơi và cũng không quá lâu, tuy nhiên vẫn chưa ưng ý lắm vì sau đó lại phải tắt Outlook một cách thủ công nữa vì chưa chắc Outlook đang là cửa sổ hiện hành để Sendkeys "%{F4}".

P/S: Không biết các bạn khác đã sử dụng code GuiMail của anh HLMT có gặp vấn đề giống như mình nêu ở bài #69 không nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Chào bạn Hai Lúa Miền Tây, Mình đã down file của bạn và đang tham khảo để ứng dung, tuy nhiên mình gặp vấn đề là: 1. Nếu có nhiều dòng bất kỳ muốn gửi cho 1 người ( ví dụ trong bang tính có dòng 1,5,7 gửi cho mã nhân viên là A01) thì làm sao gửi được; 2. Mình tạo mãi button "Guimail" nhưng nó cứ báo lỗi, bạn giúp mình với nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Em mới phát hiện ra một vấn đề (có thể là cũ rích với mọi người): Nếu bật Outlook trước khi chạy code thì Email được gửi bình thường, nhưng nếu không bật Outlook trước đó thì dù .Send hay .DisplayApplication.SendKeys "%S", True vẫn không ăn thua.

Em đang nghĩ đến vấn đề: Sử dụng Sendkeys để bật Outlook lên (giống như chuỗi thao tác: nhấn Window+R để mở hộp thoại Run, gõ vào Outlook và Enter), sau đó lại Sendkeys để gửi các thư trong Outbox nhưng mà lại không có mã nào tương ứng với phím Window cả.

Có ngàn cách khởi động phần mềm mà sao bạn lại chọn cách đó? Mà tôi không kết SendKeys.
Nếu cứ muốn mở RUN thì vd.

Mã:
Private Const KEYEVENTF_KEYUP = 2
Private Const VK_LWIN = 91    ' WIN bên trái
Private Const VK_R = 82
Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

...
    keybd_event VK_LWIN, 0, 0, 0
    keybd_event VK_R, 0, 0, 0
    keybd_event VK_LWIN, 0, KEYEVENTF_KEYUP, 0
 
Upvote 0
Như vậy, em thêm câu lệnh Shell "Outlook" vào trước câu lệnh With ở trên, thấy tạm thời chấp nhận được, nghĩa là có gửi email đến đúng nơi và cũng không quá lâu, tuy nhiên vẫn chưa ưng ý lắm vì sau đó lại phải tắt Outlook một cách thủ công nữa vì chưa chắc Outlook đang là cửa sổ hiện hành để Sendkeys "%{F4}".

Nếu bạn đã trót mở (trót vì có hàng ngàn cách mở khác) bằng Shell thì ít ra có 2 cách để đóng. Cách nào thì cũng phải tìm ra "đối tác" rồi
1. Dùng thông điệp WM_QUIT - Sub CloseByMessage
Cách này là: Ông ơi, đã đến lúc về gặp tổ tiên. Ông hãy làm những việc cần thiết trước lúc ra đi đi.

2. Dùng Terminate - Sub CloseByTerminate
Cách này là "một nhát dao vào lưng". Chết đột ngột không kịp "thu dọn" gì cả.

Mã:
Private Const PROCESS_TERMINATE As Long = (&H1)
Private Const WM_QUIT As Long = &H12

Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, ByRef lpdwProcessId As Long) As Long
Private Declare Function PostThreadMessage Lib "user32.dll" Alias "PostThreadMessageA" (ByVal idThread As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long

Sub Dong(ByVal processID As Long)
Dim hProc As Long
    hProc = OpenProcess(PROCESS_TERMINATE, 0, processID)
    If hProc <> 0 Then
        TerminateProcess hProc, 0
        CloseHandle hProc
    End If
End Sub

Private Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
Dim threadID As Long, processID As Long
    threadID = GetWindowThreadProcessId(hwnd, processID)
    If processID = lParam Then
        PostThreadMessage threadID, WM_QUIT, 0, 0
        EnumWindowsProc = False
    Else
        EnumWindowsProc = True
    End If
End Function

Sub CloseByTerminate()
Dim res
    res = Shell("outlook")
    Sleep 10000
    Dong res
End Sub

Sub CloseByMessage()
Dim res, hwnd As Long
    res = Shell("outlook")
    Sleep 10000
    EnumWindows AddressOf EnumWindowsProc, res
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Có ngàn cách khởi động phần mềm mà sao bạn lại chọn cách đó? Mà tôi không kết SendKeys.
Nếu cứ muốn mở RUN thì vd.

Mã:
Private Const KEYEVENTF_KEYUP = 2
Private Const VK_LWIN = 91    ' WIN bên trái
Private Const VK_R = 82
Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

...
    keybd_event VK_LWIN, 0, 0, 0
    keybd_event VK_R, 0, 0, 0
    keybd_event VK_LWIN, 0, KEYEVENTF_KEYUP, 0
Dạ, thì cũng do em không biết cách nào hơn nên mới phải nghĩ đến Sendkeys chứ cái vụ Sendkeys này cũng bất đắc dĩ lắm mới dùng tới. Nhưng mà để mở Outlook thì có thể sử dụng câu lệnh Shell "Outlook" cũng ổn rồi.
Xin cảm ơn anh vì các đoạn code mở và đóng Outlook.
 
Lần chỉnh sửa cuối:
Upvote 0
Như vậy, em thêm câu lệnh Shell "Outlook" vào trước câu lệnh With ở trên, thấy tạm thời chấp nhận được, nghĩa là có gửi email đến đúng nơi và cũng không quá lâu, tuy nhiên vẫn chưa ưng ý lắm vì sau đó lại phải tắt Outlook một cách thủ công nữa vì chưa chắc Outlook đang là cửa sổ hiện hành để Sendkeys "%{F4}".

P/S: Không biết các bạn khác đã sử dụng code GuiMail của anh HLMT có gặp vấn đề giống như mình nêu ở bài #69 không nhỉ?

Nếu vậy ta không dùng sendkeys chi, ta mở lên rồi thoát object đó ra là được, đâu nhất thiết phải Alt+F4...
 
Upvote 0
Thoát object đó bằng câu lệnh nào vậy anh, nếu không dùng cách ở bài #74?
Nghĩa Phúc thử code sau:

Mã:
Sub ThoatOutLook()
Dim OutApp As Object
Set OutApp = CreateObject("Outlook.Application")
Shell ("outlook")
Set OutApp = GetObject("", "Outlook.Application")

'////////////////////////////////////

'Lam cai gi do o day

'////////////////////////////////////

OutApp.Quit
Set OutApp = Nothing
   
End Sub
Lưu ý là nó sẽ đóng tất cả cửa sổ OutLook đang mở.
 
Upvote 0
Mở outlook thì mình có hàm shell

Shell("Outlook")

Chào bác, nhờ bác xem giúp file đính kèm với, 1. Trong sheet test có nhiều dòng trùng 1 mã email thì làm sao để sort lại và gửi đến cho 1 địa chỉ thôi; 2. Mình modify lại nhưng lỗi, bạn giúp code chạy giúp mình với.
 

File đính kèm

Upvote 0
Chào bác, nhờ bác xem giúp file đính kèm với, 1. Trong sheet test có nhiều dòng trùng 1 mã email thì làm sao để sort lại và gửi đến cho 1 địa chỉ thôi; 2. Mình modify lại nhưng lỗi, bạn giúp code chạy giúp mình với.
Bác Hai Lua Mien Tay hoặc bác nào giúp mình với, mình đang cần đoạn code này.
 
Upvote 0
Bác Hai Lua Mien Tay hoặc bác nào giúp mình với, mình đang cần đoạn code này.
Bạn dùng code này:

Mã:
Sub GuiMail()
Dim i As Integer
Sheet1.Activate
For i = 1 To Application.WorksheetFunction.CountA(Sheet5.Range("G103:G500"))
    Cells.Delete
    Sheet12.[A4:P100].AutoFilter Field:=16, Criteria1:=Sheet5.Cells(i + 102, 7)
    Sheet12.[a4].CurrentRegion.Copy [a1]
    [a1].CurrentRegion
    ActiveWorkbook.EnvelopeVisible = True
    With ActiveSheet.MailEnvelope
        .Introduction = "Dear Mr/Ms " & Sheet5.Cells(i + 102, 8) & vbNewLine & _
                        "Xin vui long xem chi tiet nhu ben duoi"
        .Item.To = Sheet5.Cells(i + 102, 9)
        .Item.Subject = "CHI TIET BANG LUONG: " & Sheet5.Cells(i + 102, 8)
        .Item.SEND
    End With
Next
Sheet12.ShowAllData
ActiveWorkbook.EnvelopeVisible = False
End Sub
 

File đính kèm

Upvote 0
Bạn dùng code này:

Mã:
Sub GuiMail()
Dim i As Integer
Sheet1.Activate
For i = 1 To Application.WorksheetFunction.CountA(Sheet5.Range("G103:G500"))
    Cells.Delete
    Sheet12.[A4:P100].AutoFilter Field:=16, Criteria1:=Sheet5.Cells(i + 102, 7)
    Sheet12.[a4].CurrentRegion.Copy [a1]
    [a1].CurrentRegion
    ActiveWorkbook.EnvelopeVisible = True
    With ActiveSheet.MailEnvelope
        .Introduction = "Dear Mr/Ms " & Sheet5.Cells(i + 102, 8) & vbNewLine & _
                        "Xin vui long xem chi tiet nhu ben duoi"
        .Item.To = Sheet5.Cells(i + 102, 9)
        .Item.Subject = "CHI TIET BANG LUONG: " & Sheet5.Cells(i + 102, 8)
        .Item.SEND
    End With
Next
Sheet12.ShowAllData
ActiveWorkbook.EnvelopeVisible = False
End Sub
Cảm ơn bác, phải dùng thêm 1 sheet temp nữa hả Bác? không dùng có được không? mình muốn gửi kèm cùng file excel nữa, bạn giúp mình với.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình đang dùng MailEnvelope để tự động gửi mail qua outlook, các bạn cho mình hỏi có cách nào để giữ nguyên định dạng form của sheet cần gửi khi gửi mail không, giống như mình copy sheet đó rồi paste sang phần gửi mail vậy.


ActiveSheet.Range("A1:I61").Select
ActiveWorkbook.EnvelopeVisible = True
With ActiveSheet.MailEnvelope
.Introduction = "This is a sample worksheet."
.Item.To = email
.Item.Subject = Sheet4.Range("I1").Value
.Item.Send
End With

Thank all so much!

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau
 
Lần chỉnh sửa cuối:
Upvote 0
Em muốn gửi phiếu lương qua email đến từng nhân viên có tên trên bảng lương. Tuy nhiên xem bảng của các bác làm em ko biết cách phải làm thế nào để ra được chữ ''gửi email''. Các bác hướng dẫn chi tiết cách làm cho em với.
 
Upvote 0
Gửi anh Hai Lúa Miền Tây!
Hiện tại bảng lương của em có nhiều dữ liệu và cần nhiều cột. Anh có thể mở rộng ra 50 cột giúp em được không ạ?

Mẫu của em cần như file đính kèm ạ.

em cảm ơn anh nhiều ah!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Gửi anh Hai Lúa Miền Tây!
Hiện tại bảng lương của em có nhiều dữ liệu và cần nhiều cột. Anh có thể mở rộng ra 50 cột giúp em được không ạ?

Mẫu của em cần như file đính kèm ạ.

em cảm ơn anh nhiều ah!

Em dựa vào bài #35 rồi thay số 18 thành số cột mong muốn là được. Tuy nhiên với số lượng cột nhiều như vậy thì nên gửi file đính kèm thôi chứ thêm bảng dán vào Body ở outlook thì không ổn.
 
Upvote 0
Em dựa vào bài #35 rồi thay số 18 thành số cột mong muốn là được. Tuy nhiên với số lượng cột nhiều như vậy thì nên gửi file đính kèm thôi chứ thêm bảng dán vào Body ở outlook thì không ổn.

Anh ơi, không hiểu sao máy em thao tác cứ bị lỗi. Từ hôm qua tới giờ, không code nào chạy cả. Nên anh có thể giúp em trên bảng thực tế em gửi vào email của anh không ạ? Hoặc là skype ấy ạ.

Em cảm ơn anh nhiều!
 
Lần chỉnh sửa cuối:
Upvote 0
Gửi anh Hai Lúa Miền Tây!
Em đã thao tác sửa mà code lỗi hoài. Sau khi tạo file và lưu form vào ổ D, Đổi display thành.send. Code vẫn báo vàng,....Anh giúp em điều chỉnh lại như file lương thực tế em gửi nhờ vào email của anh đó ạ
Vì file lương em không thay đổi số liệu nên em không gửi lên diễn đàn được ạ
Anh giúp em với nhé! Em cần lắm ạ!

Em cảm ơn anh nhiều!
 
Upvote 0
Cuối cùng thì em cũng làm được rồi, sau 1 ngày sửa code và những vấn đề liên quan! Em cảm ơn anh HLMT nhé!
hihihi. Giờ thì nhấn 1 nút.....là code chạy ngon lành!
 
Upvote 0
Nhân bàn về vấn đề này, em cũng muốn hỏi anh HLMT và các AC xem cho em ví dụ này và tạo dùm cho em code gửi phiếu lĩnh lương bằng mail đến mọi người trong VP của em ah!
 

File đính kèm

Upvote 0
Nhân bàn về vấn đề này, em cũng muốn hỏi anh HLMT và các AC xem cho em ví dụ này và tạo dùm cho em code gửi phiếu lĩnh lương bằng mail đến mọi người trong VP của em ah!

Không có danh sách, không có dữ liệu thì gửi cái gì đây bạn.
 
Upvote 0
Vâng, em gửi lại anh xem dùm cho em nhé!

Bạn chạy code sau nhé:

Mã:
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 = Sheet2
    Rcount = Application.WorksheetFunction.CountA(Ash.[B8:B1000]) - 1
    For i = 4 To 15
       strHeader = strHeader & " " & "<th>" & Ash.Cells(7, i) & "</th>"
    Next
    If Rcount >= 2 Then
        For Rnum = 8 To Rcount + 7
            strRow = ""
            With Sheets("PLUONG")
               .Cells(5, 4) = Ash.Cells(Rnum, 2)
               .Cells(6, 4) = Ash.Cells(Rnum, 3)
               .Cells(7, 9) = Ash.Cells(Rnum, 16)
            End With
            For ir = 4 To 15
               strRow = strRow & " " & "<td>" & Format(Ash.Cells(Rnum, ir), "#,##0") & "</td>"
               Sheets("PLUONG").Cells(10, ir - 3) = Format(Ash.Cells(Rnum, ir), "#,##0")
            Next
            mailAddress = ""
            On Error Resume Next
            mailAddress = Ash.Cells(Rnum, 16)
            Sheets("PLUONG").Copy
            Set WB = ActiveWorkbook
            FileName = Ash.Cells(Rnum, 2)
            Kill "D:\" & FileName
            On Error GoTo 0
            WB.SaveAs FileName:="D:\" & FileName
            If mailAddress <> "" Then
                Set OutMail = OutApp.CreateItem(0)
                With OutMail
                   .To = mailAddress
                   .Subject = "Chi tiet bang luong: " & Ash.Range("C" & Rnum) _
                            & " (Voi ma so la " & Ash.Range("B" & Rnum) & ")"
                   .Attachments.Add WB.FullName
                   .HTMLBody = "<B>Dear " & Ash.Range("C" & Rnum) & ",</B><BR>" & _
                            "Xin vui long xem chi tiet bang luong nhu ben duoi hoac file dinh kem:<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
cleanup:
Set OutApp = Nothing: Set OutMail = Nothing
End Sub
 

File đính kèm

Upvote 0
Tìm mãi mới ra được cái dấu xuống dòng "</B><BR>" .
Cảm ơn anh HLMT.
 
Upvote 0
Anh Hai Lúa Miền Tây ơi, giúp em với được không ạ ?

Em gửi file theo form như thế này, a giúp e với nhá

Mò mẫm mãi chả được, thôi để lại form trắng thế này. Có gì anh giúp e ạ

Em cảm ơn nhiều :D
 

File đính kèm

Upvote 0
Em gửi file theo form như thế này, a giúp e với nhá

Mò mẫm mãi chả được, thôi để lại form trắng thế này. Có gì anh giúp e ạ

Em cảm ơn nhiều :D
Bạn chạy code sau:

Mã:
Private Sub Send_File_Click()
    Dim OutlookApp As Object, MailItem As Object, i As Integer
    With Sheet1
        For i = 1 To Application.WorksheetFunction.CountA(.[A6:A1000])
            .[A5:A1000].AutoFilter Field:=1, Criteria1:=.Cells(i + 5, 1)
            .[A4].CurrentRegion.CopyPicture
            Set OutlookApp = CreateObject("Outlook.Application")
            Set MailItem = OutlookApp.CreateItem(0)
            With MailItem
               .To = Sheet1.Cells(i + 5, 2)
               .Subject = "Bang luong cua: " & Sheet1.Cells(i + 5, 1)
               .HTMLBody = " <B>Dear " & Sheet1.Cells(i + 5, 1) & "</B>" & _
                            "<BR><BR><BR><BR>Neu co thac mac gi xin phan hoi som" & _
                            "<BR><B>Xin cam on,</B><BR>" & _
                            "<BR><B>HLMT</B>"
               .Display
            End With
            SendKeys "({DOWN})", True
            SendKeys "({DOWN})", True
            SendKeys "^({v})", True
        Next
        .ShowAllData
    End With
    Set OutlookApp = Nothing
    Set MailItem = Nothing
   
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Anh HLMT ơi, ý của em là muốn tách dữ liệu của từng người rồi đính kèm vào mail hì...có gì anh giúp em nhá !
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom