【问题标题】:Run VBA Excel macro once a day每天运行一次 VBA Excel 宏
【发布时间】:2020-07-15 04:04:31
【问题描述】:

我有一些适用于特定 Excel 工作表的 Excel 宏。它会检查一些表格并根据需要向一些人发送提醒电子邮件。 我希望这个宏每天运行一次,以便每天检查表格,这样我就不需要每天打开工作表并自己做。它可以做吗?我听说 Windows 任务计划程序是一种选择,您认为这对我的目的来说是一个不错的选择吗?

【问题讨论】:

  • Windows 任务调度程序或任何其他调度程序是您唯一的选择。 excel文件只是一个文档。除非另有说明,您从外部触发宏来发送邮件,否则无法让 Excel 内部的宏每天自动执行。一天只发送一次邮件可以合并到宏中。但是,每天触发该宏只能由外部实用程序完成。
  • 如果您愿意让 Excel 文件永久打开,您可以在宏中添加 OnTime 事件,但这通常不实用,因此任务计划程序可能是最好的方法。
  • @Karpak 运行一个运行该宏的 VbScript(或批处理文件)怎么样?
  • @Masoud。通过 VB 脚本或通过任何其他脚本或通过任何其他类型的可执行文件(bat、com、exe 或 shell)。最终它必须由外部任务调度程序触发。
  • @Karpak 我的意思是让 vbs 使用任务调度程序运行,而不是打开 xl 文件并让宏在其上运行。我同意必须通过任务调度程序来完成。

标签: excel vba schedule


【解决方案1】:

如您所说,任务计划程序是一个不错的选择。要生成一个新进程并打开一个工作簿,您需要一个命令行来指定 (1) Excel 可执行文件和 (2) 要打开的工作簿,例如

C:\Program Files\Microsoft Office 15\root\office15\Excel.exe "c:\MyWorkbook.xlsm"

我建议在工作簿的完整路径周围加上双引号(但 Excel.exe 不需要)。

然后在 MyWorkbook.xlsm 中,您可以编写在工作簿打开时运行的代码,通常在任何标准模块中为 sub Auto_Open 或在 ThisWorkbook 模块中为 Sub Workbook_Open()

【讨论】:

    【解决方案2】:

    我会推荐一个 VBScript 文件,并使用任务调度程序让它每天运行。我更喜欢这个,因为这样我就可以在一天中的任何时间打开 Excel 文件并且宏不会运行(以防您只想在特定时间更新它)。

    这是您需要在记事本中编写然后以*.vbs 扩展名保存的VBscript。

    Option Explicit
    'On Error Resume Next 'Comment-out for debugging
    ExcelMacro
    
    Sub ExcelMacro() 
    
      Dim xlApp 
      Dim xlBook 
    
        Set xlApp = CreateObject("Excel.Application") 
        Set xlBook = 
        xlApp.Workbooks.Open("path\to\the\file.xlsm", 0, True) 
    
             xlApp.Run "Update" 'Name of your Sub
             xlBook.Save
             xlBook.Close
             xlApp.Quit 
    
        Set xlBook = Nothing 
        Set xlApp = Nothing 
    
    End Sub 
    

    然后您可以从命令行设置事件调度程序,例如 here:

    schtasks /Create [/S <system> [/U <username> [/P [<password>]]]]
    [/RU <username> [/RP <password>]] /SC <schedule> [/MO <modifier>] [/D <day>]
    [/M <months>] [/I <idletime>] /TN <taskname> /TR <taskrun> [/ST <starttime>]
    [/RI <interval>] [ {/ET <endtime> | /DU <duration>} [/K] [/XML <xmlfile>] [/V1]]
    [/SD <startdate>] [/ED <enddate>] [/IT] [/Z] [/F]
    

    您可能会觉得有用的其他链接:

    Task Scheduler from the command line? 来自 超级用户

    What is a simple way to schedule a single event to happen at some time in the future? 来自 Linux 和 Unix

    How to Schedule Programs to Run Automatically in Windows 7? 来自 Gizmo 的免费软件 (TechSupportAlert)

    【讨论】:

      最近更新 更多