Excel VBA - диапазон рассылки в виде таблицы для соответствия электронной почты в столбце

У меня есть электронная таблица с именами получателей в столбце A, адресами электронной почты получателей в столбце B и множеством других столбцов с информацией, которая будет отправлена ​​этим получателям по электронной почте. У каждого получателя есть несколько строк, и количество строк на каждого получателя каждый раз меняется. Количество получателей также варьируется.

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

Любая помощь будет оценена. Я впервые работаю с Outlook через Excel VBA.

Спасибо


person Texas_StratTN    schedule 16.06.2016    source источник
comment
Можете ли вы показать, как выглядит электронная таблица   -  person 0m3r    schedule 18.06.2016


Ответы (2)


  1. Добавьте ссылку на библиотеку Outlook в VBA (на панели инструментов -> Инструменты-> Ссылки-Microsoft Outlook)
  2. Получатели будут фильтром (если электронное письмо отправляется одному и тому же человеку, просто вставьте все, что вы хотите сказать ему / ей), так почему бы в первую очередь не сделать фильтр, прежде чем приводить их в порядок ?
  3. После добавления ссылки вы будете доступны для использования команд Outlook, создания экземпляров и т. Д. Там много примеров Google, может быть, с этого лучше начать. Это мой рекомендуемый рабочий процесс
person Sgdva    schedule 16.06.2016

Спасибо Sgdva. Это был хороший намек. Я также использовал код от Ron de Bruin, чтобы придумать следующее решение.

Эта подпрограмма устанавливает мои данные и не очень важна для ответа, но может быть кому-то полезна.

Sub Related_BA()

Dim wb As Workbook
Dim ws As Worksheet
Dim filename As Variant
Dim returnVAlue As Variant
Dim BAwb As Workbook
Dim BAws As Worksheet
Dim BArng As Range
Dim LastRow As Integer
Dim i As Integer

Set wb = ActiveWorkbook
Set ws = wb.Worksheets("Super User Report")

filename = Application.GetOpenFilename(filefilter:="Excel Files (*xls), *xls", Title:="Please select BA refernce file")
If filename = False Then Exit Sub

ws.Range("A:B").EntireColumn.Insert

Set BAwb = Application.Workbooks.Open(filename)
Set BAws = BAwb.Worksheets("Sheet1")
Set BArng = BAws.ListObjects("DepartmentBA").DataBodyRange

With ws.Cells(1, 1)
    .Value = "BA"
    .HorizontalAlignment = xlCenter
    .Font.Bold = True
End With

With ws.Cells(1, 2)
    .Value = "BA Email"
    .HorizontalAlignment = xlCenter
    .Font.Bold = True
End With

LastRow = ws.Range("C1").CurrentRegion.Rows.Count

On Error Resume Next
For i = 2 To LastRow
    ws.Cells(i, 1) = Application.WorksheetFunction.VLookup(ws.Cells(i, 6), BArng, 2, 0)
Next i

On Error Resume Next
For i = 2 To LastRow
    ws.Cells(i, 2) = Application.WorksheetFunction.VLookup(ws.Cells(i, 6), BArng, 3, 0)
Next i

BAwb.Close False

ws.Columns("A:B").EntireColumn.AutoFit

ws.Range("B2").CurrentRegion.Sort key1:=ws.Range("B2"), order1:=xlAscending, _
    key2:=ws.Range("C2"), order2:=xlAscending, Header:=xlYes

Call SendEmail

ws.Range("A:B").EntireColumn.Delete


End Sub

Это форматирует данные для электронной почты и вызывает функцию электронной почты. Мне все еще может понадобиться код для обработки # N / A из vlookup.

Sub SendEmail()

Dim cBA As Collection
Dim rng As Range
Dim cell As Range
Dim wb As Workbook
Dim ws As Worksheet
Dim vNum As Variant
Dim lRow As Integer

Set wb = ActiveWorkbook
Set ws = wb.Worksheets("Super User Report")
lRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set rng = ws.Range("A2:A" & lRow)
Set cBA = New Collection

