Таблица адресов электронной почты на те же адреса - PullRequest
0 голосов
/ 02 апреля 2020

Так что в настоящее время мой код работает почти так, как мне нравится.

В настоящее время он группирует одни и те же электронные письма и электронные письма, которые относятся к человеку. Но в электронном письме я пытаюсь не включать столбец А., который является их электронным письмом.

    For Each cell In WS.Columns("A").Cells.SpecialCells(xlCellTypeConstants)
    If cell.Value Like "?*@?*.?*" Then

        'check if this email address has been used to generate an outlook email or not
        If dict.exists(cell.Value) = False Then

            dict.Add cell.Value, "" 'add the new email address
            Set OutMail = OutApp.CreateItem(0)
            Set rng = WS.UsedRange.Rows(1)

            'find all of the rows with the same email and add it to the range
            For Each cell2 In WS.UsedRange.Columns(1).Cells
                If cell2.Value = cell.Value Then
                    Set rng = Application.Union(rng, WS.UsedRange.Rows(cell2.Row))
                End If
            Next cell2

Я пытался изменить приведенный выше код, но, похоже, не могу с ним справиться. Кто-нибудь может мне помочь?

полный код:

    Option Explicit


Sub Test1()
    Dim OutApp As Object
    Dim OutMail As Object
    Dim dict As Object 'keep the unique list of emails
    Dim cell As Range
    Dim cell2 As Range
    Dim rng As Range
    Dim i As Long
    Dim WS As Worksheet
    Dim Signature As String

    Application.ScreenUpdating = False
    Set OutApp = CreateObject("Outlook.Application")
    Set dict = CreateObject("scripting.dictionary")
    Set WS = ThisWorkbook.Sheets("Sheet1") 'Current worksheet name

    On Error GoTo cleanup
    For Each cell In WS.Columns("A").Cells.SpecialCells(xlCellTypeConstants)
        If cell.Value Like "?*@?*.?*" Then

            'check if this email address has been used to generate an outlook email or not
            If dict.exists(cell.Value) = False Then

                dict.Add cell.Value, "" 'add the new email address
                Set OutMail = OutApp.CreateItem(0)
                Set rng = WS.UsedRange.Rows(1)

                'find all of the rows with the same email and add it to the range
                For Each cell2 In WS.UsedRange.Columns(1).Cells
                    If cell2.Value = cell.Value Then
                        Set rng = Application.Union(rng, WS.UsedRange.Rows(cell2.Row))
                    End If
                Next cell2

                On Error Resume Next
                With OutMail
                    .SentOnBehalfOfName = ""
                    .GetInspector ' ## This inserts default signature
                        Signature = .HTMLBody ' ## Capture the signature HTML
                    .To = cell.Value
                    .CC = ""
                    .Subject = "Reminder"
                    .HTMLBody = "<BODY style=font-size:12pt;font-family:Calibri><font color=#000000>Hi " & WorksheetFunction.Proper(RemoveNumbers(Left((cell.Value), InStr((cell.Value), ".") - 1))) & ", " & "<br><br>" & "Please see your trip numbers and estimated cost below:" & vbNewLine & vbNewLine & RangetoHTML(rng) & Signature & "</font></BODY>"
                    .Display
                End With

                On Error GoTo 0
                Set OutMail = Nothing
            End If
        End If
    Next cell

cleanup:
    Set OutApp = Nothing
    Application.ScreenUpdating = True
End Sub

Function RemoveNumbers(Txt As String) As String
With CreateObject("VBScript.RegExp")
.Global = True
.Pattern = "[0-9]"
RemoveNumbers = .Replace(Txt, "")
End With
End Function

Function RangetoHTML(rng As Range)
    Dim fso As Object
    Dim ts As Object
    Dim TempFile As String
    Dim TempWB As Workbook

    TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"

    'Copy the range and create a new workbook to past the data in
    rng.Copy
    Set TempWB = Workbooks.Add(1)
    With TempWB.Sheets(1)
        .Cells(1).PasteSpecial Paste:=8
        .Cells(1).PasteSpecial xlPasteValues, , False, False
        .Cells(1).PasteSpecial xlPasteFormats, , False, False
        .Cells(1).Select
        Application.CutCopyMode = False
        On Error Resume Next
        .DrawingObjects.Visible = True
        .DrawingObjects.Delete
        On Error GoTo 0
    End With

    'Publish the sheet to a htm file
    With TempWB.PublishObjects.Add( _
         SourceType:=xlSourceRange, _
         Filename:=TempFile, _
         Sheet:=TempWB.Sheets(1).Name, _
         Source:=TempWB.Sheets(1).UsedRange.Address, _
         HtmlType:=xlHtmlStatic)
        .Publish (True)
    End With

    'Read all data from the htm file into RangetoHTML
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
    RangetoHTML = ts.readall
    ts.Close
    RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
                          "align=left x:publishsource=")

    'Close TempWB
    TempWB.Close savechanges:=False

    'Delete the htm file we used in this function
    Kill TempFile

    Set ts = Nothing
    Set fso = Nothing
    Set TempWB = Nothing
End Function

1 Ответ

1 голос
/ 02 апреля 2020

Один из вариантов - использовать Intersect и Resize.

После l oop, который создает rng, но перед передачей rng в RangetoHTML:

With WS.UsedRange
    Set rng = Intersect(rng, .Columns(2).Resize(,.Columns.Count - 1))
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...