【问题标题】:Run macro automatically via vbscript from timer从计时器通过 vbscript 自动运行宏
【发布时间】:2016-06-25 19:58:06
【问题描述】:

我有一个从 Internet 下载一些信息的宏,我需要安排它在一天中的某个时间开始自动运行,并以设定的时间间隔重复运行,尽管偶尔在特定时间由宏输出。

我用两种方法解决了这个问题,这两种方法都提出了我无法弄清楚的问题。第一种方法是使用计时器子程序,该子程序使用 Application.OnTime 命令运行宏,运行时从工作簿中由宏更新的单元格派生。

如果我在电脑上做其他事情,这种方法效果很好。但是,我注意到,如果我离开,即使计算机没有进入睡眠状态,程序不可避免地会在 30 分钟左右后停止重新运行。有时即使我在计算机上处​​于活动状态,它也会停止重新运行。为什么是这样?这可能是什么原因造成的?此外,自然地,我无法安排程序在宏内自动打开和运行,因此我转向了 VBScript & Task Scheduler 方法来解决这部分问题。

然而,我在执行 VBScript 时遇到了两个问题。首先,它在任务计划程序运行时经常无法启动。其次,当它运行时,宏中的 Application.OnTime 命令不起作用。这是一个问题,因为宏有时需要以不规则的时间间隔运行,这些时间间隔是在一天中随着宏运行其迭代而确定的。为什么当任务管理器尝试时 vbscript 无法运行,为什么它不会像我手动运行宏时那样启动 application.ontime 命令?

VBA 定时器代码:

Sub Timer()
    Dim Runtime As Date

    If Time <= TimeValue("17:45:00") Then
        Workbooks("10am_Swing_Report").Sheets("Parameters").Cells(17, 2).Value = 10
    ElseIf Time > TimeValue("17:45:00") And Time <= TimeValue("18:15:00") Then
        Workbooks("10am_Swing_Report").Sheets("Parameters").Cells(17, 2).Value = 13
    ElseIf Time > TimeValue("18:15:00") And Time <= TimeValue("18:45:00") Then
        Workbooks("10am_Swing_Report").Sheets("Parameters").Cells(17, 2).Value = 16
    ElseIf Time > TimeValue("18:45:00") And Time <= TimeValue("19:15:00") Then
        Workbooks("10am_Swing_Report").Sheets("Parameters").Cells(17, 2).Value = 19
    End If

    Workbooks("10am_Swing_Report").Sheets("Parameters").Range("B16").Calculate
    If Time > Workbooks("10am_Swing_Report").Sheets("Parameters").Range("B16").Value Then
        Runtime = Time + TimeValue("00:00:30")
    Else
        Runtime = Workbooks("10am_Swing_Report").Sheets("Parameters").Range("B16").Value
    End If

    Application.OnTime TimeValue(Runtime), "Swingtimer"

    Workbooks("10am_Swing_Report").Sheets("Parameters").Range("C16").Value = Runtime
    Workbooks("10am_Swing_Report").Save
End Sub

谢谢!

我已更新 Vbs 代码以包含运行时已通过的验证,但我仍然遇到任务计划程序无法启动任务的问题。我收到以下错误:“已忽略启动请求,实例已在运行”,然后是:“任务启动失败”。我最初认为这是因为 Vbscript 仍在从前一个实例运行,但我从一开始就得到了这个。

Option Explicit


Dim xlApp       
Dim xlBook      
Dim runtime 
Dim xlSheet



Set xlApp = CreateObject("Excel.Application")
xlApp.DisplayAlerts = False
'xlApp.Application.DisplayAlerts = True
Set xlBook = xlApp.Workbooks.Open("C:\Users\DORIAN\Dropbox\Swing_Report.xlsm",1,False)
Set xlSheet = xlBook.Sheets("Parameters")

'xlBook.application.Visible = True

'MsgBox FormatDateTime(xlSheet.Range("B16").Value,3)
runtime = TimeValue(FormatDateTime(xlSheet.Range("B16").Value,3))
'MsgBox runtime


