發布時間:2024-01-19閱讀(21)
【分享成果,隨喜正能量】不爭,是歲月賦予的智慧,人生一局棋,關于輸贏,我們總是無能為力,迷惘時,多半在局內;了悟時,人已在局外。不吵,是時光賦予的平和,遇到問題的處理方式有很多種,發怒是一種、隱忍是一種、不理會又是一種。不炫耀,是經歷賦予的謙卑,低調,是態度;不炫耀,則是一種智慧。心懷謙卑,世界才會對你友好。
《VBA信息獲取與處理》教程是我推出第六套教程,目前已經是第一版修訂了。這套教程定位于最高級,是學完初級,中級后的教程。這部教程給大家講解的內容有:跨應用程序信息獲得、隨機信息的利用、電子郵件的發送、VBA互聯網數據抓取、VBA延時操作,剪切板應用、Split函數擴展、工作表信息與其他應用交互,FSO對象的利用、工作表及文件夾信息的獲取、圖形信息的獲取以及定制工作表信息函數等等內容。程序文件通過32位和64位兩種OFFICE系統測試。是非常抽象的,更具研究的價值。
教程共兩冊,八十四講。今日的內容是專題三“VBA代碼分類及如何利用代碼自動關閉空閑文件”的第3講:工作薄沒有操作后自動關閉的實現

在工作中,我們經常會遇到一種情況,打開一個EXCEL時,進行了必要的編輯,往往會忽略關閉這個動作,有沒有一個辦法讓工作薄自動關閉呢?也就是說在這個工作薄打開后過了3分鐘或者10分鐘沒有編輯的情況下,可以自動關閉呢?這講的內容就給大家講解這個程序,程序比較簡單,主要利用了ONTIMEN方法.
1 在標準模塊中對于關閉時間和關閉工作薄進行設置我們需要在標準模塊中設置一個時間作為一個全局的變量,這個變量將是每次工作薄發生改變后延續的時間,同時我們還將設置一個工作薄關閉的過程。下面看代碼:
Public RunWhen As Double
Public Const NUM_MINUTES = 10 自定義自動關閉的時間分鐘
Sub SaveAndClose()
ThisWorkbook.Close savechanges:=True
End Sub
上述的代碼在聲明部分給出了一個RunWhen變量是Public的,這個變量在整個工程中都是可以使用的同一個變量。
SUB的過程是保存并關閉工作薄的過程,ThisWorkbook.Close是指關閉工作薄,savechanges:=True是保存當前的更改。

