Используйте переменные VBA внутри поля таблицы доступа - PullRequest
0 голосов
/ 16 сентября 2018

Я помещаю свое тело письма в таблицу, чтобы легко редактировать содержимое.Проблема в том, что внутри содержимого этого тела нужно использовать некоторые переменные.

Например:

Я использую приведенный ниже код для отправки электронного письма.И, как вы можете видеть, мое тело электронной почты приходит из мемо-поля внутри моей таблицы (.HTMLBody = "" & Me.Html_Email_Body & ""), и мне нужно использовать некоторые переменные внутри поля Html_Email_Body, например, так:

(это текст, которыйУ меня есть в моем поле заметки)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head></head>
<body>
Hi " & Me:PersonName & ", how are you?
</body>
</html>

Результат вывода: Hi " & Me.PersonName & ", how are you?

И результат вывода должен быть: Hi Bob, how are you?

Возможно ли это?

(это код, который я использую для отправки своих электронных писем)

Sub SendEmail_Click()
Dim NewMail As CDO.Message
Set NewMail = New CDO.Message

'Enable SSL Authentication
NewMail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True

'Make SMTP authentication Enabled=true (1)

NewMail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1

'Set the SMTP server and port Details
'To get these details you can get on Settings Page of your Gmail Account

NewMail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"

NewMail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25

NewMail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2

'Set your credentials of your Gmail Account

NewMail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusername") = "mysite@gmail.com"

NewMail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "mypassword7"

'Update the configuration fields
NewMail.Configuration.Fields.Update

'Set All Email Properties

With NewMail
Dim strPath As String
strPath = ".mysite/wp-content/uploads/2017/07/myimage.png"
.subject = "this is the subject"
.From = "<mail@mysite.com>"
.To = Me.EMAIL
'.CC = ""
'.BCC = ""
.HTMLBody = "" & Me.Html_Email_Body & ""
.AddAttachment "https://mysite/temp/contacts.vcf"
End With

NewMail.Send
MsgBox ("This email was sent!")

'Set the NewMail Variable to Nothing
Set NewMail = Nothing

End Sub

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Мне удалось найти решение самостоятельно, потому что я не смог реализовать @ Jericho Johnson , хотя это было как-то полезно ...

Что я сделал, так это установил новую переменную (MyHTMLBody) для тела письма и нескольких необходимых мне замен (см. ниже).

После этого я настроил .HTMLBody = MyHTMLBody таким образом, и теперь я могу использовать некоторые закладки в HTML, например: Hi [r_name], how are you? This is your [r_email].

  MyHTMLBody = Me.Body
  MyHTMLBody = Replace(MyHTMLBody, "[r_name]", Me.Client_Name)
  MyHTMLBody = Replace(MyHTMLBody, "[r_email]", Me.Client_Email)

  .HTMLBody = MyHTMLBody 
0 голосов
/ 16 сентября 2018

Я делаю подобные вещи во многих своих приложениях.Я вставляю полевые ссылки в свои шаблоны электронной почты и затем использую написанную мной процедуру, чтобы динамически заменять их правильными значениями во время выполнения.В моем случае это обычно делается в цикле с RecordSet, который содержит несколько человек, каждый из которых получает отдельную копию сообщения электронной почты, и я настраиваю шаблон для каждого получателя.

Вот небольшой примершаблон электронной почты:

<p>Hello [RecipFirstName],</p>  This auto-generated email has been sent to notify you that:

<h4>Approval Mailed is <b>LATE</b>.</h4>
Approval Mailed Date: [ApprovalMailed_Date]

[ProjectTemplate1]

Тогда мой код для заполнения шаблона выглядит следующим образом:

'[mBody] is a string that will be the Body of the email
'[templateBody] is a string that was previously set to the email
'  template for the message being processed
'[rstProject] is a DAO.RecordSet that was previously set to the
'  required dataset for my purposes
'Notice that I use a combination of [Replace] functions and 
'  my custom function [sitsProcessFieldReferences] to update the
'  template with the appropriate values.

'In my case, replace CRLF in the template with <BR>
mBody = Replace(templateBody, vbCrLf, "<BR>")
mBody = sitsProcessFieldReferences(mBody, rstProject)
'The following examples use variables I have already defined and
'  populated to replace the field refernces.
mBody = Replace(mBody, "[RecipFirstName]", FirstName)
mBody = Replace(mBody, "[RecipLastName]", LastName)
mBody = Replace(mBody, "[RecipFullName]", FirstName & " " & LastName)
mBody = Replace(mBody, "[ProjectTemplate1]", pTemplate1)

Наконец функция, которая выполняет замену ссылки на поле.Обратите внимание, что у меня есть особый случай, когда я называю ссылку на поле с именем «цена» в названии, я хочу, чтобы значение замены было отформатировано как Валюта.Вы можете настроить этот код для любой ситуации.Просто требуется некоторое предварительное планирование, чтобы сохранить согласованное соглашение об именах для ваших ссылок на поля.

Эта функция берет шаблон электронной почты (или любую текстовую строку) и ищет в нем имена полей, соответствующие любому полю в RecordSet (прилагается).в квадратных скобках) и заменяет эту ссылку значением из соответствующего поля в RecordSet

Public Function sitsProcessFieldReferences(ByVal orgString As String, rstFields As DAO.Recordset) As String
On Error GoTo Err_PROC
    Dim ErrMsg As String
    Dim fld As DAO.Field

    For Each fld In rstFields.Fields
        If InStr(fld.Name, "price") Then
            orgString = Replace(orgString, "[" & fld.Name & "]", Format(Nz(fld.Value, 0), "Currency"))
        Else
            orgString = Replace(orgString, "[" & fld.Name & "]", Nz(fld.Value, ""))
        End If
    Next fld
    Set fld = Nothing

Exit_PROC:
    sitsProcessFieldReferences = orgString
    Exit Function

Err_PROC:
    Select Case Err.Number
        Case Else
            ErrMsg = "Module: " & strModName & vbCrLf
            ErrMsg = ErrMsg & "Error: " & Err.Number & vbCrLf
            ErrMsg = ErrMsg & "Line: " & Erl() & vbCrLf
            ErrMsg = ErrMsg & Err.Description
            DoCmd.Hourglass False
            MsgBox ErrMsg, vbOKOnly + vbCritical, "Function sitsProcessFieldReferences"
            Resume Exit_PROC
            Resume
    End Select

End Function

В шаблоне электронной почты вы измените следующую строку:

Hi " & Me:PersonName & ", how are you?

что-то вроде:

Hi [PersonName], how are you?

Затем либо сделайте Replace(emailTemplate, [PersonName], "Bob"), если у вас уже есть замещающие значения в переменной, либо что-то в этом роде.

ИлиЕсли значение находится в RecordSet, вы должны изменить [PersonName] в шаблоне, чтобы оно совпадало с именем поля в RecordSet, которое содержит значение Bob, а затем использовать мою пользовательскую функцию: sitsProcessFieldReferences(emailTemplate, YourRecordSet)

...