VBA发送邮件时将Excel文件转换为文本outlook

VBA发送邮件时将Excel文件转换为文本outlook,vba,excel,Vba,Excel,在outlook中发送邮件时,如何转换正在处理的Active工作簿? 这段代码有类似附件的.xlsx文件,但我希望它是文本,我如何才能更改它? 谢谢 您只能将一个工作表转换为文本,因此我假设这就是您试图实现的目标。将工作表复制到新工作簿(以便您可以将当前工作簿作为xlsm继续使用),将其另存为文本,然后使用用于附件的字符串的保存位置。添加 Dim wbkthis As Workbook Dim wbkNew As Workbook Set wbkthis = ActiveWorkbook '

在outlook中发送邮件时,如何转换正在处理的Active工作簿? 这段代码有类似附件的.xlsx文件,但我希望它是文本,我如何才能更改它? 谢谢


您只能将一个工作表转换为文本,因此我假设这就是您试图实现的目标。将工作表复制到新工作簿(以便您可以将当前工作簿作为xlsm继续使用),将其另存为文本,然后使用用于附件的字符串的保存位置。添加

Dim wbkthis As Workbook
Dim wbkNew As Workbook

Set wbkthis = ActiveWorkbook 
'So we can come back here
Set wbkNew = Workbooks.Add 
'New book to copy sheet to

wbkthis.Sheets("relevantsheetname").Copy Before:=wbkNew.Sheets(1)

Application.DisplayAlerts = False
'Supress overwrite and close alerts, you may not want this

wbkNew.SaveAs "savelocation\Mybookname.txt", xlText 
'use this same string with your attachments.add code
wbkNew.Close

Application.DisplayAlerts = True
wbkthis.Activate ' Go back to original file

您只能将一个工作表转换为文本,因此我假设这就是您试图实现的目标。将工作表复制到新工作簿(以便您可以将当前工作簿作为xlsm继续使用),将其另存为文本,然后使用用于附件的字符串的保存位置。添加

Dim wbkthis As Workbook
Dim wbkNew As Workbook

Set wbkthis = ActiveWorkbook 
'So we can come back here
Set wbkNew = Workbooks.Add 
'New book to copy sheet to

wbkthis.Sheets("relevantsheetname").Copy Before:=wbkNew.Sheets(1)

Application.DisplayAlerts = False
'Supress overwrite and close alerts, you may not want this

wbkNew.SaveAs "savelocation\Mybookname.txt", xlText 
'use this same string with your attachments.add code
wbkNew.Close

Application.DisplayAlerts = True
wbkthis.Activate ' Go back to original file

使用MS Office,您可以复制剪贴板中的Excel单元格区域,并将其粘贴到Outlook邮件正文中(如果该邮件正文为富文本格式且您正在使用Word editor)。在此过程中,单元格范围将转换为富格文本表

这也可以通过以下代码实现:

Sub emailer()

 Set oOlApp = CreateObject("Outlook.Application")

 olMailItem = 0
 Set oOlMItem = oOlApp.CreateItem(olMailItem)

 'get Excel cell range which shall be in the mail
 Set oWB = ActiveWorkbook
 Set oWS = ActiveWorkbook.Worksheets(1)
 Set oRange = oWS.Range("A1:C10")

 oRange.Copy ' Range is now in Clipboard

 With oOlMItem

  .Display

  .To = "email@email.com"
  .Subject = "Subject"

  Set oOlInsp = .GetInspector
  Set oWdDoc = oOlInsp.WordEditor ' get Word Document from the MailBody

  olFormatRichText = 3
  .BodyFormat = olFormatRichText ' change to RichTextFormat

  Set oWdRng = oWdDoc.Paragraphs(oWdDoc.Paragraphs.Count).Range
  oWdRng.InsertBefore "This is before the Excel table."
  oWdRng.InsertParagraphAfter
  oWdRng.InsertParagraphAfter

  Set oWdRng = oWdDoc.Paragraphs(oWdDoc.Paragraphs.Count).Range
  oWdRng.Paste ' paste Excel range from Clipboard

  oWdRng.InsertParagraphAfter

  Set oWdRng = oWdDoc.Paragraphs(oWdDoc.Paragraphs.Count).Range
  oWdRng.InsertBefore "This is after the Excel table."


 End With

 Application.CutCopyMode = False

End Sub

使用MS Office,您可以复制剪贴板中的Excel单元格区域,并将其粘贴到Outlook邮件正文中(如果该邮件正文为富文本格式且您正在使用Word editor)。在此过程中,单元格范围将转换为富格文本表

这也可以通过以下代码实现:

