首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要vba中循环功能的帮助才能发送多封电子邮件

需要vba中循环功能的帮助才能发送多封电子邮件
EN

Stack Overflow用户
提问于 2017-11-01 15:02:57
回答 2查看 1.5K关注 0票数 1

我有一个Excel VBA (Send_Mail)通过Lotus Notes发送电子邮件。它工作得很好,但我需要帮助发送个人电子邮件给多个人在一次去。

在我的excel表格中。单元格A7向下将是可以向上到达单元格行的电子邮件地址,B7具有主题行,单元格C7具有电子邮件正文。(所有这些都是用不同的宏自动填充的)。但是,我的代码(Send_Mail)只是向单元格A7中的地址发送了一封电子邮件。我需要你的帮助,在发送邮件到所有的电子邮件地址,在科尔A7与其各自的主题(B列)和邮件正文(C列)

下面是我的代码。

代码语言:javascript
运行
复制
Public TOID As String
Public CCID As String
Public SECT As String
Public ACCO As String
Public SUBJ As String

Sub Send_Mail()

Dim answer As Integer

answer = MsgBox("DO YOU HAVE LOTUS NOTES OPEN ??  Not WebLotus notes", vbYesNo + vbQuestion, "LOTUS NOTES")

If answer = vbNo Then
    MsgBox "Please Open Notes and Try the Macro Again"
    Exit Sub

Else

End If

Application.DisplayAlerts = False

Call Send

MsgBox "Mail Sent to " & (Range("L2").Value) & " " & "Recipents"

Application.DisplayAlerts = True

End Sub

Public Function Send()

    SendEMail = True

    Sheets("Main").Select

    TOID = Range("A7").Value
    CCID = ""
    SUBJ = Range("B7").Value
    'On Error GoTo ErrorMsg

    Dim EmailList As Variant
    Dim ws, uidoc, Session, db, uidb, NotesAttach, NotesDoc, objShell As Object
    Dim RichTextBody, RichTextAttachment As Object
    Dim server, mailfile, user, usersig As String
    Dim SubjectTxt, MsgTxt As String

    Set Session = CreateObject("Notes.NotesSession")
    user = Session.UserName
    usersig = Session.COMMONUSERNAME
    mailfile = Session.GETENVIRONMENTSTRING("MailFile", True)
    server = Session.GETENVIRONMENTSTRING("MailServer", True)

    Set db = Session.GETDATABASE(server, mailfile)

    If Not db.IsOpen Then
        Call db.Open("", "")
        Exit Function
    End If

    Set NotesDoc = db.CREATEDOCUMENT

    With NotesDoc
        .Form = "Memo"
        .Subject = SUBJ                          'The subject line in the email
        .Principal = user
        .sendto = TOID                           'e-mail ID variable to identify whom email need to be sent
        .CopyTo = CCID
    End With

    Set RichTextBody = NotesDoc.CREATERICHTEXTITEM("Body")

    With NotesDoc
        .COMPUTEWITHFORM False, False
    End With

    '==Now set the front end stuff
    Set ws = CreateObject("Notes.NotesUIWorkspace")

    If Not ws Is Nothing Then

        Set uidoc = ws.EDITDOCUMENT(True, NotesDoc)

        If Not uidoc Is Nothing Then

            If uidoc.EDITMODE Then

                'Mail Body
                Sheets("Main").Select
                Range("C7").Select
                Dim rnBody1 As Range
                Set rnBody1 = Selection
                rnBody1.CopyPicture

                'rnBody1.Copy
                Call uidoc.GOTOFIELD("Body")
                Call uidoc.Paste
            End If

        End If

    End If

    Call uidoc.Send
    Call uidoc.Close

    'close connection to free memory
    Set Session = Nothing
    Set db = Nothing
    Set NotesAttach = Nothing
    Set NotesDoc = Nothing
    Set uidoc = Nothing
    Set ws = Nothing

    Sheets("Main").Select

End Function
EN

回答 2

Stack Overflow用户

发布于 2017-11-01 16:12:04

我担心太多新的细节会让你感到困惑,我必须承认我没有测试过下面的代码,所以请不要假设这会彻底解决你的问题。

下面让你了解如何按照你的要求使用循环。另请参阅示例here,它涵盖了可能需要批量发送的实例(诚然,链接适用于Outlook),也是使用循环的示例。

我已经在代码中包含了一些解释。在没有更多信息的情况下,很难恰当地调整这一点,但我希望它能有所帮助。

代码语言:javascript
运行
复制
Option Explicit

Public TOID As String
Public CCID As String
Public SECT As String
Public ACCO As String
Public SUBJ As String

Public Sub Send_Mail()

Dim wb As Workbook
Dim ws1 As Worksheet

Set wb = ThisWorkbook  'These are assumptions
Set ws1 = wb.Worksheets("Sheet1") 'These are assumptions. You would change as necessary

Dim answer As Long 'Integer types changed to Long

answer = MsgBox("DO YOU HAVE LOTUS NOTES OPEN ??  Not WebLotus notes", vbYesNo + vbQuestion, "LOTUS NOTES")

If answer = vbNo Then
    MsgBox "Please Open Notes and Try the Macro Again"
    Exit Sub

'Else 'Not being used so consider removing

End If

