尝试每30分钟运行一次宏

时间:2018-12-07 19:23:00

标签: excel vba

我已经上下搜索,但似乎找不到我的问题的答案。

我试图每30分钟运行一次宏。该工作簿可以保持打开状态,但不必保持打开状态。我确实还有其他3个excel工作簿,它们必须全天保持开放状态,因为这是对冲基金,它们使用Bloomberg API提供实时数据。我要运行的宏全天发送一封电子邮件,其中包含我们投资组合的PnL更新。自己运行宏效果很好。宏在这里:

Public Sub PnLUpdate()

Dim OutApp As Object
Dim OutMail As Object
Dim rng As Range, cell As Range, HtmlContent As String, i As Long, j As Long
Set rng = Range("A1:M300")
HtmlContent = "<table>"

For i = 1 To rng.Rows.Count + 1
    HtmlContent = HtmlContent & "<tr>"
    For j = 1 To rng.Columns.Count + 1
        HtmlContent = HtmlContent & "<td>" & Cells(i, j).Value & "</td>"
    Next
    HtmlContent = HtmlContent & "</tr>"
Next
HtmlContent = HtmlContent & "</table>"


Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next
With OutMail
    .To = "xx"
    .CC = "xx"
    .Subject = "PnL Update // " & Format(Now, "mm-dd-yy // hh:mm AM/PM")
    .HTMLBody = HtmlContent
    .Send
End With
On Error GoTo 0
Set OutMail = Nothing

End Sub

我尝试插入

Application.OnTime Now + TimeValue("00:00:30"), "PnLUpdate"

进入所说的宏。它可以正常工作,每30分钟发送一次电子邮件。问题是它会发送当时处于活动状态的工作表,而不是我需要它发送的工作表。

我尝试编写如下所示的模块:

Sub callPnLUpdate()

With Sheet10
Call .PnLUpdate
Application.OnTime Now + TimeValue("00:00:30"), "PnLUpdate"
End With
End Sub

这给了我错误“无法运行宏'worksheetname.Xlsx!PnLUpdate'。此工作簿中的宏可能不可用,或者所有宏都可能被禁用。

我尝试搜索该问题的解决方案,但是所有解决方案都说要启用我已经完成的编程访问,但也不起作用。

要明确:解决此问题的方法不必是使用我的宏。我将接受任何能够每30分钟发送一次此特定电子表格的解决方案(最好是从上午9:31开始到下午4:05结束,但这比让此自动化功能每30分钟工作一次重要)。

非常感谢您的帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

关键是要在任何WorkbookWorksheet调用中完全限定RangeCells,否则,将隐含ActiveWorkbook和{{1 }}。

例如:

  • ActiveSheet应该类似于Set rng = Range("A1:M300")。或者,如果您更喜欢使用工作表代码名称,则类似Set rng = ThisWorkbook.Sheets("PnL").Range("A1:M300")
  • 同样,Set rng = Sheet10.Range("A1:M300")应该是HtmlContent = HtmlContent & "<td>" & Cells(i, j).Value & "</td>"。否则,HtmlContent = HtmlContent & "<td>" & rng.Cells(i, j).Value & "</td>"是指活动工作表上的单元格。

答案 1 :(得分:0)

我不知道这是否可以在您的特定情况下使用,但是每当我需要按特定的间隔运行宏时,我都会在Workbooks_Open子目录中设置宏,然后从批处理文件中调用该文件,并计划该时间PC上具有Task Scheduler应用程序的批处理文件。

因此,创建您需要运行的宏,并将其以以下格式放置在“工作簿”部分(而不是模块)中:

Sub Workbook_Open()
'your macro goes here
End sub

然后制作一个批处理文件,该文件将打开您的Excel文档。打开记事本,然后输入以下代码。对于代码的第一部分,输入您的Excel.exe文件的路径。对于代码的第二部分,输入您的excel文件的路径。如果您的Excel文件位于网络驱动器上,则需要将其路径设置有所不同。

"C:\Program Files\Microsoft Office 15\root\office15\EXCEL.EXE" "C:\Users\curtis\Dropbox\National Accounts Customer Database\MakeNewLog.xlsm"

然后保存扩展名为.bat的记事本文档。我不记得了,但是您可能必须在文件资源管理器中更改一个开关才能执行此操作(该开关向您显示所有图标的文件扩展名)。

拥有批处理文件后,双击该文件以验证其是否有效。如果您正确执行了所有操作,则批处理文件将打开一个CMD窗口,该窗口将调用您的Excel文件。 Excel文件将打开,您的宏将自动在Workbooks_Open命令上触发。

现在只需安排批处理文件在Task Scheduler上运行即可。转到开始栏并搜索“任务计划程序”,然后将其打开。创建一个基本任务,为其命名,选择“每日”,设置时间,选择“启动程序”选项,浏览并选择您的批处理文件,然后单击“完成”。

这是有点不雅致的地方。您需要一遍又一遍地计划批处理文件,以使其每30分钟运行一次。也许可以使用更好的方法来配置任务计划程序,但是我只需要每天运行一个批处理文件,所以这是我所了解的范围。

如果没有别的,希望这将使您走上正确的道路!