那么什么時候關閉這個工作薄呢?就要在工作薄發生改變后的NUM_MINUTES時間,這個NUM_MINUTES時間是固定的,但程序能檢測的是當前的時間,就是NOW NUM_MINUTES.
2 利用ONTIME方法對執行程序進行設置當我們打開一個工作薄或者改變一個工作表的時候,都會發生相應的動作,這個動作就是對象的事件,如打開工作薄的事件是Workbook_Open;工作薄中工作表的選擇發生改變時的事件是Workbook_SheetChange;工作薄中工作表內選擇發生改變時的事件是:Workbook_SheetSelectionChange。在上述代碼幾個事件中都會涉及到工作薄的可能改變,那么我們將在上面的幾個事件中觸發一個ONTIME的方法,這個方法就是在工作薄改變后的RunWhen時間內將關閉工作薄。
對于ONTIME方法,我在我的《VBA代碼解決方案》中詳細的講解過,我們再來回顧一下:
Excel VBA并沒有提供定時器控件,但是用戶可以通過Application對象的OnTime方法實現簡單的定時器功能,應用于Application對象的OnTime方法能夠安排一個過程在將來的特定時間運行,語法如下: expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
參數:
a) expression是必需的,返回一個Application對象。
b) EarliestTime是必需的,設置指定的過程開始運行的時間。使用Now TimeValue(time)可以安排從現在開始經過一段時間之后運行某個過程,使用TimeValue(time)可以安排在指定的時間運行某個過程。
c) Procedure是必需的,設置要運行的過程名稱。
d) LatestTime是可選的,設置過程開始運行的最晚時間。例如將參數LatestTime設置為EarliestTime 10,當時間到了EarliestTime時如果Excel不處于空閑狀態,那么Excel將等待10秒,如果在10秒內Excel不能回到空閑狀態,則不運行該過程。如果省略該參數,Excel將一直等待到可以運行該過程為止。
e) Schedule是可選的,如果其值為True(默認值),則安排一個新的OnTime過程,如果其值為False,則清除先前設置的過程。
我們這講將利用ONTIME的語句是:
動作一: Application.OnTime RunWhen, "SaveAndClose", , False 停止”在RunWhen時間后執行SaveAndClose這個程序的動作”。
動作二: Application.OnTime RunWhen, "SaveAndClose", , True 打開”在RunWhen時間后執行SaveAndClose這個程序的動作”。
3 在工作薄模塊中工作薄的變化進行過程設置那么上述兩個動作如何在各個對象的事件中執行呢?我們以打開這個工作薄為例,打開這個工作薄后,再過NUM_MINUTES時間就去執行動作二;如果這個NUM_MINUTES時間內重復打開這個工作薄,那么就會先停止動作二,打開后工作薄后,再次執行動作二。
同理,當工作薄內的工作表選擇沒有變化時就執行上面的動作二,如果NUM_MINUTES時間內工作薄內的工作表選擇區域發生了改變,那么就會先停止執行動作二,選擇完成后再次執行動作二。
那么在我們人為的關閉這個工作薄呢?就只需執行動作一即可。
下面我們參考下面的代碼,由于這些代碼是對工作薄的操作,所以是寫在了工作薄模塊中:
Private Sub Workbook_Open()
On Error Resume Next
Application.OnTime RunWhen, "SaveAndClose", , False
On Error GoTo 0
RunWhen = Now TimeSerial(0, NUM_MINUTES, 0)
Application.OnTime RunWhen, "SaveAndClose", , True
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
Application.OnTime RunWhen, "SaveAndClose", , False
On Error GoTo 0
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
On Error Resume Next
Application.OnTime RunWhen, "SaveAndClose", , False
On Error GoTo 0
RunWhen = Now TimeSerial(0, NUM_MINUTES, 0)
Application.OnTime RunWhen, "SaveAndClose", , True
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _
ByVal Target As Range)
On Error Resume Next
Application.OnTime RunWhen, "SaveAndClose", , False
On Error GoTo 0
RunWhen = Now TimeSerial(0, NUM_MINUTES, 0)
Application.OnTime RunWhen, "SaveAndClose", , True
End Sub
代碼的截圖:

代碼的講解:上述代碼中只需在注意一點,當工作薄發生改變后要再次設置一下RunWhen:
RunWhen = Now TimeSerial(0, NUM_MINUTES, 0)
本節知識點回向:如何實現對執行程序的自動控制?如何實現工作薄的空閑關閉?
本專題參考程序文件:003工作表.XLSM

我20多年的VBA實踐經驗,全部濃縮在下面的各個教程中,教程學習順序:
① 7→1→3→2→6→5或者7→4→3→2→6→5。
② 7→8
各套教程內容簡介:
第7套教程(共三冊):《VBA之EXCEL應用》:是對VBA基本的講解
第1套教程(共三冊):《VBA代碼解決方案》:是入門后的提高教程
第4套教程(16G):VBA代碼解決方案之視頻(第一套的視頻講解)
第3套教程(共兩冊):《VBA數組與字典解決方案》:是對數組和字典的專題講解
第2套教程(共兩冊):《VBA數據庫解決方案》:是對數據庫的專題講解
第6套教程(共兩冊):《VBA信息獲取與處理》:講解VBA的網絡及跨程序應用
第5套教程(共兩冊):VBA中類的解讀和利用:類及接口技術的講解
第8套教程(共三冊):VBA之Word應用(最新教程):word中VBA的利用
歡迎分享轉載→http://www.avcorse.com/read-29697.html
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