Application.DisplayAlerts = False

Dim lRow As Long
Dim loopRange As Range
Dim currentRow As Long
Dim TOIDvar As String
Dim SUBJvar As String

With ws1

    lRow = .Range("A7").End(xlDown).Row 'Assume no gaps in column A in the TOID range
    Set loopRange = .Range("A7:A" & lRow)

    For currentRow = 1 To loopRange.Rows.Count 'Loop range assigning values to arguments and call send sub with args

       TOIDvar = loopRange.Cells(currentRow, 1)

       SUBJvar = loopRange.Cells(currentRow, 1).Offset(0, 1) ' get column B in same row using Offset

       Send TOIDvar, SUBJvar

    Next currentRow


End With


'Commented out MsgBox at present as unsure what you will do when sending multiple e-mails
'MsgBox "Mail Sent to " & (ws1.Range("L2").Value) & " " & "Recipents" 'use explicit fully qualified Range references

Application.DisplayAlerts = True

End Sub

Public Sub Send(ByVal TOIDvar As String, ByVal SUBJvar As String) 'changed to sub using arguments

    Dim SendEMail As Boolean 'declare with type
    Dim wb As Workbook
    Dim ws2 As Worksheet

    Set wb = ThisWorkbook  'These are assumptions. Ensuring you are working with correct workbook
    Set ws2 = wb.Worksheets("Main")

    SendEMail = True
    TOID = TOIDvar
    CCID = vbNullString 'use VBNullString rather than empty string literals
    SUBJ = SUBJvar
    'On Error GoTo ErrorMsg

    Dim EmailList As Variant 'declaration of separate lines and with their types
    Dim ws As Object
    Dim uidoc As Object
    Dim Session As Object
    Dim db As Object
    Dim uidb As Object
    Dim NotesAttach As Object
    Dim NotesDoc As Object
    Dim objShell As Object
    Dim RichTextBody As Object
    Dim RichTextAttachment As Object
    Dim server As String
    Dim mailfile As String
    Dim user As String
    Dim usersig As String
    Dim SubjectTxt As String
    Dim MsgTxt As String

    Set Session = CreateObject("Notes.NotesSession")
    user = Session.UserName
    usersig = Session.COMMONUSERNAME
    mailfile = Session.GETENVIRONMENTSTRING("MailFile", True)
    server = Session.GETENVIRONMENTSTRING("MailServer", True)

    Set db = Session.GETDATABASE(server, mailfile)

    If Not db.IsOpen Then
        db.Open vbNullString, vbNullString
        Exit Sub
    End If

    Set NotesDoc = db.CREATEDOCUMENT

    With NotesDoc
        .Form = "Memo"
        .Subject = SUBJ                          'The subject line in the email
        .Principal = user
        .sendto = TOID                           'e-mail ID variable to identify whom email need to be sent
        .CopyTo = CCID
    End With

    Set RichTextBody = NotesDoc.CREATERICHTEXTITEM("Body")

    With NotesDoc
        .COMPUTEWITHFORM False, False
    End With

    '==Now set the front end stuff
    Set ws = CreateObject("Notes.NotesUIWorkspace")

    If Not ws Is Nothing Then

        Set uidoc = ws.EDITDOCUMENT(True, NotesDoc)

        If Not uidoc Is Nothing Then

            If uidoc.EDITMODE Then

                'Mail Body
                With ws2.Range("C7")
                    Dim rnBody1 As Range
                    Set rnBody1 = .Value2
                    rnBody1.CopyPicture

                'rnBody1.Copy
                    uidoc.GOTOFIELD "Body"
                    uidoc.Paste
                End With

            End If

        End If

    End If

    uidoc.Send
    uidoc.Close

    'removed garbage collection

    ws2.Activate ' swopped out .Select and used Worksheets collection held in variable ws2

End Sub
票数 1
EN

Stack Overflow用户

发布于 2017-11-02 11:58:58

您可能需要考虑这一点。

代码语言:javascript
运行
复制
In column A : Names of the people
In column B : E-mail addresses
In column C:Z : Filenames like this C:\Data\Book2.xls (don't have to be Excel files)

宏将遍历"Sheet1“中的每一行,如果B列中有电子邮件地址,C:Z列中有文件名,它将使用此信息创建一封邮件并发送该邮件。

代码语言:javascript
运行
复制
Sub Send_Files()
'Working in Excel 2000-2016
'For Tips see: http://www.rondebruin.nl/win/winmail/Outlook/tips.htm
    Dim OutApp As Object
    Dim OutMail As Object
    Dim sh As Worksheet
    Dim cell As Range
    Dim FileCell As Range
    Dim rng As Range

    With Application
        .EnableEvents = False
        .ScreenUpdating = False
    End With

    Set sh = Sheets("Sheet1")

    Set OutApp = CreateObject("Outlook.Application")

    For Each cell In sh.Columns("B").Cells.SpecialCells(xlCellTypeConstants)

        'Enter the path/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 = "Testfile"
                .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  'Or use .Display
            End With

            Set OutMail = Nothing
        End If
    Next cell

    Set OutApp = Nothing
    With Application
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub

有关所有详细信息,请参阅此链接。

https://www.rondebruin.nl/win/s1/outlook/amail6.htm

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47049787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档