asked on
Option Compare Database
Dim XLApp2 As Excel.Application
Sub sendEmail()
'Open Database
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM [3 list for sending report]")
Dim ExcelName As String
Dim filename As String
'Check to see if the recordset actually contains rows
If Not (rs.EOF And rs.BOF) Then
rs.MoveFirst 'Unnecessary in this case, but still a good habit
Do Until rs.EOF = True
If rs!isSend = "Yes" Then
'Get Report Source
sReportName = rs![Report_Name]
'Open Report Source
ExcelName = Forms("frm_Demand_Generation").Controls("txt_main_file").Value & "\" & sReportName
filename = GetFilenameFromPath(ExcelName)
If IsFileOpen(ExcelName) = False Then
Set XLApp2 = CreateObject("Excel.Application")
XLApp2.Workbooks.Open ExcelName, True, False
XLApp2.Visible = True
Else
Set XLApp2 = GetObject(ExcelName).Application
End If
'Send Update Begin
XLApp2.ActiveWorkbook.Activate
Dim rng As Excel.Range
Dim rng2 As Excel.Range
With XLApp2.Application
.Calculation = False
.EnableEvents = False
.ScreenUpdating = True
End With
Set myOlApp = CreateObject("Outlook.Application")
Set myitem = myOlApp.CreateItem(0)
Set Safemail = CreateObject("Redemption.SafemailItem")
EmailAddress = rs![Rep Email]
CCEmailAddress = rs![FLM Email]
MRName = rs![REP Name]
XLApp2.Sheets("Genmed Business Tracker - v2").Activate
XLApp2.ActiveSheet.Range("$B$3:$BJ$3").AutoFilter Field:=5, Criteria1:=rs![REP Name]
XLApp2.[rangetoCopyV2].Select
Set rng = Nothing
'Only the visible cells in the selection
Set rng = XLApp2.Selection.SpecialCells(xlCellTypeVisible)
'You can also use a fixed range if you want
'Set rng = Sheets("YourSheet").Range("D4:D12").SpecialCells(xlCellTypeVisible)
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
XLApp2.Sheets("PF and Coverage").Activate
XLApp2.ActiveSheet.Range("$A$1:$V$1").AutoFilter Field:=5, Criteria1:=rs![REP Name]
XLApp2.ActiveSheet.Range("$A$1:$V$1").AutoFilter Field:=22, Criteria1:="=NOT PF" ', Operator:=xlOr, Criteria2:="=PF0"
XLApp2.ActiveSheet.Range(XLApp2.ActiveSheet.Range("H1:S1"), XLApp2.ActiveSheet.Range("H1:S1").End(xlDown)).Select
Set rng2 = Nothing
'Only the visible cells in the selection
Set rng2 = XLApp2.[pf_list] 'Selection.SpecialCells(xlCellTypeVisible)
'You can also use a fixed range if you want
'Set rng = Sheets("YourSheet").Range("D4:D12").SpecialCells(xlCellTypeVisible)
If rng2 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 myitem
.To = EmailAddress
.CC = CCEmailAddress
Set Safemail.Item = myitem
Safemail.Subject = "[For your follow up]: QTQ Progress update - " & MRName & " - " & Forms("frm_Demand_Generation").Controls("txtperiod").Value
.HTMLBody = "<b>Dear " & MRName & "</b>" & _
"<br><br>Berikut ini progress update performance QTQ anda untuk bulan ini dengan tarikan data tanggal : " &
Forms("frm_Demand_Generation").Controls("txtperiod").Value & _
"<br>" & _
RangetoHTML(rng) & _
"<br><br>" & _
"<br><br> berikut list dokter anda yang belum memenuhi KPI Product Frequency dibulan ini : " & _
"<br>" & _
RangetoHTML(rng2) & _
"<br>" & _
"</center><br>Catatan: " & _
"<br>1. Pastikan untuk selalu melakukan proses sinkronisasi setiap hari agar data QTQ dapat tercantum di progress update ini" & _
"<br>2. Anda dapat menjadikan list dokter yang belum PF untuk plan call anda" & _
"<br><br>Salam,<br>SFE Team"
End With
Safemail.Send
Set Safemail = Nothing
Set myOlApp = Nothing
With XLApp2.Application
.Calculation = True
.EnableEvents = True
.ScreenUpdating = True
End With
'Perform an edit
rs.Edit
rs!isSent = "Sent"
rs.Update
XLApp2.DisplayAlerts = False
XLApp2.Quit
Set XLApp2 = Nothing
Set rng = Nothing
Set rng2 = Nothing
Else
'Perform an edit
rs.Edit
rs!isSent = "Skipped"
rs.Update
End If
'End of Update
'Move to the next record. Don't ever forget to do this.
rs.MoveNext
Loop
Else
MsgBox "There are no records in the recordset."
End If
MsgBox "Finished looping through records."
rs.Close 'Close the recordset
Set rs = Nothing 'Clean up
Set XLApp2 = Nothing
End Sub
Function RangetoHTML(rng As Excel.Range)
Dim fso As Object
Dim ts As Object
Dim TempFile As String
Dim TempWB As Excel.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)
TempWB.Application.Visible = True
With TempWB.Sheets(1)
.Cells(1).PasteSpecial Paste:=8
.Cells(1).PasteSpecial xlPasteValues, , False, False 'it always error in this line at second loop
.Cells(1).PasteSpecial xlPasteFormats, , False, False
.Cells(1).Select
TempWB.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