vba - 如果今天的日期在到期日的四天内,请发送电子邮件

标签 vba excel

我肯定会被视为 vba 初学者,并且我正在尝试在我的项目管理电子表格中构建一个自动电子邮件提醒,当今天的日期在截止日期的 4 天内。但我正在使用的代码不断返回运行时错误 13:类型不匹配。

我已经搜索了整个互联网的神圣大厅来寻找这个解决方案,但似乎没有什么能与我的具体问题相匹配,或者我只是在将其他帖子中的原则应用于这个特定代码时遇到了麻烦。

这是代码。

Option Explicit

Sub email()

    Dim r As Range
    Dim cell As Range

    Set r = Range("D4:D154")

    For Each cell In r

    If r.Value <= (Date + 4) And r.Value >= (Date + 0) Then

        Dim Email_Subject, Email_Send_From, Email_Send_To, _
        Email_Cc, Email_Bcc, Email_Body As String
        Dim Mail_Object, Mail_Single As Variant

        Email_Subject = ActiveCell(0, 2) & ActiveCell(0, -2) & "is due"
        Email_Send_From = "me@domain.com"
        Email_Send_To = Cells(1, 11)
        Email_Body = "This is an automated reminder to update BSA Project Manager on your project."

        On Error GoTo debugs
        Set Mail_Object = CreateObject("Outlook.Application")
        Set Mail_Single = Mail_Object.CreateItem(0)
        With Mail_Single
        .Subject = Email_Subject
        .To = Email_Send_To
        .Body = Email_Body
        .send
        End With

    End If

Next

If r.value <= (date+4) 行返回错误。我将整个代码都包含在上下文中,并且如果任何人在路过时看到我做的其他任何事情都是错误的,如果您愿意,可能会指出它。

我也尝试使用 DateDiff 并获得相同的结果。我在想也许我不应该将 Dim r 设置为 Range,或者我应该使用某种语言让 excel 知道 D 列中每个单元格中的内容是日期,以便数据类型匹配。

如果这是一个白痴问题,请原谅我。

最佳答案

稍微清理和简化这段代码 - 这里有几点需要考虑:

  • 当一个接一个地声明变量时,您需要为每个声明的变量指定它们的类型:Dim Email_Subject As String, Dim Email_Send_From As String, etc. - 否则只声明最后一个 As String其余为 Variant s。
  • 最佳实践是明确声明哪个 WorkbookWorksheet您在引用 Range 时正在使用- 所以指定哪个工作表Range("D4:D154")开启。
  • 您的 TYPE MISMATCH 错误来自尝试比较 r.Value(Date + 4) , 而不是 cell.Value - 你正在遍历每个 cell毕竟。
  • 而不是使用 ActiveCell在您的循环中,只需使用 cell然后 Offset引用右侧或左侧的列。

  • 所以你修改后的代码可能看起来像这样:(未测试)
    Sub email()
        Dim r As Range, cell As Range
        Dim ws As Worksheet
        Dim Mail_Object As Object, Mail_Single As Object
        Dim Email_Subject As String, Email_Send_From As String, Email_Send_To As String, _
            Email_Cc As String, Email_Bcc As String, Email_Body As String
    
        Set ws = ThisWorkbook.Worksheets("Sheet1") ' change to your sheet name
        Set r = ws.Range("D4:D154")
        Set Mail_Object = CreateObject("Outlook.Application")
    
        For Each cell In r
            If cell.Value <= (Date + 4) And cell.Value >= (Date) Then
    
                Email_Subject = cell.Offset(, 1).Value & cell.Offset(, -1).Value & "is due"
                Email_Send_From = "me@domain.com"
                Email_Send_To = ws.Cells(1, 11).Value
                Email_Body = "This is an automated reminder to update BSA Project Manager on your project."
    
                On Error GoTo debugs
                Set Mail_Single = Mail_Object.CreateItem(0)
    
                With Mail_Single
                    .Subject = Email_Subject
                    .To = Email_Send_To
                    .Body = Email_Body
                    .Send
                End With
    
            End If
        Next cell
        '... more code
    End Sub
    

    关于vba - 如果今天的日期在到期日的四天内,请发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51677915/

    相关文章:

    如果与数据验证一起使用,Excel 计数每次都为 0

    excel - 如何从命令行启动 Excel 宏(没有 Worksheet_Open 事件)?

    excel - 从字符串VBA的开头到结尾移动两个字符

    excel - 寻找一种使用可变范围自动填充的方法

    mysql - 删除只有一列的重复列从sql查询中的重复列中获得所有可用的所有值

    vba - 字符串中的子字符串

    Excel - 在公式中对该范围进行 vlookup 的范围的平均值

    vba - For 循环不在工作表中运行

    vba - 如何向可能重定向到登录页面的页面发出 POST 请求

    excel - 使用什么公式来检查 Excel 中的 2 列是否包含顺序不同的相同值?