2012-04-28 29 views
9

Đây là một số thư liên quan đến việc sử dụng VBA để gửi e-mail.Theo dõi việc sử dụng VBA để gửi e-mail

Hầu hết các gợi ý sử dụng hoặc Outlook, CDO, hoặc MAPI:

Set appOL = CreateObject("Outlook.Application") 

Set msgOne = CreateObject("CDO.Message") 

Set mapi_session = New MSMAPI.MAPISession 

Nhưng dường như Outlook sẽ yêu cầu tôi thay đổi thiết lập bảo mật workgroup của chúng tôi, và CDO và MAPI sẽ yêu cầu tôi để thêm một DLL hoặc một cái gì đó.

Tôi đang cố gắng sử dụng Excel để tổ chức các bài tập nhóm tại nơi làm việc và tôi không thể sửa đổi máy tính của người khác theo bất kỳ cách nào.

Có cách nào đơn giản hơn để gửi e-mail từ macro Excel không?
Tất cả những gì tôi cần là một khối văn bản trong nội dung thư không có tệp đính kèm.

Tôi đã cày qua Google, MSDN & StackOverflow cả tuần và tôi bị mắc kẹt trên một chiếc thuyền chậm đến hư không.

Trả lời

5

Bạn có thể sử dụng lệnh Shell.

Shell("mailto:[email protected]") 

Nếu Outlook là chương trình email mặc định của bạn, tôi nghĩ các cửa sổ sẽ giải thích rằng đúng (nó có phải nó từ cửa sổ hộp thoại RUN, nhưng không chắc chắn nếu từ VBA). Hãy dùng thử. Tôi không ở phía trước của Excel vào lúc này.

Xem lại thông số cho "mailto" để xem cách bạn có thể thêm chủ đề và nội dung vào chuỗi đó.

CORRECTION: Điều đó sẽ chỉ tạo email nhưng không gửi được. Bỏ qua câu trả lời của tôi.

+0

'Bỏ qua câu trả lời của tôi.' + 1 :-) Bạn đang đi đúng hướng. –

+0

@SiddharthRout, đã được nhìn thấy rất nhiều bạn về những câu hỏi Excel gần đây Siddarth. Làm tốt lắm! – Marc

+0

Luôn luôn yêu một câu hỏi hay;) –

9

Xây dựng dựa trên những gì Marc đã đề cập, Dưới đây là đã thử và thử nghiệm phiên bản.

Option Explicit 

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _ 
ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _ 
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 

Sub SendMail() 
    Dim objMail As String 
    Dim oMailSubj, oMailTo, oMailBody As String 

    On Error GoTo Whoa 

    oMailSubj = "YOUR SUBJECT GOES HERE" 
    oMailTo = "[email protected]" 
    oMailBody = "BLAH BLAH!!!!" 
    objMail = "mailto:" & oMailTo & "?subject=" & oMailSubj & "&body=" & oMailBody 

    ShellExecute 0, vbNullString, objMail, vbNullString, vbNullString, vbNormalFocus 

    Application.Wait (Now + TimeValue("0:00:03")) 
    Application.SendKeys "%s" 

    Exit Sub 
Whoa: 
    MsgBox Err.Description 
End Sub 

followup

Cảm ơn thông tin. Tôi đã loại trừ ShellExecute vì nó giới hạn toàn bộ chuỗi tham số đến 250 char và tôi cần khoảng 2000 cho thông báo. Nhưng có vẻ như SE là lựa chọn duy nhất sẽ thực sự hoạt động trong trường hợp của tôi. - Humanoid1000 7 giờ trước

Đây là "Horrible (Tôi thích cách JFC nói rằng !!!)" Con đường tôi đề cập dưới đây trong các ý kiến ​​mà tác phẩm đẹp mắt :) BTW Tôi có chỉ Outlook là ứng dụng khách mặc định của tôi vì vậy tôi đã thử nghiệm nó với điều đó.

Option Explicit 

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _ 
ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _ 
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

Sub SendMail() 
    Dim objMail As String 
    Dim oMailSubj As String, oMailTo As String 
    Dim i As Long 
    Dim objDoc As Object, objSel As Object, objOutlook As Object 
    Dim MyData As String, strData() As String 

    On Error GoTo Whoa 

    '~~> Open the txt file which has the body text and read it in one go 
    Open "C:\Users\Siddharth Rout\Desktop\Sample.Txt" For Binary As #1 
    MyData = Space$(LOF(1)) 
    Get #1, , MyData 
    Close #1 
    strData() = Split(MyData, vbCrLf) 

    Sleep 300 

    oMailSubj = "YOUR SUBJECT GOES HERE" 
    oMailTo = "[email protected]" 
    objMail = "mailto:" & oMailTo & "?subject=" & oMailSubj 

    ShellExecute 0, vbNullString, objMail, vbNullString, vbNullString, vbNormalFocus 

    Sleep 300 

    Set objOutlook = GetObject(, "Outlook.Application") 
    '~~> Get a Word.Selection from the open Outlook item 
    Set objDoc = objOutlook.ActiveInspector.WordEditor 
    Set objSel = objDoc.Windows(1).Selection 

    objDoc.Activate 

    Sleep 300 

    For i = LBound(strData) To UBound(strData) 
     objSel.TypeText strData(i) 
     objSel.TypeText vbNewLine 
    Next i 

    Set objDoc = Nothing 
    Set objSel = Nothing 

    '~~> Uncomment the below to actually send the email 
    'Application.Wait (Now + TimeValue("0:00:03")) 
    'Application.SendKeys "%s" 

    Exit Sub 
Whoa: 
    MsgBox Err.Description 
End Sub 

SNAPSHOT

Text File trong đó có thông điệp

enter image description here

Email ngay trước khi nó được gửi

enter image description here

+0

Nếu tôi nhớ giao thức mailto là giới hạn về chiều dài cơ thể. (không quá 512 ký tự). Đúng nếu tôi đã sai lầm. – Steve

+0

Cảm ơn thông tin. Tôi đã loại trừ ShellExecute vì nó giới hạn toàn bộ chuỗi tham số thành 250 char và Tôi cần khoảng 2000 cho thông báo. Nhưng có vẻ như SE là tùy chọn duy nhất thực sự hoạt động trong trường hợp của tôi. – Humanoid1000

+0

Siddharth, tôi tin rằng bạn có lỗi đánh máy trong mã của mình. Dòng objMail phải có chuỗi "& body =". (lưu ý dấu và) – Humanoid1000

0

Dưới đây là kết quả cuối cùng:

Hóa ra, các SendMail() làm việc tại nhà nhưng không phải tại nơi làm việc, nhưng CreateObject("Outlook.Application") đã làm việc tại nơi làm việc.

Cài đặt bảo mật của tôi không phải là vấn đề với Outlook, đó là một lỗi chính tả.

Dù bằng cách nào, có rất nhiều thông tin tốt trên trang này cho bất kỳ ai khác bị mất về chủ đề này.

Các vấn đề liên quan