On Error Resume Next
    For Each cell In rng.Cells
        cBA.Add cell.Value, CStr(cell.Value)
    Next cell
On Error GoTo 0

On Error Resume Next
cBA.Remove ("None")

Worksheets("Super User Report").AutoFilterMode = False

For Each vNum In cBA
    rng.AutoFilter Field:=1, Criteria1:=vNum
    Call Email(vNum)
    rng.AutoFilter Field:=1
Next vNum


End Sub

Эта подпрограмма фактически создает и отправляет электронное письмо.

Sub Email(BA As Variant)

Dim wb As Workbook
Dim ws As Worksheet
Dim lRow As Integer
Dim StrBody As String
Dim rng As Range
Dim OutApp As Object
Dim OutMail As Object
Dim Mnth As Variant
Dim Yr As Variant

StrBody = "This is line 1" & "<br>" & _
          "This is line 2" & "<br>" & _
          "This is line 3" & "<br><br><br>"


Mnth = Format(Month(Date), "mmmm")
Yr = Year(Date)
Set wb = ActiveWorkbook
Set ws = wb.Worksheets("Super User Report")
lRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set rng = Nothing
On Error Resume Next
'Only the visible cells in the selection
Set rng = ws.Range("C1:L" & lRow).SpecialCells(xlCellTypeVisible)
'You can also use a fixed range if you want
'Set rng = Sheets("YourSheet").Range("D4:D12").SpecialCells(xlCellTypeVisible)
On Error GoTo 0

If rng Is Nothing Then
    Exit Sub
End If

With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With

rng.Borders(xlDiagonalDown).LineStyle = xlNone
rng.Borders(xlDiagonalUp).LineStyle = xlNone
With rng.Borders(xlEdgeLeft)
    .LineStyle = xlContinuous
    .ColorIndex = 0
    .TintAndShade = 0
    .Weight = xlThin
End With
With rng.Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .ColorIndex = 0
    .TintAndShade = 0
    .Weight = xlThin
End With
With rng.Borders(xlEdgeBottom)
    .LineStyle = xlContinuous
    .ColorIndex = 0
    .TintAndShade = 0
    .Weight = xlThin
End With
With rng.Borders(xlEdgeRight)
    .LineStyle = xlContinuous
    .ColorIndex = 0
    .TintAndShade = 0
    .Weight = xlThin
End With
With rng.Borders(xlInsideVertical)
    .LineStyle = xlContinuous
    .ColorIndex = 0
    .TintAndShade = 0
    .Weight = xlThin
End With
With rng.Borders(xlInsideHorizontal)
    .LineStyle = xlContinuous
    .ColorIndex = 0
    .TintAndShade = 0
    .Weight = xlThin
End With

Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)

Mnth = Format(Month(Date), "mmmm")
Yr = Year(Date)

On Error Resume Next
With OutMail
    .To = BA
    .CC = ""
    .BCC = ""
    .Subject = "Monthly Super User Report " & Mnth & " " & Yr
    .HTMLBody = StrBody & RangetoHTML(rng)
    .Display   'or use .Send
End With
On Error GoTo 0

rng.Borders(xlDiagonalDown).LineStyle = xlNone
rng.Borders(xlDiagonalUp).LineStyle = xlNone
rng.Borders(xlEdgeLeft).LineStyle = xlNone
rng.Borders(xlEdgeTop).LineStyle = xlNone
rng.Borders(xlEdgeBottom).LineStyle = xlNone
rng.Borders(xlEdgeRight).LineStyle = xlNone
rng.Borders(xlInsideVertical).LineStyle = xlNone
rng.Borders(xlInsideHorizontal).LineStyle = xlNone

With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With

Set OutMail = Nothing
Set OutApp = Nothing
End Sub

Эта функция упоминается в подпункте выше.

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

Надеюсь, это кому-то будет полезно.

person Texas_StratTN    schedule 21.06.2016