Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Option Explicit
- Sub LoopSheetsSendMail()
- ' Arrays to hold sheet and range info
- Dim shArray As Variant
- Dim rngArray As Variant
- Dim i As Integer ' because we need an iterator
- ' Some variables for email info
- Dim toLst As String
- Dim subj As String
- Dim rng As String
- shArray = Array("FirstSheet", "SecondSheet", "ThirdSheet") '<--Change these to the tab names
- rngArray = Array("A1:B2", "A3:B7", "A1:C6") '<--Change these to the ranges you need, in order of the sheets above.
- For i = LBound(shArray) To UBound(shArray)
- With ThisWorkbook.Sheets(shArray(i))
- toLst = .Range("F1")
- ' repeat the above for cc and bcc is necessary
- rng = rngArray(i)
- subj = "Currently sending sheet - " & shArray(i)
- ' send the mail
- Mail_Selection_Range_Outlook_Body toLst, subj, .Name, rng
- End With
- Next i
- End Sub
- ' All the code below was taken from - https://www.rondebruin.nl/win/s1/outlook/bmail2.htm
- ' some minor adapations made
- Sub Mail_Selection_Range_Outlook_Body(toLst As String, subj As String, sh As String, bdyRng As String)
- 'For Tips see: http://www.rondebruin.nl/win/winmail/Outlook/tips.htm
- 'Don't forget to copy the function RangetoHTML in the module.
- 'Working in Excel 2000-2016
- Dim rng As Range
- Dim OutApp As Object
- Dim OutMail As Object
- Set rng = Nothing
- On Error Resume Next
- 'Only the visible cells in the selection
- Set rng = ThisWorkbook.Sheets(sh).Range(bdyRng)
- '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
- MsgBox "The selection is not a range or the sheet is protected" & _
- vbNewLine & "please correct and try again.", vbOKOnly
- Exit Sub
- End If
- With Application
- .EnableEvents = False
- .ScreenUpdating = False
- End With
- Set OutApp = CreateObject("Outlook.Application")
- Set OutMail = OutApp.CreateItem(0)
- On Error Resume Next
- With OutMail
- .To = toLst
- .CC = ""
- .BCC = ""
- .Subject = subj
- .HTMLBody = RangetoHTML(rng)
- .Send 'or use .Display
- End With
- On Error GoTo 0
- With Application
- .EnableEvents = True
- .ScreenUpdating = True
- End With
- Set OutMail = Nothing
- Set OutApp = Nothing
- End Sub
- Function RangetoHTML(rng As Range)
- ' Changed by Ron de Bruin 28-Oct-2006
- ' Working in Office 2000-2016
- 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement