Back to jkp-ads.com |
Ron de Bruin
|
Ron de Bruin decided to remove all Windows Excel content from his website for personal reasons. If you want to know why, head over to rondebruin.nl.
Luckily, Ron was kind enough to allow me to publish all of his Excel content here.
Most of these pages are slightly outdated and may contain links that don 't work. Please inform me if you find such an error and I'll try to fix it.
Kind regards
Jan Karel Pieterse
Important read this :
The code on this page is only working when you use Outlook as your mail
program.
Copy the code in a Standard module of your workbook, if you just
started with VBA see this page.
Where do I paste
the code that I find on the internet
Check out this Tip page for changing the code on this page.
Tips for changing the code examples
Important :
1) The
code is not working if your data is a List(Excel 2003) or Table(Excel
2007-2016)
2) The first row in the range must have
Headers
3) Turn off AutoFilter before you use the code
4) Be sure that the sheet with the data is the active
worksheet
In this example I use the range A1:J100
In column
A : Names of the students
In column B
: E-mail addresses
In column C : yes or no ( if the
value is yes it will create a mail)
In column D:J :
Grades or other info for the student
How do I Change filter range and
filter column? :
In this example I use the filter range A1:J100
You
can change the filter range and filter column in this code line in the
macro.
Ash.Range("A1:J100").AutoFilter
Field:=2, Criteria1:=cell.Value
Field = 2 'Filter column = B
because the filter range start in A
Tip : For
testing I use .Display, change it to .Send if it is working OK.
Note: This example use the function RangetoHTML, copy this
function together
with the macro in a Standard module of your workbook.
You can find the
RangetoHTML function below the example macro on this
page.
Note: If you have more rows with information for each student try this example
Sub Send_Row() 'For Tips see: https://jkp-ads.com/rdb/win/winmail/Outlook/tips.htm 'Don't forget to copy the function RangetoHTML in the module. 'Working in Excel 2000-2016 Dim OutApp As Object Dim OutMail As Object Dim cell As Range Dim rng As Range Dim Ash As Worksheet Set Ash = ActiveSheet On Error GoTo cleanup Set OutApp = CreateObject("Outlook.Application") With Application .EnableEvents = False .ScreenUpdating = False End With For Each cell In Ash.Columns("B").Cells.SpecialCells(xlCellTypeConstants) If cell.Value Like "?*@?*.?*" _ And LCase(cell.Offset(0, 1).Value) = "yes" Then 'Change the filter range and filter Field if needed 'It will filter on Column B now (mail addresses) Ash.Range("A1:J100").AutoFilter Field:=2, Criteria1:=cell.Value With Ash.AutoFilter.Range On Error Resume Next Set rng = .SpecialCells(xlCellTypeVisible) On Error GoTo 0 End With Set OutMail = OutApp.CreateItem(0) On Error Resume Next With OutMail .To = cell.Value .Subject = "Grades Aug" .HTMLBody = RangetoHTML(rng) .Display 'Or use .Send End With On Error GoTo 0 Set OutMail = Nothing Ash.AutoFilterMode = False End If Next cell cleanup: Set OutApp = Nothing With Application .EnableEvents = True .ScreenUpdating = True End With 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
If you want to add a few text lines above the HTML body you can add this
to the macro. Note: This is not working if Word is your mail editor in
Outlook 2000-2003, you can change this setting in Outlook:
Tools>Options>…Mail Format tab
Add this Dim line
Dim StrBody As String
Build the string you want to add
StrBody = "This is line 1" & "<br>" & _ "This is line 2" & "<br>" & _ "This is line 3" & "<br><br><br>"
Or use this for cell values from Sheet2
StrBody = Sheets("Sheet2").Range("A1").Value & "<br>" & _ Sheets("Sheet2").Range("A2").Value & "<br>" & _ Sheets("Sheet2").Range("A3").Value & "<br><br><br>"
And change the HTMLBody line to this
.HTMLBody = StrBody & RangetoHTML(rng)
If you want to use the Intellisense help showing you the properties and
methods of the objects as you type you can use Early Binding.
Bit faster also when you run your code but you can have problems when you
distribute your workbooks. Excel will automatic update the reference number
to Outlook when you open your workbook in a higher version of Excel/Outlook
but not update it when you open it in a lower version of Excel/Outlook. With
Late Binding as I used in the macro examples you not have
this problem.
Add a reference to the Microsoft Outlook Library in
Excel
1) Go to the VBA editor with the shortcut
Alt - F11
2) Click on
Tools>References in the Menu bar
3) Place a
Checkmark before Microsoft Outlook ? Object Library
Where ? is the Outlook version number
Then replace
this three lines in the code
Dim OutApp As
Object
Dim OutMail As Object
Set OutMail = OutApp.CreateItem(0)
With this three lines
Dim OutApp As
Outlook.Application
Dim OutMail As Outlook.MailItem
Set OutMail =
OutApp.CreateItem(olMailItem)