Reputation: 1
I have used some standard code from the internet to use a button to create an email in Outlook with an attachment that is a range in the worksheet where the button is pressed.The code works beautifully. How can I extend the code to attach two or more ranges? In the code below, I already started initializing a second Source and Dest, but then lost confidence regarding how this should be applied.
Private Sub CommandButton2_Click()
Dim Source As Range
Dim Source2 As Range
Dim Dest As Workbook
Dim Dest2 As Workbook
Dim wb As Workbook
Dim TempFilePath As String
Dim TempFileName As String
Dim FileExtStr As String
Dim AutoPrint As String
Dim FileFormatNum As Long
Dim OutApp As Object
Dim OutMail As Object
Set Source = Nothing
Set Source2 = Nothing
On Error Resume Next
Set Source = Range("A1:M47").SpecialCells(xlCellTypeVisible)
Set Source2 = Range("AB1:AN47").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Source Is Nothing Then
MsgBox "The source is not a range or the sheet is protected, please correct and try again.", vbOKOnly
Exit Sub
End If
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
Set wb = ActiveWorkbook
Set Dest = Workbooks.Add(xlWBATWorksheet)
Set Dest2 = Workbooks.Add(xlWBATWorksheet)
Source.Copy
With Dest.Sheets(1)
.Cells(1).PasteSpecial Paste:=8
.Cells(1).PasteSpecial Paste:=xlPasteValues
.Cells(1).PasteSpecial Paste:=xlPasteFormats
.Cells(1).Select
Application.CutCopyMode = False
End With
If Range("AC6") <> "" Then
Source2.Copy
With Dest2.Sheets(1)
.Cells(1).PasteSpecial Paste:=8
.Cells(1).PasteSpecial Paste:=xlPasteValues
.Cells(1).PasteSpecial Paste:=xlPasteFormats
.Cells(1).Select
Application.CutCopyMode = False
End With
End If
TempFilePath = Environ$("temp") & "\"
TempFileName = "Selection of " & wb.Name & " " & Format(Now, "dd-mmm-yy h-mm-ss")
If Val(Application.Version) < 12 Then
'You use Excel 97-2003
FileExtStr = ".xls": FileFormatNum = -4143
Else
'You use Excel 2007-2016
FileExtStr = ".xlsx": FileFormatNum = 51
End If
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
AutoPrint = Range("Y6").Value
With Dest
.SaveAs TempFilePath & TempFileName & FileExtStr, FileFormat:=FileFormatNum
On Error Resume Next
With OutMail
.to = Range("S6").Value
.CC = Range("S3").Value
If Range("T3").Value = "Enter bcc addresses manually here" Then
.bcc = ""
Else
.bcc = Range("T3").Value
End If
.Subject = Range("V6").Value
.Body = Range("U6").Value
.Attachments.Add Dest.FullName
'You can add other files also like this
'.Attachments.Add ("C:\test.txt")
If AutoPrint = "Yes" Then
.Send 'or use .Display
Else
.Display
End If
End With
On Error GoTo 0
.Close savechanges:=False
End With
Kill TempFilePath & TempFileName & FileExtStr
Set OutMail = Nothing
Set OutApp = Nothing
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub
Upvotes: 0
Views: 236
Reputation: 166196
Following on from my comment above:
Private Sub CommandButton2_Click()
Dim OutApp As Object, AutoPrint
Dim colAttachments As New Collection, fPath As String, ws As Worksheet, tm, p
Set ws = ActiveSheet
tm = Format(Now, "dd-mmm-yy h-mm-ss")
'first attachment
fPath = CreateAttachment(ws.Range("A1:M47"), _
"Selection1 of " & ws.Parent.Name & " " & tm)
If Len(fPath) = 0 Then Exit Sub 'exit if there was a problem
colAttachments.Add fPath
If ws.Range("AC6") <> "" Then 'second attachment? Note the filename needs to be distinct...
fPath = CreateAttachment(ws.Range("AB1:AN47"), _
"Selection2 of " & ws.Parent.Name & " " & tm)
If Len(fPath) = 0 Then Exit Sub 'exit if there was a problem
colAttachments.Add fPath
End If
Set OutApp = CreateObject("Outlook.Application")
AutoPrint = ws.Range("Y6").Value
With OutApp.CreateItem(0)
.to = ws.Range("S6").Value
.CC = ws.Range("S3").Value
If ws.Range("T3").Value = "Enter bcc addresses manually here" Then
.bcc = ""
Else
.bcc = ws.Range("T3").Value
End If
.Subject = ws.Range("V6").Value
.Body = ws.Range("U6").Value
For Each p In colAttachments 'add each attachment from the collection
.Attachments.Add p
Kill p
Next p
If AutoPrint = "Yes" Then
.Send
Else
.Display
End If
End With
End Sub
'create a file from the visible cells in `rng`
' and return the path to the file
Function CreateAttachment(rng As Range, fName As String) As String
Dim rngVis As Range, ws As Worksheet, ext, fPath As String
'try to get a range with only visible cells
On Error Resume Next
Set rngVis = rng.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If rngVis Is Nothing Then
MsgBox "The source is not a range or the sheet is protected. " & _
"Please correct and try again.", vbExclamation + vbOKOnly
Else
Application.ScreenUpdating = False
Set ws = Workbooks.Add(xlWBATWorksheet).Sheets(1)
rngVis.Copy
With ws.Cells(1)
.PasteSpecial Paste:=xlPasteColumnWidths '8
.PasteSpecial Paste:=xlPasteValues
.PasteSpecial Paste:=xlPasteFormats
.Select
End With
Application.CutCopyMode = False
ext = IIf(Val(Application.Version) < 12, ".xls", ".xlsx")
fPath = Environ$("temp") & "\" & fName & ext
ws.Parent.SaveAs fPath
ws.Parent.Close False
CreateAttachment = fPath
End If
End Function
Upvotes: 1