【问题标题】:Excel VBA MsgBox auto answer Yes after timerExcel VBA MsgBox在计时器后自动回答是
【发布时间】:2016-01-28 21:50:39
【问题描述】:

我想安排一个任务,该任务打开 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

【问题讨论】:

  • 您是否尝试过在代码中使用Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  • 你可能需要一个用户表单而不是一个消息框。
  • MsgBox 是模态的,除非得到响应,否则无法执行其他宏。您可以在 MsgBox 之前为 SendKeys 壳一个 vbs 文件,但这并不可靠。所以你最好使用一个用户窗体并在初始化时,用Application.OnTime 在普通模块中调用一个子来开始倒计时并关闭用户窗体。

标签: vba excel scheduled-tasks msgbox


【解决方案1】:

只需将其作为常规子程序并编写您计划的批处理脚本即可。 我以前一直这样做,但找不到我的旧脚本。找到了这个,我知道它和我以前的很相似。

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 并安排它运行而不是工作簿。这样,您可以随时打开和编辑脚本,而无需自动运行。

【讨论】:

  • 太棒了!像魅力一样工作!非常感谢!
【解决方案2】:

你可以试试闪屏方法。

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

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

潜艇的工作方式:

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 sub 进入一个60 秒的循环,监控变量TimeOut。如果它变为假(通过按下启动屏幕按钮) - 子结束(隐藏启动屏幕的形状的事件处理程序)。否则 60 秒后启动画面会自动隐藏,Report 子会自动运行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多