Excel VBAvalidation自动电子邮件状态

到目前为止,我一直在环视networking。 我有一个带有关联VBA代码的Excel电子表格,在每天的某个时间,将工作簿的内容通过电子邮件发送给我工作的公司的其他人员。

这段代码是无限循环的,很lessclosures。 我们把它安装在一台计算机上,整天这样做来计算和更新我们内部网上的各种东西。 有几个工作簿的代码每天在不同时间使用延时function访问。

问题是,有时代码运行速度有点快,最终发送两个相同的工作簿,而不是一个电子邮件。 请参阅下面的代码:

Private Declare Sub Sleep Lib "kernal32" (ByVal dwMilliseconds As Long) Private Sub Workbook_Open() Do While 1 Start = Timer If Hour(Now())=13 & Minute(Now())>=45 Then s = "path to file" Application.DisplayAlerts = False Workbooks.Open Filename:=s ActiveWorkbook.SendMail Recipients:="someone@someone.com" ActiveWindow.Close End If delay = Int(600 - (Timer - Start)) If delay>0 Then delay = delay * 1000 Sleep delay End If Loop End Sub 

正如我所说的,还有更多的工作簿被激活并对其进行了计算,但是并不需要将代码放在一起。 这一切都跟上面几乎相同的格式。

我想如果我在循环中使用睡眠设置,我可以只发一次电子邮件,但这将花费太多时间。

我正在考虑使用简单的if语句来检查是否今天发送了一封电子邮件(使用date?),如果是这样,只需closures活动窗口,然后发送电子邮件。 这将确保每个工作簿每天只发送一封电子邮件。 我唯一的麻烦是如何编码确切…

关于我们使用的SendMail插件的文档,我没有在网上find。 我所尝试的一切都出现了一个错误,我不知道如何解决这个问题。 我尝试过的一个例子是:

 If SendMail = False Then "send the email" Else "close" 

显然这不会工作,但这是值得的尝试。

所以如果任何人都可以给我一个这个手,这将不胜感激!

我不确定你正在使用的时间段,但我想问题是,延迟不够好,因此你得到了两次电子邮件。

这是我尝试和testing的代码。 我正在使用一种稍微不同的方法,在这种方法中,我使用Outlook作为后缀并将Excel文件作为附件发送。 这种方法的好处是你不必打开工作簿

testing条件

 'Based on your comment, Testing for 4 different workbooks 'for 4 diff time intervals 'Time interval 1 : 11:30 PM - 11:35PM C:\Temp\Book1.xlsx 'Time interval 2 : 11:35 PM - 11:40PM C:\Temp\Book2.xlsx 'Time interval 3 : 11:40 PM - 11:45PM C:\Temp\Book3.xlsx 'Time interval 4 : 11:45 PM - 11:50PM C:\Temp\Book4.xlsx 

逻辑

逻辑是设置Wait值,使其不会再次进入相同的循环。 如果您在IF条件中指定了开始时间和结束时间,则与您在只指定开始时间的代码中不同。

我已经评论了代码,以便您不会理解代码。 如果你这样做,只需回发。

 Private Sub Workbook_Open() Dim B1 As String, B2 As String, B3 As String, B4 As String Dim sEmail As String Dim SendEml As Boolean Dim OutApp As Object, OutMail As Object 'Testing for 4 different workbooks for 4 diff time intervals 'Time interval 1 : 11:30 PM - 11:35PM C:\Temp\Book1.xlsx 'Time interval 2 : 11:35 PM - 11:40PM C:\Temp\Book2.xlsx 'Time interval 3 : 11:40 PM - 11:45PM C:\Temp\Book3.xlsx 'Time interval 4 : 11:45 PM - 11:50PM C:\Temp\Book4.xlsx B1 = "C:\Temp\Book1.xlsx" B2 = "C:\Temp\Book2.xlsx" B3 = "C:\Temp\Book3.xlsx" B4 = "C:\Temp\Book4.xlsx" '~~> Email Address sEmail = "someone@someone.com" Do Select Case Hour(Now()) '~~> I have only one case here as I am checking for 11PM '~~> If your time slots fall under differnt hours then '~~> Create more cases accordingly Case 23 If Minute(Now()) >= 20 And Minute(Now()) < 25 Then FileToAttach = B1: SendEml = True ElseIf Minute(Now()) >= 25 And Minute(Now()) < 30 Then FileToAttach = B2: SendEml = True ElseIf Minute(Now()) >= 30 And Minute(Now()) < 35 Then FileToAttach = B3: SendEml = True ElseIf Minute(Now()) >= 35 And Minute(Now()) < 40 Then FileToAttach = B4: SendEml = True End If End Select '~~> Latebind with Outlook to send the email If SendEml = True Then Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) With OutMail .To = sEmail .Subject = "SO Example" .Body = "Hi Scott :)" .Attachments.Add FileToAttach '<~~ This is where we attach the file .Send End With SendEml = False End If '~~> I have set the wait time for 200 seconds which is about 3.3 mins '~~> Change as applicable. You have to ensure that you set this carefully '~~> So that the Do Loop doesn't run in the same time frame else you will '~~> get duplicate emails. Wait 200 Loop End Sub Private Sub Wait(ByVal nSec As Long) nSec = nSec + Timer While nSec > Timer DoEvents Wend End Sub