Sub emailer()

 Set oOlApp = CreateObject("Outlook.Application")

 olMailItem = 0
 Set oOlMItem = oOlApp.CreateItem(olMailItem)

 'get Excel cell range which shall be in the mail
 Set oWB = ActiveWorkbook
 Set oWS = ActiveWorkbook.Worksheets(1)
 Set oRange = oWS.Range("A1:C10")

 oRange.Copy ' Range is now in Clipboard

 With oOlMItem

  .Display

  .To = "email@email.com"
  .Subject = "Subject"

  Set oOlInsp = .GetInspector
  Set oWdDoc = oOlInsp.WordEditor ' get Word Document from the MailBody

  olFormatRichText = 3
  .BodyFormat = olFormatRichText ' change to RichTextFormat

  Set oWdRng = oWdDoc.Paragraphs(oWdDoc.Paragraphs.Count).Range
  oWdRng.InsertBefore "This is before the Excel table."
  oWdRng.InsertParagraphAfter
  oWdRng.InsertParagraphAfter

  Set oWdRng = oWdDoc.Paragraphs(oWdDoc.Paragraphs.Count).Range
  oWdRng.Paste ' paste Excel range from Clipboard

  oWdRng.InsertParagraphAfter

  Set oWdRng = oWdDoc.Paragraphs(oWdDoc.Paragraphs.Count).Range
  oWdRng.InsertBefore "This is after the Excel table."


 End With

 Application.CutCopyMode = False

End Sub

我确信Axel的答案可能是您所需要的,但既然您要求将其转换为文本,然后将其输入,这就可以了。当然,格式看起来很糟糕。确保(在VBE中)进入“工具/参考”,并在Microsoft Forms 2.0对象库旁边打勾

Dim ws As Worksheet
Dim DataObj As MSForms.DataObject
Set DataObj = New MSForms.DataObject
Set ws = ActiveWorkbook.ActiveSheet
    ws.UsedRange.Copy
DataObj.GetFromClipboard
strbody = DataObj.GetText(1)

With NewMail
  .SUBJECT = "Test Mail"
  .From = """Sender"" <sender@email.com>"
  .To = "receiver@email.com"
  .CC = ""
  .BCC = ""
  .TextBody = strbody
End With
Dim ws As工作表
将DataObj设置为MSForms.DataObject
Set DataObj=New MSForms.DataObject
设置ws=ActiveWorkbook.ActiveSheet
ws.UsedRange.Copy
DataObj.GetFromClipboard
strbody=DataObj.GetText(1)
与NewMail
.SUBJECT=“测试邮件”
.From=“”发件人“”
.To=”receiver@email.com"
.CC=“”
.BCC=“”
.TextBody=strbody
以

我确信Axel的答案可能正是您所需要的,但既然您要求将其转换为文本,然后将其输入,这样就可以了。当然,格式看起来很糟糕。确保(在VBE中)进入“工具/参考”,并在Microsoft Forms 2.0对象库旁边打勾

Dim ws As Worksheet
Dim DataObj As MSForms.DataObject
Set DataObj = New MSForms.DataObject
Set ws = ActiveWorkbook.ActiveSheet
    ws.UsedRange.Copy
DataObj.GetFromClipboard
strbody = DataObj.GetText(1)

With NewMail
  .SUBJECT = "Test Mail"
  .From = """Sender"" <sender@email.com>"
  .To = "receiver@email.com"
  .CC = ""
  .BCC = ""
  .TextBody = strbody
End With
Dim ws As工作表
将DataObj设置为MSForms.DataObject
Set DataObj=New MSForms.DataObject
设置ws=ActiveWorkbook.ActiveSheet
ws.UsedRange.Copy
DataObj.GetFromClipboard
strbody=DataObj.GetText(1)
与NewMail
.SUBJECT=“测试邮件”
.From=“”发件人“”
.To=”receiver@email.com"
.CC=“”
.BCC=“”
.TextBody=strbody
以

不清楚您到底想要什么。一个工作簿可以包含多个工作表。那么这些工作表应该如何在文本中表示呢?此外,如果一个工作表中仅表示一个范围,那么该范围应如何在文本中表示?或者您是指表示为富格文本表的范围吗?此工作簿只有一个工作表,它只涉及数字和名称,因此我想将excel转换为txt,以便另一个可以从文本文件@AxelRichterNot接收这些信息。请明确您的具体要求。一个工作簿可以包含多个工作表。那么这些工作表应该如何在文本中表示呢?此外,如果一个工作表中仅表示一个范围,那么该范围应如何在文本中表示?或者,您是指表示为富文本表的范围吗?此工作簿只有一个工作表,它只涉及数字和名称,因此我想将excel转换为txt,以便另一个可以从文本文件@AxelRichterhello接收这些信息,谢谢您的帮助,我只是在以下方面遇到了一个问题:Set oWdContent=oWdDoc.Content,错误91对象变量或未设置块变量(错误91),这是什么问题?抱歉,无法再现。在Office 2007和2016为我工作。但是行
Set oWdContent=oWdDoc.Content
是一个工件,不是必需的。此外,我还更新了代码,以便在Outlook尚未打开时也能正常工作。我以前没有测试过这个,因为我的Outlook总是打开的。但如果不是,则只有在至少一个Outlook窗口可见时,代码才能正常工作。因此,现在代码将
。在继续之前首先显示邮件项目。您好,感谢您的帮助,我只是在以下方面遇到问题:Set oWdContent=oWdDoc.Content,error 91 Object variable或With block variable not Set(error 91),这是什么问题?抱歉,无法再现。在Office 2007和2016为我工作。但是行
Set oWdContent=oWdDoc.Content
是一个工件,不是必需的。此外,我还更新了代码,以便在Outlook尚未打开时也能正常工作。我以前没有测试过这个,因为我的Outlook总是打开的。但如果不是,则只有在至少一个Outlook窗口可见时,代码才能正常工作。因此,现在代码将
。在继续之前先显示
邮件项目。非常感谢!非常感谢你!