Gửi mail tự động từ excel - từng dòng một (1 người xem)

Liên hệ QC

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

BichHanh1987

Thành viên mới
Tham gia
22/9/11
Bài viết
3
Được thích
0
Em có một file excel thông báo lương tháng như file đính kèm ạ.
Hàng tháng em đều phải gửi mail thông báo chi tiết riêng đến cho từng cá nhân, và em làm theo cách: giữ lại dòng thông tin của cá nhân A, hide của những người khác, xuất file dạng PDF và gửi mail cho A. Làm như vậy rất tốn thời gian.
Anh chị có cách nào giúp em có thể send mail tự động: từng dòng thông tin một tới từng địa chỉ mail cá nhân một không ạ.
Em cảm ơn ạ
 

File đính kèm

Lần chỉnh sửa cuối:
Hy vọng bạn là người làm được VBA. Xin gửi 1 file mà anh em diễn đàn đã trao đổi về cho bạn mày mò và tự làm.
 

File đính kèm

Upvote 0
Chào bác Trojan, nình thấy file của bác hay quá , mình có dử dụng thử nhưng sao nó không gửi được, nó hiện lên của sổ gửi mail của MS word không hà.
Mình dang sử dụng win 7, trình Windows Live Mail

Nhờ giúp mình với, mình cũng đang rất cần file này

Cám ơn bác nhiều

Rất mong sự hồi âm của Bác, và nếu được vui lòng gửi qua địa chỉ email: namnhoai@yahoo.com
Xin cám ơn
 
Upvote 0
pro trojan ơi .. nếu mình muốn cho cái này tự động gửi mail nếu điều kiện chuyển thành yes thì phải làm sao pro..
 
Upvote 0
Nếu bạn có sử dụng MS Outlook check mail thì mail mình . Mình mày mò mấy tháng cuối cùng cũng hoàn thiện được chương trình gởi mail bảng chi tiết lương cho hơn 500 nhân viên mổi file CTL có password do từng nhân viên đặt . Vì file dung lượng lớn quá mình post hoài không được các anh chị thông cảm. khongventoan@gmail.com
 
Upvote 0
Mình gửi mọi người file này, mình tải về từ GPE, nhờ mọi người sửa giúp để vẫn gửi được email cho từng người với đủ dữ liệu của 16 cột hoặc nhiều hơn
Hiện tại thì file gốc của tác giả chỉ hiển thị được 10 cột khi gửi email thôi
Thanks!
 

File đính kèm

Upvote 0
Mình gửi mọi người file này, mình tải về từ GPE, nhờ mọi người sửa giúp để vẫn gửi được email cho từng người với đủ dữ liệu của 16 cột hoặc nhiều hơn
Hiện tại thì file gốc của tác giả chỉ hiển thị được 10 cột khi gửi email thôi
Thanks!

Trong Sub Send_Row_Or_Rows_1() bạn có dòng:

Mã:
Set FilterRange = Ash.Range("A1:[B][COLOR=#ff0000]J[/COLOR][/B]" & Ash.Rows.Count)

tức chỉ lấy tới cột J. Bạn muốn lấy tới cột Q thì sửa thành:

Mã:
Set FilterRange = Ash.Range("A1:[B][COLOR=#ff0000]Q[/COLOR][/B]" & Ash.Rows.Count)
----------
Trong code của bạn tôi thấy có code:
Mã:
Function RangeToHTML(rng As Range)
' Changed by Ron de Bruin 28-Oct-2006
' Working in Office 2000-2010
    Dim fso As Object
    Dim ts As Object
    Dim TempFile As String
    Dim TempWB As Workbook

    TempFile = Environ$("temp") & "/" & format(Now, "dd-mm-yy h-mm-ss") & ".htm"

    'Copy the range and create a new workbook to past the data in
    rng.Copy
    Set TempWB = Workbooks.Add(1)
    With TempWB.Sheets(1)
        .Cells(1).PasteSpecial Paste:=8
        .Cells(1).PasteSpecial xlPasteValues, , False, False
        .Cells(1).PasteSpecial xlPasteFormats, , False, False
        .Cells(1).Select
        Application.CutCopyMode = False
        On Error Resume Next
'        .DrawingObjects.Visible = True
'        .DrawingObjects.Delete
        On Error GoTo 0
    End With

    'Publish the sheet to a htm file
    With TempWB.PublishObjects.Add( _
         SourceType:=xlSourceRange, _
         Filename:=TempFile, _
         Sheet:=TempWB.Sheets(1).Name, _
         Source:=TempWB.Sheets(1).UsedRange.Address, _
         HtmlType:=xlHtmlStatic)
        .Publish (True)
    End With

    'Read all data from the htm file into RangetoHTML
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
    RangeToHTML = ts.ReadAll
    ts.Close
    RangeToHTML = Replace(RangeToHTML, "align=center x:publishsource=", _
                          "align=left x:publishsource=")

    'Close TempWB
    TempWB.Close savechanges:=False

    'Delete the htm file we used in this function
    Kill TempFile
    Set ts = Nothing
    Set fso = Nothing
    Set TempWB = Nothing
