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

  • Pay Roll - send OUTLOOK_temp.xls
    68 KB · Đọc: 344
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

  • Pay Roll - send OUTLOOK_temp.xls
    64.5 KB · Đọc: 227
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

  • Book1.rar
    38.2 KB · Đọc: 26
Upvote 0
Web KT
Back
Top Bottom