Excel VBA MsgBox自动回答定时器后是

时间:2016-01-28 21:50:40

标签: excel vba excel-vba scheduled-tasks msgbox

我想安排一个任务,打开excel工作簿,运行脚本,并在每天的指定时间(隔夜)关闭工作簿。我在任务计划程序中安排了任务,我知道我可以将代码设置为在工作簿打开时自动运行,但我不希望每次打开工作簿时都运行代码。有没有办法在代码的开头插入一个msgbox,这样如果在60秒内没有对msgbox的响应,它将自动运行代码。这是我想象的,但无法弄清楚如何格式化它的“案例超时”部分:

Sub Auto_Run()
MsgBox "Would you like to run reports now?", vbYesNo
Case vbYes
'Insert code here
Case Timeout
'paste the same code as for vbYes
Case vbNo
End Sub

2 个答案:

答案 0 :(得分:2)

将它作为常规子文件并编写您安排的批处理脚本。 我曾经一直这样做,但找不到我的旧脚本。找到了这个,我知道它与我的旧版相似。

Dim xlApp
Dim xlWkb
Set xlApp = CreateObject("excel.application")
Set xlWkb = xlApp.Workbooks.Open("PATH TO YOUR FILE")
xlApp.Visible = True
xlWkb.RunAutoMacros 1 'enables macros to be run on open
xlApp.Run ("YOUR PROCEDURE")
xlApp.Workbooks("YOUR WORKBOOK NAME").Save 'Save the workbook
xlApp.Quit 'quits excel

另存为.vbs并安排它运行而不是工作簿。这样,您可以随时打开和编辑脚本,而无需自动运行。

答案 1 :(得分:1)

您可以尝试使用闪屏方法。

创建一个新的工作表,比如StartUp并使其看起来像这样:

enter image description here

在这张图片中,我隐藏了网格线等,更改了背景和字体,然后包含了两个链接到sub的矩形。

潜艇的工作方式:

1)在标准代码模块(包含你想要(有时)运行的Report子模块)中,我在模块顶部声明了一个变量:

Public TimeOut As Boolean

2)在我的启动表的代码模块中,我有这两个子(链接到相应的形状):

Sub RunReport()
    Sheets("StartUp").Visible = xlSheetHidden
    TimeOut = False
    Report 'sub to launch
End Sub

Sub UseWorkbook()
    Sheets("StartUp").Visible = xlSheetHidden
    TimeOut = False
End Sub

3)在ThisWorkbook的模块中,我有:

Private Sub Workbook_Open()
    Dim start As Double

    TimeOut = True
    Sheets("StartUp").Visible = xlSheetVisible
    Sheets("StartUp").Activate
    start = Timer
    Do While Timer < start + 60
        DoEvents
        If TimeOut = False Then Exit Sub
    Loop
    Sheets("StartUp").Visible = xlSheetHidden
    Report
End Sub

当您打开工作簿时,会触发Open事件,显示启动画面。然后,此Workbook_Open子进入60秒循环,监视变量TimeOut。如果它变为假(通过按下启动画面按钮) - 子结束(使用隐藏启动画面的形状的事件处理程序)。否则,60秒后会自动隐藏启动画面,Report子自动运行。

最后备注:需要DoEvents来监控TimeOut变量并允许其他事件处理程序触发,因此您不想简单地睡眠60秒。尽管如此,你仍然可以通过在Do-While循环中间引入1秒睡眠来使用@teepee的优秀建议。每隔一秒检查一次TimeOut就足够了。