End Function

Tôi thấy có: tạo tập tin HTM, tạo workbook tạm thời, sau khi dùng thì xóa HTM.

Tôi thử viết code lấy dữ liệu ngay trong Clipboard không tạo gì cả. Bạn test hộ nhé. Bạn chỉ cần chú thích hàm RangeToHTML hiện có rồi dán code hàm RangeToHTML của tôi vào

Mã:
Private Const CP_UTF8 = 65001

Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function EnumClipboardFormats Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function GetClipboardFormatName Lib "user32" Alias "GetClipboardFormatNameA" (ByVal wFormat As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long

Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As Long) As Long

Public Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, _
    lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpWideCharStr As String, _
    ByVal cchWideChar As Long) As Long
    
Function RangeToHTML(rng As Range) As String
Dim text As String, format As Long, m() As Byte, hData As Long, pData As Long, size As Long, index As Long, start As Long, formatname As String
Dim strSize As Long
On Error Resume Next
'    copy range vao Clipboard
    rng.Copy

    If OpenClipboard(0) = 0 Then Exit Function
    format = EnumClipboardFormats(0)
    Do While format > 0
        formatname = String(64, Chr(0))
        size = GetClipboardFormatName(format, formatname, 64)
        formatname = Left(formatname, size)

        If formatname = "HTML Format" Then
'            trong ClipBoard có Format - HTML Format, vậy ta đọc Handle của Data
            hData = GetClipboardData(format)
'            If hData = 0 Then MsgBox GetLastError
'            muốn đọc Data thì trước hết phải có "địa chỉ" của Data trong RAM - đọc ra bằng hàm GlobalLock
            pData = GlobalLock(hData)
'            độ lớn của Data đọc ra bằng hàm GlobalSize
            size = GlobalSize(hData)
            
'            đọc Data
            strSize = MultiByteToWideChar(CP_UTF8, 0, ByVal pData, size, vbNullString, 0)
            text = String(2 * strSize, Chr(0))
            MultiByteToWideChar CP_UTF8, 0, ByVal pData, size, text, strSize
            
'            cuối cùng là UnLock
            GlobalUnlock hData
'            lọc nội dung HTML
            text = StrConv(text, vbFromUnicode)
            text = WideStrToWebStringUTF(text)
            
            index = InStr(1, text, ":", vbTextCompare)
            index = InStr(index + 1, text, ":", vbTextCompare)
'            vị trí mà từ đó bắt đầu nội dung HTML
            start = CLng(Mid(text, index + 1, InStr(index, text, vbCr) - index)) + 1
'            lấy nội dung HTML
            RangeToHTML = Mid(text, start)
            
            Exit Do
        End If
        format = EnumClipboardFormats(format)
    Loop
    CloseClipboard

    Application.CutCopyMode = False
End Function

Function WideStrToWebStringUTF(ByVal text As String) As String
Dim slowo As Integer, index As Long, c As String, s As String
    If Len(text) Then
        For index = 1 To Len(text)
            c = Mid(text, index, 1)
            If AscW(c) < &H80 Then
                s = s & c
            Else
                s = s & "&#" & AscW(c) & ";"
            End If
        Next index
    End If
    WideStrToWebStringUTF = s
End Function
 
Upvote 0
Mình gửi mọi người file này, mình tải về từ GPE, nhờ mọi người sửa giúp để vẫn gửi được email cho từng người với đủ dữ liệu của 16 cột hoặc nhiều hơn
Hiện tại thì file gốc của tác giả chỉ hiển thị được 10 cột khi gửi email thôi
Thanks!

Em xem file đính kèm nhé.
 

File đính kèm

Upvote 0
Cảm ơn quick87 và siwtom nhiều nhé.
Cho mình hỏi có cách nào để mình có thể gửi email mà dữ liệu các cột đều được hiển thị hết không ?(Ko giới hạn số cột hiển thị)
VD file của quick87, nếu xóa bớt 1 số cột thì vẫn hiển thị được số cột mình muốn, nhưng nếu insert thêm cột thì lại phải sửa lại code..
-----
Trong thời gian chờ đợi, mình thử sửa lại code từ A1:IV thì hiển thị được hết số cột cần mong muốn rồi !
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom