2016-01-28 80 views
0

我想安排一個任務,打開一個Excel工作簿,運行腳本,並在指定的時間每天(過夜)關閉工作簿。我已經在Task Scheduler中安排了任務,並且我知道我可以將代碼設置爲在打開工作簿時自動運行,但是我不希望代碼每次打開工作簿時都運行。有沒有辦法在代碼的開頭插入msgbox,這樣如果在60秒內沒有對msgbox的響應,它會自動運行代碼。這就是我設想,但無法弄清楚如何格式化它的「案例超時」部分:Excel VBA 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

你有沒有試過在你的代碼中使用'Public Declare Sub Sleep Lib「kernel32」(ByVal dwMilliseconds As Long)'? – teepee

+0

您可能需要一個用戶表單而不是消息框。 –

+1

MsgBox是模態,除非響應,否則不能執行其他宏。您可以在MsgBox for SendKeys之前Shell一個vbs文件,但它不可靠。所以你最好使用UserForm並在Initialize上使用Application.OnTime調用正常模塊中的Sub開始倒計時並關閉UserForm。 – PatricK

回答

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並安排它運行而不是工作簿。這樣,您可以在任何時候打開並編輯腳本,而無需自動運行。

+0

太棒了!像魅力一樣工作!非常感謝! – StephK

1

你可以嘗試一個閃屏方法。

創建一個新的工作表,說StartUp並使它看起來是這樣的:

enter image description here

在這張照片我有隱藏的網格線等,改變背景和字體,然後包括兩個矩形鏈接到潛艇。

潛艇的工作方式:

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)在用於模塊我:

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就足夠了。