mailmerge macro updated

Post on 20-Apr-2015

16 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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) = "Expeditor-ES@chevron.com"

arEmailFrom(2) = "Expeditor-Mktg@chevron.com"

arEmailFrom(3) = "Expeditor-PA@chevron.com"

arEmailFrom(4) = "Expeditor-RI@chevron.com"

arEmailFrom(5) = "NAProcExpeditor@chevron.com"

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

top related