[Help] - Kiểm tra và giúp đỡ về gởi email bảng lương có đặt mật khẩu

Liên hệ QC

subasatran

Thành viên hoạt động
Tham gia
17/3/13
Bài viết
114
Được thích
6
Xin chào A/C/E của diễn đàn GPE và chúc mọi người một ngày tuyệt vời,
Mình đang tự mày mò kiến thức trên diễn đàn để làm một form để gởi bảng lương có đặt mật khẩu từ một sheet trong file master.
Tuy nhiên, do mày mò nên mình không biết nó sai và bị lỗi ở đoạn nào ?
Nhờ A/C/E có kinh nghiệm kiểm tra và giúp đỡ giúp. Cám ơn A/C/E rất nhiều.

Mục đích chính của mình là :
Có 1 file master bao gồm danh sách bảng lương của mỗi nhân viên(mỗi nhân viên là một sheet) => Mình muốn làm một form gởi email tự động.
Khi gởi mail cho nhân viên nào thì sẽ copy bảng lương của nhân viên đó tạo thành một file excel đính kèm của email và đặt mật khẩu theo quy định(giả sử lấy theo ID nhân viên).
Code mình làm như bên dưới, tuy nhiên nó không gọi được Outlook và không gởi email được.
p/s : cho mình hỏi ngu thêm chút nữa là : từ excel có code nào export được tạo ra file pdf mà có đặt được mật khẩu của file pdf đó ko ? mình tìm cách export này mà ko ra

Mã:
Sub Send_Mail()
  Dim stFileName As String
  Dim fFile As String
  Dim stSubject As String
  Dim stMailContent As String
  Dim vaTo As Variant
  Dim vaCopyTo As Variant
  Dim vaBlindCopyTo As Variant
  Dim emailAlias As String
  Dim vaEnclosure As Variant
  Dim vaDisplayFrom As Variant
  Dim OutApp As Object
  Dim OutMail As Object
  Dim sPwd        As String
  Dim AgencyList  As ListObject
  Dim Agent       As ListRow
  Application.ScreenUpdating = False
  Set OutApp = CreateObject("Outlook.Application")

  On Error Resume Next

  Set AgencyList = ActiveWorkbook.Worksheets("AgencyList").ListObjects("AgencyListTable")
  If AgencyList.DataBodyRange Is Nothing Then
        MsgBox "No Agent"
        Exit Sub
  End If

  stSubject = Sheets("Form_SendMail").Range("MailSubject").Value

  stMailContent = Sheets("Form_SendMail").Range("MailContent").Value

  'emailAlias = Sheets("Form_SendMail").Range("EmailAlias").Value

  For Each Agent In AgencyList.ListRows
 
 
        If Agent.Range.Columns(4).Value Like "?*@?*.?*" And _
           LCase(Agent.Range.Columns(5).Value) = "x" Then
            On Error Resume Next
            Agent.Add
                If Err.Number = 0 Then
                    vaTo = Agent.Range.Columns(4).Value
                    MsgBox vaTo
                    stFileName = Agent.Range.Columns(6).Value
                    vaCopyTo = Agent.Range.Columns(7).Value
                    fFile = Environ("temp") & "\" & Agent.Range.Columns(6).Value & "_Payslip of " & MonthName(Month(Range("PayslipDate").Value), True) & " - " & Year(Range("PayslipDate").Value) & ".xlsx"
                    ActiveWorkbook.Worksheets(Agent.Range.Columns(6).Value).Copy
                    ActiveWorkbook.SaveAs _
                    Filename:=stFileName, _
                    FileFormat:=xlWorkbookDefault, _
                    Password:=Agent.Range.Columns(2).Value, _
                    WriteResPassword:=Agent.Range.Columns(2).Value
                    '------

                    Set OutMail = OutApp.CreateItem(0)

                        With OutMail
                            
                            .To = vaTo
                            '.SentOnBehalfOfName = emailAlias
                            '-------------------------------

                            .CC = vaCopyTo
                            '.Bcc = vaBlindCopyTo
                            '-------------------------------
                            .Subject = stSubject
                            '---------------------------- ---
                            .Body = stMailContent
                            '-------------------------------
                            .Attachments.Add fFile
                            .Display
                            .Send
                            
                            .SaveMessageOnSend = True
                            .PostedDate = Now()
                            .Send 0, vaTo
                          End With
                          Kill fFile
                  Set OutMail = Nothing
                End If
            
            On Error GoTo 0
        
        End If
    
    
    Next
            
 With Application
        .ScreenUpdating = True
        .EnableEvents = True
End With

  MsgBox "Done!", vbInformation
End Sub
 

File đính kèm

  • Payslip_Test.xlsm
    39.8 KB · Đọc: 6
Tôi nghĩ trước hết bạn tìm trong GPE lấy 1 sub VBA chuẩn về việc gửi mail bằng Outlook. Gửi cho được mail có đường dẫn file có sẵn đã, sau đó mới dần dần sửa code để gửi cho file mới tạo. Làm từng bước vững chắc chứ không là vấp.
 
