Excel 输入日期后,宏将运行

Excel 输入日期后,宏将运行,excel,vba,date,email,Excel,Vba,Date,Email,如何添加在输入日期时自动运行的代码。如果代码包含其他单元格-是否需要先填充它们。我们的想法是输入今天的日期并发送电子邮件。代码电子邮件工作,但我需要的代码自动运行 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If IsDate(Range("A1").Value) Then 'MsgBox "Plase enter a date in A1" 'response = MsgBox(msg, vbYesN

如何添加在输入日期时自动运行的代码。如果代码包含其他单元格-是否需要先填充它们。我们的想法是输入今天的日期并发送电子邮件。代码电子邮件工作,但我需要的代码自动运行

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If IsDate(Range("A1").Value) Then
    'MsgBox "Plase enter a date in A1"
    'response = MsgBox(msg, vbYesNo)
    'If response = vbYes Then
    email
Else
End If
'End If
End Sub


Sub email()

Dim r       As Range
Dim cell    As Range

Set r = Range("A1:S20")

For Each cell In r

    If cell.Value = Date 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 = Cells(cell.Row, "C").Value
        Email_Send_From = "Jean@test.com"
        Email_Send_To = "Joe@test.com"
        Email_Cc = ""
        Email_Bcc = ""
        Email_Body = "Hi " & Cells(cell.Row, "c").Value _
                     & vbNewLine & vbNewLine & _
                     Cells(cell.Row, "D").Value & _
                     " has been submited"

        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
            .cc = Email_Cc
            .BCC = Email_Bcc
            .Body = Email_Body
            .send
        End With

    End If

Next


Exit Sub

debugs:
If Err.Description <> "" Then MsgBox Err.Description
End Sub
Private子工作表\u selection更改(ByVal目标作为范围)
如果是IsDate(范围(“A1”).值),则
“MsgBox”请在A1中输入日期
'response=MsgBox(msg,vbYesNo)
'如果响应=vbYes,则
电子邮件
其他的
如果结束
"完"
端接头
子电子邮件()
调光范围
暗淡单元格作为范围
设置r=范围(“A1:S20”)
对于r中的每个单元格
如果cell.Value=日期,则
Dim Email_主题、Email_Send_From、Email_Send_To、_
电子邮件抄送、电子邮件密件抄送、电子邮件正文为字符串
Dim Mail_对象,Mail_单个作为变量
电子邮件主题=单元格(cell.Row,“C”)。值
电子邮件\u发送\u发件人=”Jean@test.com"
电子邮件发送至“Joe@test.com"
电子邮件_Cc=“”
电子邮件_Bcc=“”
Email_Body=“Hi”&单元格(cell.Row,“c”).值_
&vbNewLine&vbNewLine&_
单元格(cell.Row,“D”).值和_
“已提交”
关于错误转到调试
设置Mail\u Object=CreateObject(“Outlook.Application”)
设置Mail\u Single=Mail\u Object.CreateItem(0)
单程邮寄
.Subject=电子邮件主题
.To=发送电子邮件至
.cc=电子邮件\u cc
.BCC=电子邮件\u BCC
.Body=电子邮件\正文
.发送
以
如果结束
下一个
出口接头
调试:
如果错误描述为“”,则MsgBox错误描述为“”
端接头

我相信这就是你想要的。更新
A1
中的值时,它将首先验证条目是否为日期。如果输入的日期无效,您将收到代码中的第一个
MsgBox

如果输入是有效日期,则会询问用户是否要发送电子邮件。如果选择
No
,宏将结束。如果他们选择了
Yes
,您的电子邮件子系统将开始执行

Private Sub Worksheet_Change(ByVal Target As Range)

Dim Response As String

If Not IsDate(Range("A1").Value) Then
    MsgBox "Plase enter a valid date in A1"
Else
    Response = MsgBox("Do you want to send email?", vbYesNo)
    If Response = vbYes Then Call Email
End If

End Sub
如果您不希望用户必须选择
Yes
No
来发送电子邮件,并且希望在
A1
中的条目被验证为日期后立即发送,则将您的If语句更改为:

If Not IsDate(Range("A1").Value) Then
    MsgBox "Plase enter a valid date in A1"
Else
    Call Email
End If

旁注
您还应该将其更新为仅在某个范围(或者在本例中可能是单个单元格)更改时执行。否则,宏将在任何单元格更改时激发。相反,请确定触发此宏的范围,然后在更改的单元格与预先确定的范围重叠(或相交)时调用宏

多谢各位。我会申请并回复。我提出了这个问题,正在使用第二个解决方案,效果很好。