0

I am trying to automate Outlook emails, and have the current code, but I need it to also have the condition that column "AF" is less than or equal to 7: Email addresses are in column H and the amount of days is in column AF - this currently works but creates all emails rather than filtering AF for some reason

Sub Send_Second_CDQR_Notification()
Dim OutApp As Object
Dim OutMail As Object
Dim rng As Range
Dim Ash As Worksheet
Dim Cws As Worksheet
Dim Rcount As Long
Dim Rnum As Long
Dim FilterRange As Range
Dim FieldNum As Integer
Dim NewWB As Workbook
Dim TempFilePath As String
Dim TempFileName As String
Dim FileExtStr As String
Dim FileFormatNum As Long

On Error GoTo cleanup
Set OutApp = CreateObject("Outlook.Application")

With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With


' DECLARE VARIABLES
Dim LR, eError, AppName, fName, lName, FromMail, CCMail, dDate

'Set filter sheet, you can also use Sheets("MySheet")
Set Ash = ActiveSheet

'Set filter range and filter column (column with e-mail addresses)
Set FilterRange = Ash.Range("A1:AF" & Ash.Rows.Count)
FieldNum = 8    'Filter column = H because the filter range start in column A

'Add a worksheet for the unique list and copy the unique list in A1
Set Cws = Worksheets.Add
FilterRange.Columns(FieldNum).AdvancedFilter _
        Action:=xlFilterCopy, _
        CopyToRange:=Cws.Range("A1"), _
        CriteriaRange:="", Unique:=True


'Count of the unique values + the header cell
Rcount = Application.WorksheetFunction.CountA(Cws.Columns(1))

'If there are unique values start the loop
If Rcount >= 2 Then
    For Rnum = 2 To Rcount

        'If the unique value is a mail address create a mail
        If Cws.Cells(Rnum, 1).Value Like "?*@?*.?*" And_
           Cws.Cells(Rnum, 32) <= 7 Then

            'Filter the FilterRange on the FieldNum column
            FilterRange.AutoFilter Field:=FieldNum, _
                                   Criteria1:=Cws.Cells(Rnum, 1).Value

            'Copy the visible data in a new workbook
            With Ash.AutoFilter.Range
                On Error Resume Next
                Set rng = .SpecialCells(xlCellTypeVisible)
                On Error GoTo 0
            End With

            Set NewWB = Workbooks.Add(xlWBATWorksheet)

            rng.Copy
            With NewWB.Sheets(1)
                .Cells(1).PasteSpecial Paste:=8
                .Cells(1).PasteSpecial Paste:=xlPasteValues
                .Cells(1).PasteSpecial Paste:=xlPasteFormats
                .Cells(1).Select
                Application.CutCopyMode = False
            End With

            'Create a file name
            TempFilePath = Environ$("temp") & "\"
            TempFileName = "Your data of " & Ash.Parent.Name _
                         & " " & Format(Now, "dd-mmm-yy h-mm-ss")

            If Val(Application.Version) < 12 Then
                'You use Excel 97-2003
                FileExtStr = ".xls": FileFormatNum = -4143
            Else
                'You use Excel 2007-2016
                FileExtStr = ".xlsx": FileFormatNum = 51
            End If

            'Save, Mail, Close and Delete the file
            Set OutMail = OutApp.CreateItem(0)

            fName = Range("D" & 2).Value
            lName = Range("E" & 2).Value
            AppName = Range("C" & 2).Value
            eError = Range("A" & 2).Value
            dDate = Format(Now(), "d mmmm yyyy")

            With NewWB
                .SaveAs TempFilePath & TempFileName _
                      & FileExtStr, FileFormat:=FileFormatNum
                On Error Resume Next
                With OutMail
                    .To = Cws.Cells(Rnum, 1).Value
                    .Cc = "email"
                    .SentOnBehalfOfName = FromMail
                    .Subject = "2nd Notification"
                    .Attachments.Add NewWB.FullName

                    .Display  'Or use Send
                End With
                On Error GoTo 0
                .Close savechanges:=False
            End With

            Set OutMail = Nothing
            Kill TempFilePath & TempFileName & FileExtStr
        End If
        'Close AutoFilter
        Ash.AutoFilterMode = False

    Next Rnum
End If
cleanup:
Set OutApp = Nothing
Application.DisplayAlerts = False
Cws.Delete
Application.DisplayAlerts = True

With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With
End Sub

I'm not sure if this an issue with the way I am calling the columns or the way it is written. I also considered that the row with emails "H" will always have an email address, it will never be empty, so the if statement could even be ONLY about if AF<=7, but I tried that and it still creates emails for everyone in the sheet.

If Cws.Cells(Rnum, 32) <= 7 Then

I have also tried:

'If the unique value is a mail address create a mail
        If Cws.Cells(Rnum, 1).Value Like "?*@?*.?*" And _
        Cws.Cells(Rnum, "AF") <= "7" Then

but this does not work either.

2
  • 3
    Just to clarify? Column 25 would be column "Y" not column AF, unless you have something that indicates the "filterRange" starting at column H Commented Jul 23, 2018 at 13:40
  • @Davesexcel I edited to include the entire code Commented Jul 23, 2018 at 14:03

1 Answer 1

1

As Dave points out, your query is confusing. You state you're testing AF, but you're looking at column 25. Looking at the rest of the code, your table origin is A1, so you want to be testing column 32 for AF.

The following will test if column A meets your original test (e-mail address I guess) and if column AF contains a number that is less than or equal to 7.

If cws.Cells(rnum, 1).Value Like "?*@?*.?*" And _
    Val(cws.Cells(rnum, 32) <= 7 Then

Keep in mind, the 'value' of an empty cell is equated to zero, so this will also match your criteria. If you want to skip those then:

If cws.Cells(rnum, 1).Value Like "?*@?*.?*" And _
    Val(cws.Cells(rnum, 32).value) <= 7 and cws.Cells(rnum, 32)<>"" Then

Also, cws.Cells(rnum, "AF") is a perfectly acceptable in this instance, but does make varying or looping through columns problematic.

If you're still having issues, put the following in before the IF statement to see what's happening:

Debug.Print "Value in " & cws.Cells(rnum, 32).Address & " is: [" & cws.Cells(rnum, 32) & "]"
Sign up to request clarification or add additional context in comments.

4 Comments

This still does not work, I have a sample table with 4 rows and only 1 has a value of <= 7 in AF and all 4 emails still are created
What is in the other 3 AF cells?
for testing, I have 7, 15, 6 and 12- so it should only be creating 2 emails
Okay, the only thing I can think of here, outside of weird formatting is that the values are text. I'll tweak my answer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.