Tôi nghĩ trước hết bạn tìm trong GPE lấy 1 sub VBA chuẩn về việc gửi mail bằng Outlook. Gửi cho được mail có đường dẫn file có sẵn đã, sau đó mới dần dần sửa code để gửi cho file mới tạo. Làm từng bước vững chắc chứ không là vấp.
Cám ơn bạn @Maika8008 .
Phần Sub gởi mail theo đường dẫn như bạn đề cập tôi làm được rồi.
Tuy nhiên do nhu cầu tôi muốn lưu một file master(sau khi đã gởi mail) bao gồm toàn bộ payslip của nhân viên(thay vì lưu theo từng payslip riêng lẻ) nên mới nghĩ cách để làm theo hướng này.
Phần code tôi đưa ra cũng là được sửa từ Sub gởi mail đính kèm file theo đường dẫn nhưng chưa thành công.
 
Cám ơn bạn @Maika8008 .
Phần Sub gởi mail theo đường dẫn như bạn đề cập tôi làm được rồi.
Tuy nhiên do nhu cầu tôi muốn lưu một file master(sau khi đã gởi mail) bao gồm toàn bộ payslip của nhân viên(thay vì lưu theo từng payslip riêng lẻ) nên mới nghĩ cách để làm theo hướng này.
Phần code tôi đưa ra cũng là được sửa từ Sub gởi mail đính kèm file theo đường dẫn nhưng chưa thành công.
Tôi không xem code gửi mail của bạn nên không biết sai ở đâu nhưng tôi gửi cho bạn code khác có thể chèn chữ ký, chèn ảnh. Tôi đã chạy thử rất tốt. Code này tôi lấy từ GPE ở thớt nào không nhớ, có ghi chú tiện cho việc hiểu và sửa đổi khi cần. Các hàm có trong module Setup là cần thiết để định dạng html cho chữ ký.
 

File đính kèm

  • Payslip_Test_subasatran.xlsm
    51 KB · Đọc: 18
Tôi không xem code gửi mail của bạn nên không biết sai ở đâu nhưng tôi gửi cho bạn code khác có thể chèn chữ ký, chèn ảnh. Tôi đã chạy thử rất tốt. Code này tôi lấy từ GPE ở thớt nào không nhớ, có ghi chú tiện cho việc hiểu và sửa đổi khi cần. Các hàm có trong module Setup là cần thiết để định dạng html cho chữ ký.
Cám ơn Maika8008 rất nhiều.
Tôi sẽ nghiên cứu thêm về module cực kỳ hữu ích của bạn. Thanks
 
Xin chào A/C/E của diễn đàn GPE và chúc mọi người một ngày tuyệt vời,
Mình đang tự mày mò kiến thức trên diễn đàn để làm một form để gởi bảng lương có đặt mật khẩu từ một sheet trong file master.
Tuy nhiên, do mày mò nên mình không biết nó sai và bị lỗi ở đoạn nào ?
Nhờ A/C/E có kinh nghiệm kiểm tra và giúp đỡ giúp. Cám ơn A/C/E rất nhiều.

Mục đích chính của mình là :
Có 1 file master bao gồm danh sách bảng lương của mỗi nhân viên(mỗi nhân viên là một sheet) => Mình muốn làm một form gởi email tự động.
Khi gởi mail cho nhân viên nào thì sẽ copy bảng lương của nhân viên đó tạo thành một file excel đính kèm của email và đặt mật khẩu theo quy định(giả sử lấy theo ID nhân viên).
Code mình làm như bên dưới, tuy nhiên nó không gọi được Outlook và không gởi email được.
p/s : cho mình hỏi ngu thêm chút nữa là : từ excel có code nào export được tạo ra file pdf mà có đặt được mật khẩu của file pdf đó ko ? mình tìm cách export này mà ko ra

