Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如果今天发送电子邮件';s日期在到期日的四天内_Vba_Excel - Fatal编程技术网

Vba 如果今天发送电子邮件';s日期在到期日的四天内

Vba 如果今天发送电子邮件';s日期在到期日的四天内,vba,excel,Vba,Excel,我肯定会被认为是vba初学者,我正试图在我的项目管理电子表格中构建一个自动电子邮件提醒,当今天的日期在到期日的4天之内时。但我使用的代码不断返回运行时错误13:类型不匹配 我已经搜索了整个互联网的神圣大厅,寻找这个解决方案,但似乎没有任何东西与我的具体问题相匹配,或者我只是在将其他帖子中的原则应用于这个特定代码时遇到了问题 这是代码 Option Explicit Sub email() Dim r As Range Dim cell As Range Set r

我肯定会被认为是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
选项显式
子电子邮件()
调光范围
暗淡单元格作为范围
设置r=范围(“D4:D154”)
对于r中的每个单元格
如果r.值=(日期+0),则
Dim Email_主题、Email_Send_From、Email_Send_To、_
电子邮件抄送、电子邮件密件抄送、电子邮件正文为字符串
Dim Mail_对象,Mail_单个作为变量
Email_Subject=ActiveCell(0,2)&ActiveCell(0,-2)&“到期”
电子邮件\u发送\u发件人=”me@domain.com"
电子邮件发送到=单元格(1,11)
Email_Body=“这是一个自动提醒,用于更新BSA项目经理关于您项目的信息。”
关于错误转到调试
设置Mail\u Object=CreateObject(“Outlook.Application”)
设置Mail\u Single=Mail\u Object.CreateItem(0)
单程邮寄
.Subject=电子邮件主题
.To=发送电子邮件至
.Body=电子邮件\正文
.发送
以
如果结束
下一个

If r.value上返回的错误正在清理并稍微简化此代码-这里有几点需要考虑:

  • 当一个接一个地声明变量时,您需要为声明的每个变量指定它们的类型:
    Dim Email\u Subject As String,Dim Email\u Send\u From As String,等等。
    -否则,只有最后一个变量声明为
    String
    ,其余变量声明为
    Variant
    s
  • 在引用
    范围时,最好明确声明您使用的
    工作簿
    工作表
    ——因此指定哪个工作表
    范围(“D4:D154”)
    处于启用状态
  • 您的类型不匹配错误是因为尝试将
    r.Value
    (日期+4)
    进行比较,而不是将
    单元格.Value
    进行比较-您毕竟是在每个
    单元格中循环
  • 不要在循环中使用
    ActiveCell
    ,只需使用
    cell
    然后使用
    Offset
    引用右侧或左侧的列即可
因此,修改后的代码可能如下所示:(未测试)

Sub-email()
变暗r作为范围,单元格作为范围
将ws设置为工作表
将邮件对象设置为对象,将邮件对象设置为单个对象
Dim Email_Subject As String,Email_Send_From As String,Email_Send_To As String_
电子邮件抄送为字符串,电子邮件抄送为字符串,电子邮件正文为字符串
将ws=ThisWorkbook.Worksheets(“Sheet1”)更改为工作表名称
设置r=ws.范围(“D4:D154”)
设置Mail\u Object=CreateObject(“Outlook.Application”)
对于r中的每个单元格
如果cell.Value=(日期),则
Email_Subject=cell.Offset(,1)。Value&cell.Offset(,-1)。Value&“到期”
电子邮件\u发送\u发件人=”me@domain.com"
Email\u Send\u To=ws.Cells(1,11).Value
Email_Body=“这是一个自动提醒,用于更新BSA项目经理关于您项目的信息。”
关于错误转到调试
设置Mail\u Single=Mail\u Object.CreateItem(0)
单程邮寄
.Subject=电子邮件主题
.To=发送电子邮件至
.Body=电子邮件\正文
.发送
以
如果结束
下一个细胞
'... 更多代码
端接头

r
中循环遍历每个
单元格
——然后检查
r.Value
…-这应该是
如果cell.Value…
也-当
Dim
-ing时,您需要指定变量的类型,即
Dim Email\u Subject As String,Email\u Send\u From As String
。如果没有指定这些变量,那么这些变量实际上是
Variant
sAlso-是否有任何理由在循环中使用
ActiveCell
?您的意思是使用
单元格
?您还可以将
Set Mail\u Object=CreateObject…
移动到每个
循环的
之前-您只需
Set Mail\u Object
先生,一旦您是绅士和学者。非常感谢。我确实尝试过使用cell.Value,但没有用,但我认为我在那个特定的迭代过程中犯了其他错误。至于
ActiveCell
,我之所以选择它,是因为我想要该行上特定日期旁边的单元格中的信息。当我将其更改为
cell
时,我的电子邮件会发送,但主题行仅包含“到期”字样,而没有从相关日期旁边的单元格中提取。
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