【问题标题】:Column Headers to the last line of data entered to the HTMLBody输入到 HTMLBody 的最后一行数据的列标题
【发布时间】:2022-10-17 23:42:57
【问题描述】:

我已将最后一行输入到我的 HTML 正文中。但是列标题没有显示,我做错了什么?

Private Sub cmdEmail_Click()

    'Declare Outlook Variables
    Dim OLApp As Outlook.Application
    Dim OLMail As Object
    Dim MyData As Object
    'Open the Outlook Application and Start a new mail
    Set OLApp = New Outlook.Application
    Set OLMail = OLApp.CreateItem(0)
    Set MyData = ThisWorkbook.Worksheets("Database").Cells(Rows.count, 1).End(xlUp).Resize(, 13)
    OLApp.Session.Logon
    With OLMail
        .To = ""
        .CC = ""
        .BCC = ""
        .Subject = "Quality Alert"
        .HTMLBody = "<P><font size='6' face='Calibri' color='black'>Quality Issue Found<br><br> Please reply back with what adjustments have been made to correct this issue. </font></P>" & ConvertRangeToHTMLTable(ThisWorkbook.Worksheets("Database").Cells(Rows.count, 1).End(xlUp).Resize(, 13))
        Dim ws As Worksheet
        Set ws = ActiveWorkbook.Sheets("Database")
        Dim wb As Workbook
        ws.Copy
        Set wb = ActiveWorkbook
        wb.SaveAs "C:\Temp\Database.xlsx" 'Change Path
        .Display
        ' .Send
        wb.Close SaveChanges:=False
        Kill "C:\Temp\Database.xlsx"
    End With
    
    'Clearing Memory
    
    Set OLMail = Nothing
    Set OLApp = Nothing 
    
End Sub

【问题讨论】:

    标签: html excel vba automation


    【解决方案1】:

    只有最后一行的前 13 列成为目标。

    ThisWorkbook.Worksheets("Database").Cells(Rows.count, 1).End(xlUp).Resize(, 13)
    

    我为了包含所有数据,您必须将范围从第一个单元格扩展到最后一行。

    With ThisWorkbook.Worksheets("Database")
        Set MyData = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp).Resize(, 13))
    End With
    

    将代码分解成更小的部分将使您能够轻松地隔离和测试您的代码。

    将针对数据范围的代码提取到它自己的函数中(在公共模块中)允许使用Application.Goto 来明显地检查范围。

    Application.Goto EmailData
    
    Private Sub cmdEmail_Click()
        Dim HTMLBody As String
        HTMLBody = EmailHTMLFirstAndLastRow
    
        SendEmail HTMLBody 
        CreateACopyOfTheDatabaseSaveItCloseKillItButNeverDoAnythingWithit
    End Sub
    

    将此代码放在公共模块中:

    Sub SendEmail(HTMLBody As String)
        'Declare Outlook Variables
        Dim OLApp As Outlook.Application
        Dim OLMail As Object
        Dim MyData As Object
        'Open the Outlook Application and Start a new mail
        Set OLApp = New Outlook.Application
        Set OLMail = OLApp.CreateItem(0)
        OLApp.Session.Logon
        
        With OLMail
            .To = ""
            .CC = ""
            .BCC = ""
            .Subject = "Quality Alert"
            .HTMLBody = "<P><font size='6' face='Calibri' color='black'>Quality Issue Found<br><br> Please reply back with what adjustments have been made to correct this issue. </font></P>" & HTMLBody
             .Display
            ' .Send
        End With
        'Clearing Memory
        
        Set OLMail = Nothing
        Set OLApp = Nothing
        
    End Sub
    
    Function EmailHTMLFirstAndLastRow() As String
        Dim Target As Range
        Set Target = EmailData
        
        With Target
            .EntireRow.Hidden = msoTrue
            .Rows(1).Hidden = msoFalse
            .Rows(.Rows.Count).Hidden = msoFalse
            .EntireRow.Hidden = msoFalse
        End With
        EmailHTMLFirstAndLastRow = RangetoHTML(Target.Rows(Target.Rows.Count))
    End Function
    
    Function EmailData() As Range
        With ThisWorkbook.Worksheets("Database")
            Set EmailData = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp).Resize(, 13))
        End With
    End Function
    
    Sub CreateACopyOfTheDatabaseSaveItCloseKillItButNeverDoAnythingWithit()
        Dim ws As Worksheet
        Set ws = ActiveWorkbook.Sheets("Database")
        Dim wb As Workbook
        ws.Copy
        Set wb = ActiveWorkbook
        wb.SaveAs "C:TempDatabase.xlsx" 'Change Path
        wb.Close SaveChanges:=False
        Kill "C:TempDatabase.xlsx"
    End Sub
    

    编辑

    根据 OP 的请求,我编辑了代码以仅为标题和最后一行创建 html。由于RangetoHTML() 忽略隐藏行,我定义了数据范围,隐藏了除第一行和最后一行之外的所有行,将范围传递给RangetoHTML() 并将其值分配给一个变量,即取消隐藏范围。

    【讨论】:

    • 好吧,我需要保留列标题并且只添加输入的最后一行数据而不是整个数据库。因此,当多个 ppl 输入数据时,标题会保留,并且标题下的数据只是他们刚刚添加的数据。作为单行。
    • @TheRabbit 最简单的做法是将它们复制到临时工作表中以用于电子邮件。
    • strReturn = "<Table border='1' cellspacing='0' cellpadding='7' style='border-collapse:collapse;border:none'> " '遍历范围内的每一行,所以我把它写到我的 ConvertRangeToHTMLTable .我如何将列标题添加到此模块中,因为它内置在 HTML 正文中
    • @TheRabbit 我修改了我的答案。 RangetoHTML() 忽略隐藏行。基本上定义完整的范围,隐藏您不想发送的内容,然后使用 RangetoHTML() 。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多