Mã:
Sub Send_Mail()
  Dim stFileName As String
  Dim fFile As String
  Dim stSubject As String
  Dim stMailContent As String
  Dim vaTo As Variant
  Dim vaCopyTo As Variant
  Dim vaBlindCopyTo As Variant
  Dim emailAlias As String
  Dim vaEnclosure As Variant
  Dim vaDisplayFrom As Variant
  Dim OutApp As Object
  Dim OutMail As Object
  Dim sPwd        As String
  Dim AgencyList  As ListObject
  Dim Agent       As ListRow
  Application.ScreenUpdating = False
  Set OutApp = CreateObject("Outlook.Application")

  On Error Resume Next

  Set AgencyList = ActiveWorkbook.Worksheets("AgencyList").ListObjects("AgencyListTable")
  If AgencyList.DataBodyRange Is Nothing Then
        MsgBox "No Agent"
        Exit Sub
  End If

  stSubject = Sheets("Form_SendMail").Range("MailSubject").Value

  stMailContent = Sheets("Form_SendMail").Range("MailContent").Value

  'emailAlias = Sheets("Form_SendMail").Range("EmailAlias").Value

  For Each Agent In AgencyList.ListRows
 
 
        If Agent.Range.Columns(4).Value Like "?*@?*.?*" And _
           LCase(Agent.Range.Columns(5).Value) = "x" Then
            On Error Resume Next
            Agent.Add
                If Err.Number = 0 Then
                    vaTo = Agent.Range.Columns(4).Value
                    MsgBox vaTo
                    stFileName = Agent.Range.Columns(6).Value
                    vaCopyTo = Agent.Range.Columns(7).Value
                    fFile = Environ("temp") & "\" & Agent.Range.Columns(6).Value & "_Payslip of " & MonthName(Month(Range("PayslipDate").Value), True) & " - " & Year(Range("PayslipDate").Value) & ".xlsx"
                    ActiveWorkbook.Worksheets(Agent.Range.Columns(6).Value).Copy
                    ActiveWorkbook.SaveAs _
                    Filename:=stFileName, _
                    FileFormat:=xlWorkbookDefault, _
                    Password:=Agent.Range.Columns(2).Value, _
                    WriteResPassword:=Agent.Range.Columns(2).Value
                    '------

                    Set OutMail = OutApp.CreateItem(0)

                        With OutMail
                          
                            .To = vaTo
                            '.SentOnBehalfOfName = emailAlias
                            '-------------------------------

                            .CC = vaCopyTo
                            '.Bcc = vaBlindCopyTo
                            '-------------------------------
                            .Subject = stSubject
                            '---------------------------- ---
                            .Body = stMailContent
                            '-------------------------------
                            .Attachments.Add fFile
                            .Display
                            .Send
                          
                            .SaveMessageOnSend = True
                            .PostedDate = Now()
                            .Send 0, vaTo
                          End With
                          Kill fFile
                  Set OutMail = Nothing
                End If
          
            On Error GoTo 0
      
        End If
  
  
    Next
          
 With Application
        .ScreenUpdating = True
        .EnableEvents = True
End With

  MsgBox "Done!", vbInformation
End Sub
Nhìn qua thì thế này. Trong code có (tôi mới chỉ đọc tới đây thì dừng vì chắc chắn có vấn đề, không đọc tiếp nữa)
Mã:
On Error Resume Next
            Agent.Add
                If Err.Number = 0 Then
Tôi chịu không hiểu ý tưởng lớn của tác giả code khi viết Agent.Add. Tác giả muốn làm cái gì? Mà Agent không có phương thức Add nên 300% chắc chắn sẽ sảy ra lỗi. Do có On Error Resume Next nên code đi tiếp tới dòng If Err.Number = 0 Then. Nhưng do đã sảy ra lỗi nên Err.Number <> 0, do vậy điều kiện Err.Number = 0 không thỏa và cả cụm IF ... End If không được thực hiện. Tóm lại thư không được gửi.

Xử lý: xóa dòng Agent.Add rồi test tiếp xem sao.

Mà thậm chí là xóa

Agent.Add
If Err.Number = 0 Then

và cả

End If của cái If trên.
 
Nhìn qua thì thế này. Trong code có (tôi mới chỉ đọc tới đây thì dừng vì chắc chắn có vấn đề, không đọc tiếp nữa)
Mã:
On Error Resume Next
            Agent.Add
                If Err.Number = 0 Then
Tôi chịu không hiểu ý tưởng lớn của tác giả code khi viết Agent.Add. Tác giả muốn làm cái gì? Mà Agent không có phương thức Add nên 300% chắc chắn sẽ sảy ra lỗi. Do có On Error Resume Next nên code đi tiếp tới dòng If Err.Number = 0 Then. Nhưng do đã sảy ra lỗi nên Err.Number <> 0, do vậy điều kiện Err.Number = 0 không thỏa và cả cụm IF ... End If không được thực hiện. Tóm lại thư không được gửi.

Xử lý: xóa dòng Agent.Add rồi test tiếp xem sao.

Mà thậm chí là xóa

Agent.Add
If Err.Number = 0 Then

và cả

End If của cái If trên.
Cám ơn @batman1 rất nhiều.
Mình hiểu rồi, ban đầu mình khai báo Set AgencyList = CreateObject("Scripting.Dictionary") để dụng method Add nhưng sau khi đổi qua Set AgencyList = ActiveWorkbook.Worksheets("AgencyList").ListObjects("AgencyListTable") mình vẫn giữ nguyên.
Sau khi bạn nói mình rà lại và test thành công rồi.
Cám ơn rất nhiều.
p/s cho mình hỏi thêm câu hỏi phụ với, từ excel có code nào export được tạo ra file pdf mà có đặt được mật khẩu của file pdf đó ko ? mình tìm cách export này mà ko ra ?
Nếu bạn biết phương pháp hướng dẫn giúp mình với
 
Lần chỉnh sửa cuối:
p/s cho mình hỏi thêm câu hỏi phụ với, từ excel có code nào export được tạo ra file pdf mà có đặt được mật khẩu của file pdf đó ko ? mình tìm cách export này mà ko ra ?
Nếu dùng Excel xuất ra PDF mà lại có mật khẩu thì tôi không biết.
 
Web KT
Back
Top Bottom