我想安排一个任务,打开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
答案 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
并使其看起来像这样:
在这张图片中,我隐藏了网格线等,更改了背景和字体,然后包含了两个链接到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
就足够了。