If Time > runtime Then 
    xlApp.Run "Swingtimer"
    'MsgBox "Running..."
    WScript.Sleep 30000
Else
xlApp.Application.OnTime runtime, "Swingtimer"
'MsgBox "Timer Set"
End If


xlbook.close True

WScript.Quit

【问题讨论】:

  • 请提供VBA和VBScript部分的代码。就像现在所说的那样,没有太多可以提供的答案。

标签: vba vbscript task scheduler


【解决方案1】:

你能用不同的方式来做吗? 1) 在 Windows 调度程序中运行 vbscript,比如每 1 分钟或 1 小时或……。

2) 在 VBscript 中进行一些验证
如果条件那么 执行你的代码 别的 停止 vbscript 结束如果

使用它你可能可以摆脱 OnTime 事件处理程序

最好的问候 亚历克斯

【讨论】:

  • 谢谢。我目前在任务调度程序上设置为每五分钟运行一次。我不希望它更频繁地运行,但有时它需要在五分钟间隔之间运行,即在 8:52 时,它通常会在 8:50 和 8:55 运行。我想知道是否可以将工作簿中的运行时间绘制到 vbscript 而不是 vba 中。但我不知道如何使它工作。关于某种验证,我没有任何要验证的东西。我希望程序每五分钟运行一次,但有时也会在这之间运行一次。
  • @Dorian821,您可以修改任务调度程序,使其由事件和计时器触发(在stackoverflow上搜索如何使用vbs创建事件)。
  • @Dorian821 当我使用“验证”一词时,我的意思是决定:根据您的条件运行或不运行。例如,您的调度程序每 1 分钟“触发”一次:8:50 - 运行(按时间); 8:51 - 不跑; 8:52 - 跑步(通过一些额外的条件); 8:53 - 不运行,等等
  • @alex 啊,好的。我可以使用工作簿中的值作为条件吗?还是我必须按照上面的建议创建一个事件日志来测试?
  • 我觉得 Excel 值比较简单。您已经有一些 vbscript,因此最好避免使用 2 个代码源。像这样 Set objExcel = CreateObject("Excel.Application") Set objWorkbook = objExcel.Workbooks.Open ("C:\Alex\Tasks\VBScript_and_Excel\ex.xlsx") dim ss = objExcel.Cells(1, 1)。 Value objExcel.Quit if s = "run" then ...做某事... else wscript.Quit end if
【解决方案2】:

我认为你把事情复杂化了。您只需要一个 Workbook_Open 事件和 Windows 任务计划程序。

类似这样的东西(根据您的需要进行定制)。

Private Sub Workbook_Open()
    Msgbox Date
    Worksheets("Sheet1").Range("A1").Value = Date
End Sub

使用 Windows 任务计划程序计划事件。

http://www.sevenforums.com/tutorials/11949-elevated-program-shortcut-without-uac-prompt-create.html

【讨论】:

  • 谢谢。你说得对,我可以让它更简单。但是,目前代码运行良好,我更喜欢验证以防止 vba 代码不必要地运行。问题似乎实际上是通过任务调度程序找到的。该脚本手动运行得很好,但我遇到了持续的问题,使其使用任务调度程序按计划运行。目前,它似乎甚至没有打开脚本。它停在“创建的任务进程”,并在那里停留了几个小时。同时,任务管理器中没有 wscript 或 Excel 进程的痕迹
  • 这是一个更好的解决方案。如果您想要临时运行,请将任务修改为在事件日志上运行。您可以编写一个 vbs 模块来创建事件并将其放在桌面快捷方式上。
  • 我看不出这将如何帮助或简化事情。该程序的标准只是基于时间的,我希望它每天在我的服务器上自动运行。因此,如何使用桌面快捷方式和事件日志设置另一个程序比基于时间的计划更有效?
  • 实际上,程序的 vbs 和 vba 部分现在工作正常,此时的问题是任务计划程序实际上并没有打开 vbs 文件,即使它说它是。因此,我无法让它自动化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多