#excel #vba #pdf
Вопрос:
Я пытаюсь сохранить несколько PDF-файлов в одно вложение электронной почты. Однако приведенный ниже код создает электронное письмо в формате PDF. Вместо этого я хотел бы вложить все свои PDF-файлы в одно электронное письмо.
Электронная почта()
Dim WksAct As Worksheet
Dim LastRow As Integer, i As Integer
Dim MySheet As String, myFile As String
Dim OutlookApp As Object, MItem As Object
Set WksAct = ThisWorkbook.Sheets("Activity")
LastRow = WksAct.Range("A" amp; Rows.Count).End(xlUp).Row
For i = 1 To LastRow
If WksAct.Range("B" amp; i).Value < 0 Then
MySheet = WksAct.Range("A" amp; i).Value
myFile = ThisWorkbook.Path amp; "" amp; MySheet amp; ".pdf"
Sheets(MySheet).ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=myFile, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
Set OutlookApp = CreateObject("Outlook.Application")
Set MItem = OutlookApp.CreateItem(0)
With MItem
.To = "test@mail.com"
.Subject = "my Subject - To be adapted!"
.Body = " Please find... "
.Attachments.Add myFile
.Display
' .Send
End With
End If
Next i
Конец Суб
Комментарии:
1. Непонятно, о чем вы спрашиваете. В соответствии с вашим кодом это выглядит так, как будто вы создаете новый pdf-файл и создаете новое электронное письмо ДЛЯ КАЖДОЙ ИТЕРАЦИИ ЦИКЛА . Вопрос: Это действительно то, что вы хотите сделать? ПРЕДЛОЖЕНИЕ: Может быть, вы хотите 1) переместить «создать электронную почту» (
Create MItem
) НАД циклом, 2) продолжить создание PDF-файлов внутри цикла, но 3) просто добавьте (Mitem. Вложения. Добавляйте` каждую итерацию. Попробуйте, посмотрите, действительно ли это то, что вы ищете.2. Вероятно, следует переместить все из
Set OutlookApp = CreateObject("Outlook.Application")
вEnd With
, кроме как за.Attachments.Add myFile
пределы цикла. И внести поправки вMItem.Attachments.Add myFile
Ответ №1:
Предложения
- При работе со строками в Excel используйте
Long
и неInteger
используйте . Вы можете получить ошибку переполнения. - Создайте объект Outlook один раз вместо того, чтобы делать это в цикле.
Код
Option Explicit
Sub Mail()
Dim WksAct As Worksheet
Dim LastRow As Long, i As Integer
Dim MySheet As String, myFile As String
Dim OutlookApp As Object, MItem As Object
'~~> Work with Outlook Object
Set OutlookApp = CreateObject("Outlook.Application")
'~~> Create the email
Set MItem = OutlookApp.CreateItem(0)
With MItem
.To = "test@mail.com"
.Subject = "my Subject - To be adapted!"
.Body = " Please find... "
End With
Set WksAct = ThisWorkbook.Sheets("Activity")
With WksAct
LastRow = .Range("A" amp; .Rows.Count).End(xlUp).Row
For i = 1 To LastRow
If .Range("B" amp; i).Value2 < 0 Then
MySheet = .Range("A" amp; i).Value2
myFile = ThisWorkbook.Path amp; "" amp; MySheet amp; ".pdf"
Sheets(MySheet).ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=myFile, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
'~~> Give time for the save to happen
DoEvents
'~~> Attach the file
MItem.Attachments.Add myFile
End If
Next i
End With
'~~> Show the email
MItem.Display
End Sub
Альтернатива
Альтернативой было бы создать электронное письмо в конце и добавить все PDF-файлы за один раз. Например:
Option Explicit
Sub Mail()
Dim WksAct As Worksheet
Dim LastRow As Long, i As Integer
Dim MySheet As String, myFile As String
Dim OutlookApp As Object, MItem As Object
Set WksAct = ThisWorkbook.Sheets("Activity")
With WksAct
LastRow = .Range("A" amp; .Rows.Count).End(xlUp).Row
For i = 1 To LastRow
If .Range("B" amp; i).Value2 < 0 Then
MySheet = .Range("A" amp; i).Value2
myFile = ThisWorkbook.Path amp; "" amp; MySheet amp; ".pdf"
Sheets(MySheet).ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=myFile, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
'~~> Give time for the save to happen
DoEvents
End If
Next i
End With
Dim StrFile As String
'~~> Check if any pdfs were created and then
'~~> create the email
StrFile = Dir(ThisWorkbook.Path amp; "*.pdf")
If StrFile <> "" Then
'~~> Work with Outlook Object
Set OutlookApp = CreateObject("Outlook.Application")
'~~> Create the email
Set MItem = OutlookApp.CreateItem(0)
With MItem
.To = "test@mail.com"
.Subject = "my Subject - To be adapted!"
.Body = " Please find... "
'~~> Loop through all pdf and then add them
Do While Len(StrFile) > 0
MItem.Attachments.Add ThisWorkbook.Path amp; "" amp; StrFile
StrFile = Dir
Loop
'~~> Show the email
.Display
End If
End If
End Sub