Excel 使用VBA格式化要复制到电子邮件的表

Excel 使用VBA格式化要复制到电子邮件的表,excel,vba,outlook,Excel,Vba,Outlook,我已经为这个问题挣扎了一段时间,如果能提供任何帮助,我将非常感激。因此,我有一个代码,可以从我拥有的excel文件生成电子邮件。问题是,当电子邮件粘贴到表格上时,格式不正确。我附上了一个输出的截图,下面是代码 Sub-Send_-Email() '由Extendoffice 20200119更新 Dim xRg As范围 暗I,J等于长 Dim xAddress作为字符串 将邮件正文设置为字符串 将xMailOut设置为Outlook.MailItem 将xOutApp设置为Outlook.Ap

我已经为这个问题挣扎了一段时间,如果能提供任何帮助,我将非常感激。因此,我有一个代码,可以从我拥有的excel文件生成电子邮件。问题是,当电子邮件粘贴到表格上时,格式不正确。我附上了一个输出的截图,下面是代码

Sub-Send_-Email()
'由Extendoffice 20200119更新
Dim xRg As范围
暗I,J等于长
Dim xAddress作为字符串
将邮件正文设置为字符串
将xMailOut设置为Outlook.MailItem
将xOutApp设置为Outlook.Application
出错时继续下一步
xAddress=ActiveWindow.RangeSelection.Address
设置xRg=范围(“A9:E32”)
如果xRg为Nothing,则退出Sub
Application.ScreenUpdating=False
设置xOutApp=CreateObject(“Outlook.Application”)
设置xMailOut=xOutApp.CreateItem(olMailItem)
对于I=1到xRg.Rows.Count
对于J=1到xRg.Columns.Count
xEmailBody=xEmailBody&&&xRg.Cells(I,J).Value
下一个
xEmailBody=xEmailBody&vbNewLine
下一个
xEmailBody=“”&vbLf&vbLf&“&vbLf&vbLf&xEmailBody&vbNewLine
带着xMailOut
.Subject=工作表(“TDN生成器”).范围(“A6”).值
.To=“”
.Body=xEmailBody
.展示
’发送
以
设置xMailOut=Nothing
设置xOutApp=Nothing
Application.ScreenUpdating=True
端接头
这是它粘贴到电子邮件中的方式:

  Hello, 
   
  Check it out:        
          
  Trade 2        
  Trade Type  Grant Number  Security Type  Shares Sold  Shares Exercised 
  Sell To Cover  12345  Restricted Stock  200  
  Sell To Cover  12346  Restricted Stock  220  
  Sell To Cover  12347  Restricted Stock  240  
  Sell To Cover  12348  Restricted Stock  260  
  Sell To Cover  12349  Restricted Stock  280  

我希望它们在所述列中正确对齐。

您是否尝试过“粘贴特殊”命令


通常使用CTRL+ALT+V或ALT+E+s打开“特殊粘贴”对话框。

您可以使用空格功能根据需要向左或向右填充值

Option Explicit

Public Sub Test()

    Dim colwidth(1 To 5) As Integer
    Dim rg As Range
    Dim row As Range
    Dim col As Integer
    Dim val As String
    Dim strout As String
    
    ' adjust the column widths as required
    ' you will get an error if the value is
    ' wider than the column width
    colwidth(1) = 13
    colwidth(2) = 12
    colwidth(3) = 16
    colwidth(4) = 12
    colwidth(5) = 16
    
    ' function is in the worksheet module for convenience
    With Me
    
        Set rg = .Range("A1:E6")
        
        For Each row In rg.Rows
        
            ' pad left
            col = 1
            val = row.Cells(1, col)
            strout = val & Space(colwidth(col) - Len(val) + 1)
        
            ' pad right
            col = 2
            val = row.Cells(1, col)
            strout = strout & Space(colwidth(col) - Len(val)) & val & Space(1)
        
            ' pad left
            col = 3
            val = row.Cells(1, col)
            strout = strout & val & Space(colwidth(col) - Len(val) + 1)
        
            ' pad right
            col = 4
            val = row.Cells(1, col)
            strout = strout & Space(colwidth(col) - Len(val)) & val & Space(1)
        
            ' pad left
            col = 5
            val = row.Cells(1, col)
            strout = strout & val & Space(colwidth(col) - Len(val) + 1)
            
            Debug.Print strout
            
        Next row
    
    End With
    
End Sub
数据范围

输出

Trade Type    Grant Number Security Type     Shares Sold Shares Exercised 
Sell To Cover        12345 Restricted Stock          200                  
Sell To Cover        12346 Restricted Stock          220                  
Sell To Cover        12347 Restricted Stock          240                  
Sell To Cover        12348 Restricted Stock          260                  
Sell To Cover        12349 Restricted Stock          280                  
当然,这只适用于固定间距的字体。如果邮件客户端支持,则最好将数据写入html表。

使用html格式:

Sub-Send_-Email()
Dim xRg As范围
暗I,J等于长
Dim xAddress作为字符串
将邮件正文设置为字符串
将xMailOut设置为Outlook.MailItem
将xOutApp设置为Outlook.Application
出错时继续下一步
设置xRg=范围(“A9:E32”)
xEmailBody=“看一看:

”&HtmlTable(xRg) 设置xOutApp=CreateObject(“Outlook.Application”) 设置xMailOut=xOutApp.CreateItem(olMailItem) 带着xMailOut .Subject=工作表(“TDN生成器”).范围(“A6”).值 .To=“” .HTMLBody=xEmailBody .展示 ’发送 以 设置xMailOut=Nothing 设置xOutApp=Nothing Application.ScreenUpdating=True 端接头 函数HtmlTable(rng作为范围)作为字符串 尺寸s作为字符串,rw作为范围,c作为范围 s=“” 对于rng.行中的每个rw s=s&“ 对于rw.单元格中的每个c s=s&&c.值&“ 下一个c s=s&“ 下一个rw HtmlTable=s&“” 端函数
我无法让paste special开始工作。不确定这是否只是我如何做的,或者这是否对我的特定问题不起作用。这不是对所问问题的回答,这与VBA代码有关。如果您拥有评论权限,那么可能会对原始问题做出很好的评论,而此时您没有。此空间仅用于回答上述问题。嗨,蒂姆,谢谢你的帮助。我想知道如果表中的行数波动,这种html格式是否有效?另外,我将在何处将此代码插入到现有代码中?提前感谢您。表中包含的内容仅取决于传递给函数的范围:您可以传递集成所需的任何范围(在合理大小范围内)-如上所示?这和你的问题差不多,但是表的生成是在一个单独的函数中。嗨,蒂姆,这非常有用,让我走上了正确的轨道。不过我想知道两件事。首先,有可能在两个不同的范围内实现这一点吗?例如,有时会有一个额外的列需要像“other”一样包含在该表中。第二个可能不同的因素是,如果商品以不同的价格出售,我想提供更多细节,因此在底部我会包括日期和数字。但有时这不需要包括在内,因为它们都是相同的价格。不确定这是否太过分了。不过我真的很感激。最后,有没有可能让这个表格看起来像我最初截屏的那个?几乎任何事情都有可能,但你想做的每件事都需要编码,所以你需要尝试理解逻辑以及它们是如何组合在一起的。如果您想在邮件中添加样式,那么您需要了解一些css以及如何将css与HTML结合使用。这本身可能是一个大话题,不容易在这里讨论。如果您有具体的后续问题,那么可能需要一个包含确切要求的新帖子。