Excel-将占位符与VBA中的有效值匹配

Excel-将占位符与VBA中的有效值匹配,vba,excel,email,Vba,Excel,Email,我想做一个可编辑的电子邮件模板,每个人都可以更新电子邮件,并分配给哪个用户,他们想发送哪封电子邮件。电子邮件模板来自另一个工作表。每个模板都有自己的电子邮件ID。 我想将模板与包含所有所需信息的表相匹配。因此,每当用户输入电子邮件ID时,它都会在电子邮件模板中用占位符映射该值 到目前为止,我一直在使用电子邮件模板。但现在它只是从单元格中获取所有值。每当我添加列或行时,它都是可断开的 Sub Mail_with_outlook2() Dim mainWB As Workbook

我想做一个可编辑的电子邮件模板,每个人都可以更新电子邮件,并分配给哪个用户,他们想发送哪封电子邮件。电子邮件模板来自另一个工作表。每个模板都有自己的电子邮件ID。

我想将模板与包含所有所需信息的表相匹配。因此,每当用户输入电子邮件ID时,它都会在电子邮件模板中用占位符映射该值

到目前为止,我一直在使用电子邮件模板。但现在它只是从单元格中获取所有值。每当我添加列或行时,它都是可断开的

   Sub Mail_with_outlook2()

   Dim mainWB As Workbook
   Dim otlApp As Object
   Dim olMail As Object
   Dim olMailItem As Object
   Dim Doc As Object
   Dim SendID
   Dim CCID
   Dim Subject
   Dim Body
   Dim WrdRng As Object
   Dim result
   Dim i As Long



   Set otlApp = CreateObject("Outlook.Application")
   Set olMail = otlApp.CreateItem(0)
   Set mainWB = ActiveWorkbook

   SendID = mainWB.Sheets("Email Template").Range("C3").Value
   CCID = mainWB.Sheets("Email Template").Range("D3").Value
   Subject = mainWB.Sheets("Email Template").Range("E3").Value
   Body = mainWB.Sheets("Email Template").Range("F3").Value


   Dim splitBody
   splitBody = Split(Body, "<%")

   For i = 0 To UBound(splitBody)

    result = Replace(Body, ">", "K")

   Next i


   With olMail
   .to = SendID
   If CCID <> "" Then
    .CC = CCID
   End If
  .Subject = Subject
  .Display
   End With
   Set Doc = olMail.GetInspector.WordEditor
   Set WrdRng = Doc.Range(Start:=0, End:=0)
   WrdRng.Select
   mainWB.Sheets("Email Template").Range("F3").Copy
   WrdRng.Paste

    MsgBox ("you Mail has been sent to " & SendID)
   End Sub
Sub-Mail_与_-outlook2()
将主WB设置为工作簿
作为对象的Dim otlApp
将邮件作为对象
将邮件项设置为对象
Dim Doc作为对象
暗森迪
暗淡的CCID
模糊主题
暗体
作为对象的Dim WrdRng
模糊结果
我想我会坚持多久
设置otlApp=CreateObject(“Outlook.Application”)
设置olMail=otlApp.CreateItem(0)
设置mainWB=ActiveWorkbook
SendID=mainWB.Sheets(“电子邮件模板”).Range(“C3”).Value
CCID=mainWB.Sheets(“电子邮件模板”).范围(“D3”).值
主题=主工作表(“电子邮件模板”)。范围(“E3”)。值
Body=mainWB.Sheets(“电子邮件模板”).范围(“F3”).值
暗分裂体
拆分体=拆分(体,“,”K”)
接下来我
与奥尔梅尔
.to=SendID
如果CCID为“”,则
.CC=CCID
如果结束
.主语
.展示
以
Set Doc=olMail.GetInspector.WordEditor
设置WrdRng=Doc.Range(开始=0,结束=0)
WrdRng.选择
主工作表(“电子邮件模板”)。范围(“F3”)。副本
干糊
MsgBox(“您的邮件已发送到”&SendID)
端接头
表格+匹配功能 考虑将模板工作表数据转换为Excel表格。然后可以使用“表对象”aka
ListObject
以名称(列标题)引用其列

要查找表中ID的相对位置,可以使用
WorksheetFunction.Match

用示例编写代码 在我的代码中,邮件模板参数所在的工作表称为“IssueTemplates”。
该表称为“IssueTemplatesTable”


因此,您希望使模板工作表更灵活,以便可以添加列,并且VBA仍将获得正确的值?我不清楚你的问题是什么。是的,我想通过定义占位符和在其他工作表中分配电子邮件ID来编辑电子邮件模板。它将用行中的有效值替换该值
Sub GetDataFromTable()
    Dim IssueTemplatesTable As ListObject
    Dim ID_Searched As Integer 'Input variable
    Dim ID_RelativeRow As Integer 'Input relative row inside the table
    Dim Var1 As String 'Output variable

    Set IssueTemplatesTable = ThisWorkbook.Sheets("IssueTemplates").ListObjects("IssueTemplatesTable")

    '''''''''''''''''EXAMPLE 1'''''''''''''''''''''''''
    ID_Searched = 17 'Input: "No" of template
    With IssueTemplatesTable
        ID_RelativeRow = WorksheetFunction.Match(ID_Searched, .ListColumns("No").DataBodyRange, 0)
        Var1 = .DataBodyRange(ID_RelativeRow, .ListColumns("Issue Type").Index)
    End With 'IssueTemplatesTable

    MsgBox Var1 'Output: "Others"

    '''''''''''''''''EXAMPLE 2'''''''''''''''''''''''''
    ID_Searched = 25 'Input: "No" of template
    With IssueTemplatesTable
        ID_RelativeRow = WorksheetFunction.Match(ID_Searched, .ListColumns("No").DataBodyRange, 0)
        Var1 = .DataBodyRange(ID_RelativeRow, .ListColumns("Issue Type").Index)
    End With 'IssueTemplatesTable

    MsgBox Var1 'Output: "Mapping"
End Sub