【问题标题】:IF AND Statement in Excel VBAExcel VBA中的IF AND语句
【发布时间】:2018-12-30 23:35:48
【问题描述】:

我正在尝试自动化 Outlook 电子邮件,并拥有当前代码,但我还需要它具有“AF”列小于或等于 7 的条件: 电子邮件地址在 H 列中,天数在 AF 列中 - 这目前有效,但由于某种原因会创建所有电子邮件而不是过滤 AF

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

我不确定这是否与我调用列的方式或编写方式有关。我还认为带有电子邮件“H”的行将始终有一个电子邮件地址,它永远不会为空,因此 if 语句甚至可能仅关于 if AF

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

我也试过了:

'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

但这也不起作用。

【问题讨论】:

  • 只是为了澄清?第 25 列将是“Y”列而不是 AF 列,除非您有指示从 H 列开始的“filterRange”
  • @Davesexcel 我编辑以包含整个代码

标签: excel vba if-statement outlook automation


【解决方案1】:

正如 Dave 所指出的,您的查询令人困惑。您声明您正在测试 AF,但您正在查看列 25。查看其余代码,您的表原点是 A1,因此您希望为 AF 测试列 32

以下将测试列 A 是否满足您的原始测试(我猜是电子邮件地址)以及列 AF 是否包含小于或等于的数字7.

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

请记住,空单元格的“值”等于零,因此这也符合您的条件。如果你想跳过这些,那么:

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

另外,cws.Cells(rnum, "AF") 在这种情况下是完全可以接受的,但确实会使列的变化或循环出现问题。

如果您仍然遇到问题,请在 IF 语句之前添加以下内容以查看发生了什么:

Debug.Print "Value in " & cws.Cells(rnum, 32).Address & " is: [" & cws.Cells(rnum, 32) & "]"

【讨论】:

  • 这仍然不起作用,我有一个有 4 行的示例表,只有 1 行在 AF 中的值为
  • 其他 3 个 AF 细胞中有什么?
  • 为了测试,我有 7、15、6 和 12-所以它应该只创建 2 封电子邮件
  • 好吧,除了奇怪的格式之外,我唯一能想到的就是这些值是文本。我会调整我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 2015-11-03
相关资源
最近更新 更多