gpt4 book ai didi

vba - 使用 VBA 中的表格生成完全格式化的电子邮件

转载 作者:行者123 更新时间:2023-12-02 11:40:48 24 4
gpt4 key购买 nike

我有几条信息需要处理。

  • 一个带有自动消息和 3 个“插入点”的 Outlook 电子邮件模板,我需要一个格式简洁的表格,其中包含指向我的超链接注入(inject)并发送到已保存的分发列表。
  • 一个包含 3 张工作表的 Master Excel 电子表格,它会自动更新表格中需要的所有信息(但不包含超链接)。
  • 3 个经过筛选的 Sharepoint 列表,其中包含表中所需的所有信息,并且包含所需的超链接。

  • 我需要一种或另一种方法来制作一种简单的(比打开文件以及复制和粘贴更容易)的方法,自动生成包含上述所有信息的格式化电子邮件。我是一名实习生,所以这是对我能力的测试,而不是个人时间节省,所以偏离要求并不是一个真正的选择。到目前为止,我的老板正在打开电子邮件模板,然后一一打开 Sharepoint 列表,单击并拖动选择,然后分别复制和粘贴每个列表。所以让我从我尝试过的方法开始,然后继续我遇到的问题。

    所以我的第一次尝试是在源 Excel 文件中工作并生成一封电子邮件,因为我之前已经通过一些更简单的自动化完成了这项工作。
    Sub GenerateEmail()
    Const template As String = "--The path to the email template goes here--It works but I removed it for this post"
    MakeEmail (template)
    End Sub

    Sub MakeEmail(templatePath As String)

    'Not currently working but I'm not as concerned for it at the moment
    'I havent been able to make it as far as this yet
    'Dim today As String
    'today = Format(Now(), "MM/DD/YYYY")
    'Dim later As String
    'later = Format(DateAdd("D", 28, Now()), "MM/DD/YYYY")

    '---Initialize Constants for future use---
    Dim OutlookApp As Variant
    Dim Email As Variant

    Dim requSheet As Worksheet
    Dim xferSheet As Worksheet
    Dim AttrSheet As Worksheet
    '-----------------------------------------

    '---Set Constants for future use---
    Set OutlookApp = CreateObject("Outlook.Application")
    Set Email = OutlookApp.CreateItemFromTemplate(templatePath)

    Set requSheet = Worksheets("owssvr ReqList")
    Set requSheet = Worksheets("owssvr Transfer")
    Set requSheet = Worksheets("owssvr Attrit")
    '----------------------------------

    'create an editable copy of email body
    Dim editedBody As String
    editedBody = Email.HTMLBody

    'copies requisitions
    requSheet.Activate
    Dim currentRequisitions As Range
    Columns("C").EntireColumn.Hidden = True
    Columns("G:H").EntireColumn.Hidden = True
    Dim lner As Long
    lner = LastNonEmptyRow(Range("A:A"))
    Set currentRequisitions = Range(Cells(2, 1), Cells(lner, 13))
    currentRequisitions.Copy

    'Converts clipboard contents to String
    Dim DataObj As MSForms.DataObject
    Set DataObj = New MSForms.DataObject
    DataObj.GetFromClipboard
    Dim copy1str As String
    copy1str = DataObj.GetText(1)

    'Make edites to editable copy
    editedBody = Replace(editedBody, "54321RequisitionsFlag_DoNotRemove", copy1str) 'Requisitions
    editedBody = Replace(editedBody, "54321TransfersFlag_DoNotRemove", "Place Holder2") 'Transfers
    editedBody = Replace(editedBody, "54321AttritionsFlag_DoNotRemove", "Place Holder3") 'Attritions

    'Replace email body with newly edited body
    Email.HTMLBody = editedBody

    Email.Display
    End Sub

    Function LastNonEmptyRow(r As Range) As Long
    LastNonEmptyRow = r.Cells.Count - WorksheetFunction.CountBlank(r)
    End Function

    我在使用这种方法时遇到的问题显然是当我将 DataObject 转换为字符串时,我会丢失表格的所有格式。 (它被放置为一长串由空格分隔的excel值)有在线资源,如 http://tableizer.journalistopia.com/我将使用它来将文本转换为 HTML 表格(如果是我的话) 但是再次......我是一名实习生,任务是自动化它,所以这就是我必须做的。所以我需要以某种方式让它保持表格格式。

    我查看了其他人将文本转换为 HTML 的代码,它确实存在,但它有数千行代码,我认为我的老板不希望我为这种评估类型的项目上交其他人的代码。 (我使用只接受字符串的 Replace 方法的原因是因为我找不到在 MailItem.Body 的中间部分插入文本的其他方法)我将 3 个“标志”放入我想要插入的电子邮件模板中成为。 (占位符被放置在正确的位置,所以我有那个适合我..)

    我还看到使用此方法使某些列表项成为超链接时遇到问题。该列表是动态的,因此我无法对链接进行硬编码,但我想当我找到它时我会越过那座桥。 (该 URL 包含在不同列的 excel 表中)

    我的第二种方法是在启动时在 Outlook VBA 中编写代码,并从中提取数据更好的来源(Excel 或 Sharepoint)
    Public Sub Application_Startup()

    'This isn't working but I'm not concerned with it at the moment
    'Dim today As String
    'today = Format(Now(), "MM/DD/YYYY")
    'Dim later As String
    'later = "11/11/2015"

    '---initialize Excel Objects---
    Const sourcePath As String = "This is a path to the excel sheet--it works but I removed it for this post"
    Dim xlWB As Excel.Workbook
    Dim xlRequisition As Excel.Worksheet
    Dim xlTransfers As Excel.Worksheet
    Dim xlAttritions As Excel.Worksheet
    'Set Excel Objects
    Excel.Workbooks.Open (sourcePath)
    Set xlWB = Excel.ActiveWorkbook
    Set xlRequisitions = xlWB.Worksheets("owssvr ReqList")
    Set xlTransfers = xlWB.Worksheets("owssvr Transfer")
    Set xlAttritions = xlWB.Worksheets("owssvr Attrit")
    '----------------------------------
    xlRequisitions.Activate
    Dim lner As Long
    lner = LastNonEmptyRow(Range("A:A"))
    'Range("A2:N" & Trim(Str(lner))).AutoFilter Field:=3, Criteria1:=">=" & Format(today, "MM/DD/YYYY"), Operator:=xlAnd, Criteria2:="<" & Format(later, "MM/DD/YYYY")
    Range("A2:N" & Trim(Str(lner))).Copy
    End Sub

    Function LastNonEmptyRow(r As Range) As Long
    LastNonEmptyRow = r.Cells.Count - WorksheetFunction.CountBlank(r)
    End Function

    这种方法让我走得更远了..表格确实在剪贴板中保持格式,我可以简单地使用 SendKeys 方法强制击键击中 ^v.. 但是这不允许我将其放置在 3"插入点”。 (每个点之前、之后和之间都有文本)。据我所知,您无法在 VBA 中“移动光标”。无奈之下,我的想法是从一封空白电子邮件开始,并逐个打印电子邮件模板的所有格式化内容。我希望它不会到那个地步。

    我还没有尝试过的其他方法,但我对……不是很有希望。

    使用 MS Word 文档作为保存表格/电子邮件正文的中间位置。可能这将允许我将所有内容放在一个位置,并且 Word 可能有一些方法可以移动光标以将表格放置在您真正想要的位置。不过我不知道。

    另一种听起来更有希望但我不知道该怎么做的方法是找到一种方法来使用 Sharepoint 上的 URL 和 listID 号来直接移动这些数据。更接近地模仿我的老板手动操作的方式。

    最佳答案

    听起来您有 2 个问题,这两个问题都已在 SO 上得到解答,但我会尝试在这里回答,因为您是新成员。将来,我建议您在 SO 和一般调试时提出单独的问题。

  • 如何修改 Outlook 模板。

  • Send an email from Excel 2007 VBA using an Outlook Template & Set Variables

    这里的关键是电子邮件要么是纯文本要么是 HTML(或没有人使用的富文本)。为了插入格式化表格,您必须:

    A. 将表格转换为 HTML(见下文)

    B. 将模板转换为 HTML(只需打开它,更改 Format Text 选项卡下的 Format 并保存)

    C. 使用上面链接中描述的 .HTMLBody = Replace() 插入文本
  • 将 Excel 范围转换为 HTML

  • 您实际上不需要第三方应用程序来执行此操作 - 它内置在 Excel 中。见: Paste specific excel range in outlook

    关于vba - 使用 VBA 中的表格生成完全格式化的电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28881078/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com