mailmerge macro updated
TRANSCRIPT
Private ws As Worksheet
Dim RowCount, SubjectCount As Integer
Dim StatusCol, NoOfEntries, NoOfPOs, DefFirstRow, DefFirstCol, LastRow, LastCol, VendorCol As Integer
Dim curPO, curStatus, selStatus As String
Dim SelWs As Worksheet
Dim rsList As New Recordset
Dim strVendorCodes, strVendorEmailAddresses As String
Dim NewFolderPath As String
Dim TempString, tempSubject As String
Dim arSubjects(50) As String
Dim LogFile As String
Public Sub Init(pWs As Worksheet)
Dim ws As Worksheet
DefFirstRow = 2
DefFirstCol = 1
RowCount = 0
NoOfEntries = 0
curPO = ""
If Dir$(ThisWorkbook.Path & "\templates\subjects.temp", vbNormal) <> vbNullString Then
strSubjects = ReadTextFiletoArray(ThisWorkbook.Path & "\templates\subjects.temp")
Else
MsgBox "'Subjects' Template File not found. Application Terminated", vbExclamation, "MailMerge"
End
End If
If FileExists(ThisWorkbook.Path & "\templates\temp01.xls") Then
Else
MsgBox ThisWorkbook.Path & "\templates\temp01.xls was not found. Application Terminated", vbExclamation, "MailMerge"
End
End If
Set rsList = CreateObject("adodb.recordset")
rsList.Fields.Append "RefRow", adLongVarChar, 20
rsList.Fields.Append "PONo", adLongVarChar, 20
rsList.Fields.Append "Release", adLongVarChar, 20
rsList.Fields.Append "Line", adLongVarChar, 20
rsList.Fields.Append "Agent", adLongVarChar, 20
rsList.Fields.Append "VendorCode", adLongVarChar, 20
rsList.Fields.Append "VendorName", adLongVarChar, 200
rsList.Fields.Append "VendorEmail", adLongVarChar, 200
'MCLZ 13-Mar-2012: Add VendorCC
rsList.Fields.Append "VendorCC", adLongVarChar, 200
rsList.Fields.Append "CatalogID", adLongVarChar, 200
rsList.Fields.Append "CatalogName", adLongVarChar, 255
rsList.Fields.Append "POIssueDate", adLongVarChar, 20
rsList.Fields.Append "QtyOrdered", adLongVarChar, 20
rsList.Fields.Append "QtyRecd", adLongVarChar, 20
rsList.Fields.Append "TotalPOCost", adLongVarChar, 20
rsList.Fields.Append "NeedOrEstDelDate", adLongVarChar, 20
rsList.Fields.Append "Comments", adLongVarChar, 255
rsList.Fields.Append "ContactPerson", adLongVarChar, 255
rsList.Fields.Append "Subject", adLongVarChar, 255
rsList.Fields.Append "POStatus", adLongVarChar, 20
rsList.Fields.Append "TraceNo", adLongVarChar, 20
rsList.Fields.Append "VendorTraceNo", adLongVarChar, 50
rsList.Open
'-----------------------------------------------
' Initialize 1st Page of the Wizard
'-----------------------------------------------
cboWorkSheets.Clear
For i = 1 To ActiveWorkbook.Worksheets.Count
If ActiveWorkbook.Worksheets(i).Visible = xlSheetVisible Then
cboWorkSheets.AddItem ActiveWorkbook.Worksheets(i).Name
End If
Next
'-----------------------------------------------
' Initialize 2nd Page of the Wizard
'-----------------------------------------------
With lvwPOs
.ColumnHeaders.Clear
For i = 0 To rsList.Fields.Count - 1
.ColumnHeaders.Add , , rsList.Fields(i).Name, 100
Next
End With
With lvwVendors
.ColumnHeaders.Clear
.ColumnHeaders.Add , , "Status", 50
.ColumnHeaders.Add , , "VendorTrace", 100
.ColumnHeaders.Add , , "Vendor Name", 150
.ColumnHeaders.Add , , "Vendor Email", 200
.ColumnHeaders.Add , , "EmailTemplateFileName", 100
.ColumnHeaders.Add , , "EmailSubject", 100
.ColumnHeaders.Add , , "Contact Person", 100
.ColumnHeaders.Add , , "Attachment", 100
'MCLZ 13-Mar-2012: Add VendorCC
.ColumnHeaders.Add , , "Vendor CC", 200
.Left = 78
.Top = 42
End With
cboRefinery.Clear
cboRefinery.AddItem "El Segundo"
cboRefinery.AddItem "Hawaii"
cboRefinery.AddItem "Marketing"
cboRefinery.AddItem "Pascagoula"
cboRefinery.AddItem "Richmond"
cboRefinery.AddItem "Salt Lake"
arEmailFrom(1) = "[email protected]"
arEmailFrom(2) = "[email protected]"
arEmailFrom(3) = "[email protected]"
arEmailFrom(4) = "[email protected]"
arEmailFrom(5) = "[email protected]"
EmailFromCount = 5
arEmailTemplateFile(1) = "temp01.html"
arEmailTemplateFile(2) = "temp01.html"
arEmailTemplateFile(3) = "temp01.html"
arEmailTemplateFile(4) = "temp04.html" '3
arEmailTemplateFile(5) = "temp05.html" '4
arEmailTemplateFile(6) = "temp06.html" '5
EmailTemplateFileCount = 6
cboSenderEmail.Clear
For i = 1 To EmailFromCount
cboSenderEmail.AddItem arEmailFrom(i)
Next
cboSenderEmail.AddItem "-"
cboStatus.Clear
'cboStatus.AddItem "1-2 DAYS OVERDUE"
'cboStatus.AddItem "16+ DAYS EARLY"
'cboStatus.AddItem "31+ DAYS OVERDUE"
cboStatus.AddItem "FOR ACK"
cboStatus.AddItem "FOLLOW-UP"
cboStatus.AddItem "OVERDUE"
cmdNext1.Enabled = False
MPWizard.Top = -18
Me.Height = 220
selTab 1
Me.Show vbModal
End Sub
Private Sub cboVendorCodeCol_Change()
VendorCol = cboVendorCodeCol.ListIndex
End Sub
Private Sub cboRefinery_Change()
End Sub
Private Sub cboSenderEmail_Change()
If Trim(cboSenderEmail.Text) = "" Then
Else
cmdFinish.Enabled = True
End If
End Sub
Private Sub cboStatusCol_Change()
StatusCol = cboStatusCol.ListIndex + 1
End Sub
Private Sub cboStatus_Change()
selStatus = cboStatus.Text
cmdNext1.Enabled = True
End Sub
Private Sub cboWorkSheets_Change()
txtFirstRow.Text = 2
txtFirstColumn.Text = 1
Set SelWs = ActiveWorkbook.Worksheets(cboWorkSheets.Text)
getWSDefinitions
End Sub
Public Sub getWSDefinitions()
On Error Resume Next
cboStatusCol.Clear
x = 1
ExitLoop = False
Do Until ExitLoop = True
cboStatusCol.AddItem SelWs.Cells(1, x)
'cboVendorCodeCol.AddItem SelWs.Cells(1, x) ', i
If Trim(SelWs.Cells(1, x)) = "" Then
LastCol = x
ExitLoop = True
Exit Do
End If
x = x + 1
Loop
x = 2
ExitLoop = False
Do Until ExitLoop = True
If Trim(SelWs.Cells(x, 1)) = "" Then
LastRow = x
ExitLoop = True
Exit Do
End If
x = x + 1
Loop
txtLastColumn.Text = LastCol
txtLastRow.Text = LastRow
RowCount = LastRow - DefFirstRow
lblNoRows.Caption = "No Of Rows to Process: " & CInt(txtLastRow.Text) - CInt(txtFirstRow.Text)
cboStatusCol.ListIndex = 26
If Err.Number <> 0 Then
MsgBox "Error Processing selected Worksheet", vbExclamation
Err.Clear
cmdNext1.Enabled = False
End If
End Sub
Private Sub cmdBack1_Click()
selTab 1
End Sub
Private Sub cmdBack2_Click()
selTab 2
End Sub
Private Sub cmdBack3_Click()
selTab 3
End Sub
Private Sub cmdClose1_Click()
Unload Me
End Sub
Private Sub cmdClose2_Click()
Unload Me
End Sub
Private Sub cmdClose3_Click()
Unload Me
End Sub
Private Sub cmdClose4_Click()
Unload Me
End Sub
Private Sub cmdFinish_Click()
Unload Me
End Sub
Private Sub cmdGenrateEmailAttachments_Click()
GenerateEmailAttachments
End Sub
Private Sub cmdNext1_Click()
If cboRefinery.Text = "" Then
MsgBox "Please select refinery", vbExclamation, "MailMerge"
Exit Sub
End If
selTab 2
StartAnalysis
End Sub
Private Sub StartAnalysis()
Dim curVendorCode As String
'On Error Resume Next
NoOfEntries = 0
HasErrors = False
curPO = ""
lblErrors.Visible = False
If rsList.RecordCount > 0 Then
rsList.MoveFirst
For i = 1 To rsList.RecordCount
rsList.Delete
rsList.MoveNext
Next
End If
For i = DefFirstRow To RowCount + 1
curStatus = SelWs.Cells(i, StatusCol)
If UCase(Trim(selStatus)) = UCase(Trim(curStatus)) Then
NoOfEntries = NoOfEntries + 1
curPO = Trim(SelWs.Cells(i, 1))
rsList.AddNew
rsList.Fields("PONo") = curPO & ""
rsList.Fields("Release") = getCell(i, 3)
rsList.Fields("Line") = getCell(i, 4)
rsList.Fields("Agent") = getCell(i, 7)
rsList.Fields("VendorCode") = getCell(i, 6)
rsList.Fields("VendorName") = getCell(i, 5)
tempEmail = getCell(i, 30)
If tempEmail = "" Then
rsList.Fields("VendorEmail") = "ERROR"
HasErrors = True
Else
rsList.Fields("VendorEmail") = tempEmail
End If
'MCLZ 13-Mar-2012: Add VendorCC
tempEmail = getCell(i, 35)
If tempEmail = "" Then
rsList.Fields("VendorCC") = "ERROR"
HasErrors = True
Else
rsList.Fields("VendorCC") = tempEmail
End If
rsList.Fields("CatalogID") = getCell(i, 8)
rsList.Fields("CatalogName") = getCell(i, 9)
rsList.Fields("POIssueDate") = getCell(i, 12)
rsList.Fields("QtyOrdered") = getCell(i, 11)
rsList.Fields("QtyRecd") = getCell(i, 15) '<---- ?? Veirfy with Customer
rsList.Fields("TotalPOCost") = getCell(i, 17)
rsList.Fields("NeedOrEstDelDate") = getCell(i, 22)
rsList.Fields("POStatus") = getCell(i, 27)
tempContactPerson = getCell(i, 29)
If tempContactPerson = "" Then
rsList.Fields("ContactPerson") = "ERROR"
HasErrors = True
Else
rsList.Fields("ContactPerson") = tempContactPerson
End If
tempTraceNo = getCell(i, 32)
If tempTraceNo = "" Then
rsList.Fields("TraceNo") = "ERROR"
HasErrors = True
Else
rsList.Fields("TraceNo") = tempTraceNo
rsList.Fields("VendorTraceNo") = getCell(i, 6) & "_" & tempTraceNo
End If
rsList.Fields("RefRow") = i
rsList.Update
End If
Next
If rsList.RecordCount > 0 Then
lblRecNo.Caption = "No. Of Entires Found: " & rsList.RecordCount
rsList.Sort = "VendorTraceNo ASC, PONo ASC, Release ASC, Line ASC"
'rsList.Sort = "VendorCode ASC, PONo ASC, Release ASC, Line ASC"
rsList.MoveFirst
Dim mitem As ListItem
lvwPOs.ListItems.Clear
For i = 1 To rsList.RecordCount
'Set mitem = lvwPOs.ListItems.Add(, , rsList.Fields("PONo"))
Set mitem = lvwPOs.ListItems.Add(, , rsList.Fields("RefRow"))
For j = 1 To rsList.Fields.Count - 1
If rsList.Fields("VendorEmail") = "ERROR" Then
mitem.ForeColor = vbRed
End If
If rsList.Fields("TraceNo") = "ERROR" Then
mitem.ForeColor = vbRed
End If
If rsList.Fields("ContactPerson") = "ERROR" Then
mitem.ForeColor = vbRed
End If
mitem.SubItems(j) = rsList.Fields(j)
Next
rsList.MoveNext
Next
selTab 2
End If
If HasErrors Then
cmdNext2.Enabled = False
lblErrors.Visible = True
Else
cmdNext2.Enabled = True
End If
'cmdBack1 = True
End Sub
Function getCell(pRowIndex, pColIndex)
On Error Resume Next
temp = Trim(SelWs.Cells(pRowIndex, pColIndex)) & ""
If Err.Number = 0 Then
Else
temp = ""
Err.Clear
End If
getCell = temp
End Function
Private Sub selTab(pTabIndex)
MPWizard.Value = 1
MPWizard.Value = pTabIndex - 1
MPWizard.Top = -18
'lvwPOs.Top = 15
'txtLog.Top = 123
'lvwVendors.Top = 54
'Me.Repaint
End Sub
Private Sub cmdNext2_Click()
selTab 3
End Sub
Private Sub cmdNext3_Click()
selTab 4
End Sub
Private Sub cmdNext4_Click()
End Sub
Function ReadTextFile(pTemplateFile As String)
Dim TemplateFile, TemplateContent, TemplateLine As String
Open pTemplateFile For Input As #1
Do While Not EOF(1)
Input #1, TemplateLine
TemplateContent = TemplateContent & TemplateLine
Loop
Close #1
ReadTextFile = TemplateContent
End Function
Function ReadTextFiletoArray(pTemplateFile As String)
Dim TemplateFile, TemplateContent, TemplateLine As String
Open pTemplateFile For Input As #1
SubjectCount = 1
Do While Not EOF(1)
Input #1, TemplateLine
arSubjects(SubjectCount) = TemplateLine
SubjectCount = SubjectCount + 1
Loop
Close #1
End Function
Public Function FolderExists(strFolder As String) As Boolean
'Check if folder exists
FolderExists = (Dir$(strFolder, vbDirectory) <> vbNullString)
End Function
Public Function FileExists(strFile As String) As Boolean
FileExists = (Dir$(strFile, vbNormal) <> vbNullString)
End Function
Private Sub UpdateTxtLog(pText As String)
txtLog.Text = txtLog.Text & pText & Chr(13) & Chr(10)
End Sub
Private Sub cmdSendEmailsNow_Click()
On Error Resume Next
Dim EmailText As String
NoOfEmailsSent = 0
If cboSenderEmail.Text = "" Then
MsgBox "Please select Sender Email", vbExclamation, "MailMerge"
Exit Sub
End If
For i = 1 To lvwVendors.ListItems.Count
EmailText = ReadTextFile(ThisWorkbook.Path & "\templates\" & lvwVendors.ListItems(i).SubItems(4))
EmailText = Replace(EmailText, "[vendor_name]", lvwVendors.ListItems(i).SubItems(2))
EmailText = Replace(EmailText, "[contact_person]", lvwVendors.ListItems(i).SubItems(6))
'MCLZ 13-Mar-2012: Add VendorCC
SendEmail lvwVendors.ListItems(i).SubItems(3), _
cboSenderEmail.Text, _
lvwVendors.ListItems(i).SubItems(5), _
EmailText, _
NewFolderPath & "\" & lvwVendors.ListItems(i).SubItems(7), _
LogFile, lvwVendors.ListItems(i).SubItems(8)
lvwVendors.ListItems(i).Text = "Sent"
'Me.Repaint
'NoOfEmailsSent = NoOfEmailsSent + 1
Next
MsgBox NoOfEmailsSent & " emails sent", vbInformation, "Mail Merge"
End Sub
Private Sub DeleteExist(pFilename As String)
If FolderExists(pFilename) Then
Kill pFilename
End If
End Sub
Sub GenerateEmailAttachments()
'On Error Resume Next
' rsList.MoveFirst
' For i = 1 To rsList.RecordCount
' Debug.Print rsList.Fields("RefRow")
' rsList.MoveNext
' Next
Dim EmailText, strVendorPOs, tempSubject As String
Dim mitem As ListItem
NewFolderPath = ThisWorkbook.Path & "\email\" & Format(MonthName(Month(Date), True), "00") & Format(Day(Date), "00") & Format(Year(Date), "00") & "_" & cboStatus.Text
If Not FolderExists(NewFolderPath) Then MkDir NewFolderPath
ChDir NewFolderPath
Dim newwb As Workbook
Dim newws As Worksheet
strVendorPOs = ""
curVendorTrace = ""
UniqueVendorTraceCount = 0
rsList.MoveFirst
strVendorCodes = ""
'strVendorEmailAddresses = ""
txtLog.Text = ""
UpdateTxtLog "Processing " & rsList.RecordCount & " PO's..."
Me.Repaint
strPONos = ""
'rsList.Sort "VendorTraceNo ASC"
For i = 1 To rsList.RecordCount
If Trim(curVendorTrace) <> Trim(rsList.Fields("VendorTraceNo")) Then
If UniqueVendorTraceCount = 0 Then
ElseIf UniqueVendorTraceCount > 0 Then
DeleteExist NewFolderPath & "\" & curVendorTrace & ".xls"
newwb.SaveAs NewFolderPath & "\" & curVendorTrace & ".xls"
newwb.Close
Set newwb = Nothing
UpdateTxtLog "Generating " & NewFolderPath & "\" & curVendorTrace & ".xls ..."
If Err.Number = 0 Then
UpdateTxtLog "OK"
UpdateTxtLog "--------------------------------------------"
UpdateTxtLog ""
Me.Repaint
Else
UpdateTxtLog Err.Number & " " & Err.Description
UpdateTxtLog "--------------------------------------------"
UpdateTxtLog ""
Me.Repaint
Err.Clear
End If
If i = rsList.RecordCount Then
Else
strPONos = ""
End If
Else
End If
'If Trim(strPONos) = "" Then
'Else
'End If
Set newwb = Workbooks.Open(ThisWorkbook.Path & "\templates\temp01.xls")
newwb.Worksheets(1).Cells(1, 1) = rsList.Fields("VendorName")
curVendorTrace = rsList.Fields("VendorTraceNo")
Set mitem = lvwVendors.ListItems.Add(, , "")
mitem.SubItems(1) = curVendorTrace
mitem.SubItems(2) = rsList.Fields("VendorName")
mitem.SubItems(3) = rsList.Fields("VendorEmail")
mitem.SubItems(4) = "temp_" & Replace(cboStatus.Text, " ", "") & "_" & rsList.Fields("TraceNo") & ".html"
'mitem.SubItems(5) = tempSubject
mitem.SubItems(6) = rsList.Fields("ContactPerson")
mitem.SubItems(7) = curVendorTrace & ".xls"
'MCLZ 13-Mar-2012: Add VendorCC
mitem.SubItems(8) = rsList.Fields("VendorCC")
UniqueVendorTraceCount = UniqueVendorTraceCount + 1
x = 3
End If
With newwb.Worksheets(1)
.Cells(x, 1) = rsList.Fields("PONo").Value ' PONo
.Cells(x, 2) = rsList.Fields("Release").Value ' Release No
.Cells(x, 3) = rsList.Fields("Line").Value ' Line No
.Cells(x, 4) = rsList.Fields("Agent").Value ' Agent
.Cells(x, 5) = rsList.Fields("CatalogID").Value ' Catalog ID
.Cells(x, 6) = rsList.Fields("CatalogName").Value ' Catalog Description
.Cells(x, 7) = rsList.Fields("POIssueDate").Value ' PO Issue Date
.Cells(x, 8) = rsList.Fields("QtyOrdered").Value ' Qty Ordered
.Cells(x, 9) = rsList.Fields("QtyRecd").Value ' Qty Recieved
.Cells(x, 10) = rsList.Fields("TotalPOCost").Value ' Total PO Cost
.Cells(x, 11) = rsList.Fields("NeedOrEstDelDate").Value ' Estimated Delivery Date
.Cells(x, 12) = "" ' Comments
End With
x = x + 1
rsList.MoveNext
Next
If UniqueVendorTraceCount > 0 Then
'rsList.MoveLast
'If Right(strPONos, 1) = "," Then strPONos = Left(strPONos, Len(strPONos) - 1)
'strPONos = Replace(strPONos, " Rel []", "")
'mitem.SubItems(5) = strPONos
DeleteExist NewFolderPath & "\" & curVendorTrace & ".xls"
UpdateTxtLog "Generating " & NewFolderPath & "\" & curVendorTrace & ".xls ..."
newwb.SaveAs NewFolderPath & "\" & curVendorTrace & ".xls"
newwb.Close
Set newwb = Nothing
If Err.Number = 0 Then
UpdateTxtLog "OK"
UpdateTxtLog "--------------------------------------------"
UpdateTxtLog ""
Me.Repaint
Else
UpdateTxtLog "ERROR: " & Err.Number & " " & Err.Description
UpdateTxtLog "--------------------------------------------"
UpdateTxtLog ""
Me.Repaint
Err.Clear
End If
strPONos = ""
For i = 1 To lvwVendors.ListItems.Count
'strPONos = ""
'lvwVendors.ListItems(i).SubItems (1)
rsList.MoveFirst
For j = 1 To rsList.RecordCount
If rsList.Fields("VendorTraceNo") = Trim(lvwVendors.ListItems(i).SubItems(1)) Then
'strPONos = strPONos & "PO " & rsList.Fields("PONo") & " Rel [" & rs.Fields("Release") & "], "
If InStr(Trim(strPONos), "PO " & Trim(rsList.Fields("PONo")) & " Rel [" & rsList.Fields("Release") & "]") > 0 Then
Else
strPONos = strPONos & "PO " & Trim(rsList.Fields("PONo")) & " Rel [" & rsList.Fields("Release") & "], "
End If
End If
rsList.MoveNext
Next
strPONos = Trim(strPONos)
If Right(strPONos, 1) = "," Then strPONos = Left(strPONos, Len(strPONos) - 1)
strPONos = Replace(strPONos, " Rel []", "")
tempSubject = getSubject(Right(Trim(lvwVendors.ListItems(i).SubItems(1)), 1))
tempSubject = Replace(tempSubject, "[vendor_name]", Trim(lvwVendors.ListItems(i).SubItems(2)))
tempSubject = Replace(tempSubject, "[po_list]", strPONos)
lvwVendors.ListItems(i).SubItems(5) = tempSubject
strPONos = ""
Next
End If
UpdateTxtLog ""
UpdateTxtLog ""
UpdateTxtLog "Successfully Generated " & UniqueVendorTraceCount & " vendor email(s)."
temp = Now
temp = Replace(temp, "/", "-")
temp = Replace(temp, ":", "-")
temp = Replace(temp, " ", "-")
temp = temp & ".log"
LogFile = NewFolderPath & "\" & temp
CreateLog (LogFile)
LogWrite LogFile, Me.txtLog.Text
'SaveLog
'Me.Repaint
cmdNext3.Enabled = True
End Sub
Function getSubject(pTraceNo As String) As String
For i = 1 To SubjectCount
arfld = Split(arSubjects(i), "|")
If LCase(Trim(arfld(0))) = LCase(Trim(cboRefinery.Text)) Then
If LCase(Trim(arfld(1))) = LCase(Trim(cboStatus.Text)) Then
If LCase(Trim(arfld(2))) = LCase(Trim(pTraceNo)) Then
getSubject = arfld(3)
Exit Function
End If
End If
End If
Next
End Function
Private Sub Frame4_Click()
End Sub
Private Sub Label18_Click()
End Sub
Private Sub MPWizard_Change()
End Sub
Private Sub UserForm_Click()
End Sub