Используйте VBA для запуска Access Query для адресов электронной почты, которые будут использоваться в качестве получателей электронной почты для созданной электронной почты. - PullRequest
1 голос
/ 12 апреля 2019

Я выполняю запрос EmailList, который извлекает адреса электронной почты людей, отображаемых в форме доступа.Сам запрос выполняется нормально, заполняя поле Email предполагаемыми получателями.Я хотел бы использовать VBA для копирования сообщений электронной почты, отображаемых в этом запросе, на новое письмо, в котором они указаны в качестве получателей.Мне нужно, чтобы письмо было html, так как я прикрепляю гиперссылку в теле письма.

Set OutApp = CreateObject("outlook.application")
OutApp.Session.Logon
Set OutMail = OutApp.createitem(0)

Dim rs As DAO.Recordset
Dim qry As DAO.QueryDefs
Dim CurrentDb As DAO.Database
Dim OlApp As Object
Dim OlMail As Object
Dim ToRecipient As String

  Set OlApp = CreateObject("Outlook.Application")
  Set OlMail = OlApp.createitem(olmailitem)
  Set rs = CurrentDb.OpenRecordset("SELECT Email FROM [EmailList]")

  Do While rs.EOF = False
    ToRecipient = rs!Email
    OlMail.Recipients.Add ToRecipient
    rs.MoveNext
  Loop

With OutMail
    .Subject = "MOC"
    .HTMLbody = "<a href=""X:\MOC Training.accdb"">Click Here for Training</a><br>"
    .Display
End With
Set OutMail = Nothing
Set OutApp = Nothing

При игре с этим я получаю только пробелы как мой получатель, либо он ошибается в моем "Set rs "позиция.Я довольно новичок в VBA, поэтому не понимаю ошибки.

См. Код SQL ниже:

SELECT Employees.Email
FROM Employees LEFT JOIN Names2 ON Employees.Employee = Names2.[Names Trainee]
WHERE (((Names2.MOC)=[Forms]![Input MOC]![cboMOC#]));

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Несколько переменных для однотипных объектов внешнего вида с непоследовательным использованием переменных.Не используйте CurrentDb как объявленную переменную - это уже внутренняя константа.Не нужна переменная ToRecipient.

Этот код работает для меня.

Dim rs As DAO.Recordset
Dim OlApp As Object
Dim OlMail As Object

Set OlApp = CreateObject("Outlook.Application")
Set OlMail = OlApp.CreateItem(0)
Set rs = CurrentDb.OpenRecordset("SELECT Email FROM [EmailList]")

With OlMail    
    Do While rs.EOF = False
        .Recipients.Add rs!Email
        rs.MoveNext
    Loop
    .Subject = "MOC"
    .HTMLbody = "<a href=""X:\MOC Training.accdb"">Click Here for Training</a><br>"
    .Display
End With
Set OlMail = Nothing
Set OlApp = Nothing
0 голосов
/ 15 апреля 2019

Ваша непосредственная проблема с OpenRecordset, на самом деле не имеет ничего общего с Outlook. Итак, давайте пока проигнорируем биты Outlook и сосредоточимся на проблеме OpenRecordset.

Ошибка возникает из-за того, что OpenRecordset не может получить значение из поля со списком:

WHERE (((Names2.MOC)=[Forms]![Input MOC]![cboMOC#]))

Вместо этого он рассматривает [Forms]![Input MOC]![cboMOC#] как параметр, для которого вы не указали значение. Поэтому укажите это значение перед вызовом OpenRecordset.

Вставьте этот код в новую процедуру и запустите ее. Вы можете просмотреть вывод Debug.Print в окне Immediate; Ctrl + g приведет вас туда.

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim qdf As DAO.QueryDef
Dim strSelect As String
strSelect = "SELECT e.Email FROM Employees As e " & _
    "INNER JOIN Names2 As n ON e.Employee = n.[Names Trainee] " & _
    "WHERE n.MOC=[Forms]![Input MOC]![cboMOC#];"
Debug.Print "strSelect: " & strSelect
Debug.Print "combo box: " & [Forms]![Input MOC]![cboMOC#].Value

Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strSelect)
qdf.Parameters(0).Value = [Forms]![Input MOC]![cboMOC#].Value
Set rs = qdf.OpenRecordset
Do While Not rs.EOF
    Debug.Print rs!Email
    rs.MoveNext
Loop

Если набор записей открывается и печатает правильные данные в окне «Немедленно», исправьте исходный код, чтобы обрабатывать набор записей таким же образом. Если этот код не работает, покажите нам значения для strSelect и поле со списком, полное сообщение об ошибке и какая строка этого кода вызывает эту ошибку.

...