沒錢也能使Access推磨!三更半夜做報表!

Access中的查詢能夠把數據處理和分析過程固化下來,並且還可以設計「基於查詢」的查詢。只要單擊查詢鏈上的最後一個查詢就可以一次性地完成煩瑣的數據處理和分析操作。這看起來很不錯,卻有一個問題:我們怎麼才能夠自動地執行這些查詢呢?

感謝Access,它給我們提供了一種叫做「宏」的功能。我們知道,「宏」的概念在Excel中就有了,Excel中提供的「錄製宏」功能能夠把我們在Excel中的操作步驟錄製下來,以便在將來需要的時候重複執行。

在Access中,不再有Excel中的「錄製宏」的概念,我們必須自己「設計宏」或者更確切地說,去「組裝宏」。但這並不意味著在Access中宏的使用變得很複雜。事實上,Access已經把我們在Access中可能用到的絕大多數操作都已經預先設置好,我們需要做的只是把這些預定的操作按照實際工作需要的順序編排起來就行了,從這個角度來講,Access中的宏用起來反而比Excel中的宏更簡單!

假設我們在製造部門工作,有一項日常工作:每天早晨8:00,分析一下在這一時刻(8:00)生產線各個工序的「在制品」庫存情況,並且需要把該時刻「在制品」在各個工序的庫存數量保存下來,一天天地積累數據,以便將來在需要的時候分析各個工序的「在制品」庫存在一段時期內的每天特定時刻的變化趨勢。

這裡的「在制品」是生產管理方面的常用術語,意思是「製造過程中的產品」,也可以說是「尚未完成的產品」,其英文是Work in Process,簡稱WIP。

很多大公司都有一套生產追蹤系統,用於追蹤生產線上的產品的加工狀態,為了方便讀者理解,假如我們在生產鐵皮桶的工廠任職,鐵皮桶的生產過程包括4個工序,分別是:

(1)鐵板剪裁;

(2)桶體焊接;

(3)桶身噴塗;

(4)最後裝箱。

在產品製造過程中,生產追蹤系統會實時、動態地「反映」每一個工序的在制品庫存數據到系統資料庫中,對於每一個工序的「在制品」庫存,我們一般只能實時查詢當時的情況,而不能查詢過去某一時刻在制品庫存的歷史數據,因為生產執行系統的資料庫一般不會持續地保存每一時刻在制品庫存數據(如果要保存的話,那將是相當龐大的數據量)。所以,如果要想了解在制品庫存在每天某一特定時刻的歷史變化趨勢,我們必須自己想辦法!

為此,我們每天早晨8:00之前來到公司,第一件事就是使用Access的「外部數據→導入並鏈接」功能把生產執行系統在8:00這個時刻的在制品庫存數據提取到Access中,並且「追加」存放到Access中的一個單獨的表格中,每天一次,不斷積累數據,以便我們在需要時把數據導出到Excel中分析在制品的庫存變化趨勢。

這個工作如果手動處理,無疑是重複而且單調的,並且時間要求是嚴格的,假設某一天由於交通堵塞我們未能在8:00之前趕到公司,那麼這個抓取在制品庫存的工作就耽誤了,對於大規模的24小時不間斷生產的企業來說,在制品庫存是隨時變化的,時間一旦錯過了,當時的在制品庫存數量也就再也無法得到了。

幸運的是,我們完全可以讓Access軟體幫助我們自動完成這件事情,下面看一下具體的實施過程。

5.1 Access追加查詢

假設我們已經用Access界面中的「外部數據》導入並鏈接》ODBC資料庫」功能建立了Access到生產執行系統資料庫的鏈接表,關於如何讓Access和資料庫直接建立聯繫,可能需要諮詢公司的資料庫維護人員。

建立Access到生產執行系統資料庫的鏈接表,實際上就是建立了一個Access表格和生產執行系統資料庫中的表格的一個動態鏈接。該鏈接表能夠實時地反映外部數據的變化情況。

為了定時保存生產執行系統資料庫的數據,我們需要再在Access中建立一個和這個鏈接表結構相同的本地表,用於存儲每天某個時刻(如8:00)生產執行系統中實時變化著的「在制品庫存」表中的數據。建立與「在制品庫存」表結構相同的空表格的方法是:選中「在制品庫存」鏈接表,單擊滑鼠右鍵,在彈出的快捷菜單里選擇「複製」命令。

在Access界面左側的Access對象列表的空白處單擊滑鼠右鍵,在彈出的右鍵菜單里選擇「粘貼」命令。在彈出「粘貼表方式」對話框中,選擇「粘貼選項」選項中的「僅結構(S)(本地表)」單選框,表示我們只複製原始表格的設計結構,即粘貼一個只含有列標題的空表,而不粘貼其中的數據。同時將粘貼的表格命名為「在制品庫存-每日」。該表格將用來保存我們每天在特定時刻從「在制品庫存」鏈接表中抓取的實時在制品庫存數據,如圖所示。

「在制品庫存」鏈接表是從生產執行系統中鏈接過來的表,任何時候打開它,反映的都是該時刻生產執行系統中「在制品」庫存的實時數據,如下圖所示。值得注意的是,在該生產執行系統中的實時數據中沒有反映該數據是什麼時刻數據的時間標籤,這意味著:你什麼時刻打開這個表,表裡的數據就是什麼時刻的!

我們每天在抓取數據時需要知道該數據是何時抓取的,因此,我們需要在剛才複製到Access中的本地表結構中增加一個新的欄位用以記錄數據抓取時刻。

選中「在制品庫存-每日」表,單擊滑鼠右鍵,在彈出的快捷菜單中選擇「設計視圖」命令,對該表格進行結構上的修改。

現在進入表格結構設計視圖,在設計視圖的上方,列出了該表格的所有欄位名稱和該欄位能夠存儲的數據類型。我們可以看到,「產品代碼」和「當前工序」只能存儲文本類型的數據,「在制品數量」只能存儲數字類型的數據。

現在在欄位列表下方新增加一個欄位(實際上是在相應的表中增加了一列),這個欄位取名為「數據採集時間」,然後在「欄位名稱」列的最下方輸入這個名稱,在右側的下拉列表中選擇該欄位只能存儲「日期/時間」類型的數據。之所以這樣規定,是因為我們想讓這一列數據將來能夠參與日期和時間相關的計算,如圖所示。

增加完新的欄位後,單擊Access功能區左邊的「視圖」按鈕,打開剛剛增加了新的欄位的空表格。我們觀察到,該表格右側已經增加了一個自定義的新列「數據採集時間」,如圖17-4所示,表示新欄位增加成功!然後保存並關閉該表格。

下面進入我們「在制品」庫存數據採集的關鍵步驟,即如何把鏈接表中的實時庫存數據的每一行增加一個「數據採集時間」標籤後追加到我們剛才設計的空表格中去呢?這裡的「追加」的意思是在保留原有的數據的基礎上增加新的數據。

在Access中完成這個任務非常容易。在Access中有一種查詢類型叫做「追加查詢」,該查詢類型可以向某個表格中追加新的數據,下面來看一看如何使用Access中的追加查詢來完成庫存數據的自動採集工作。

在Access中的功能區中選擇「創建→查詢→查詢設計」命令,進入Access查詢設計界面。在「顯示錶」對話框中,列出了Access中的所有表格,因為我們要把「在制品庫存」中的數據抓取到「在制品庫存-每日」中,因此,我們選擇「在制品庫存」表,然後單擊對話框下部的「添加」按鈕,把「在制品庫存」表添加到Access查詢設計器界面上部,如圖所示。

當滑鼠停留在Access查詢設計器界面時,我們會發現Access功能區上面出現了一個新的叫做「設計」的上下文標籤(Office軟體系統的智能感應菜單)。選擇「設計→查詢類型→追加」命令。表示我們要設計的追加查詢,此時彈出「追加」對話框。

在「追加到」下拉列表中選擇「在制品庫存-每日」,表示我們要把數據追加到「在制品庫存-每日」表中。在對話框的下方選擇「當前資料庫」選項,表示我們要把數據追加到「當前資料庫」中的「在制品庫存-每日」表中。然後單擊「確定」按鈕,關閉「添加」對話框,如圖所示。

現在選擇Access可視化查詢設計器上方的「在制品庫存」表格結構圖中的「*」符號,將其拖曳到下方設計網格的「欄位」行中,此時我們發現在查詢設計網格的「追加到」行中自動出現了「在制品庫存-每日.*」的字樣,表示Access將要把「在制品庫存」表格中的所有列的內容追加到「在制品庫存-每日」對應列中。

這看起來很不錯,但我們還沒有完成任務,我們還需要在追加的數據中增加數據採集時間,只有這樣,採集的數據才能在以後需要的時候按照「數據採集時間」序列分析庫存的變化趨勢。

單擊Access查詢設計器網格最後一列「追加到」一行所對應的單元格,在下拉列表中選擇「數據採集時間」,表示我們將要向「在制品庫存-每日」表格中的「數據採集時間」列追加數據。

向「在制品庫存-每日」表中的「數據採集時間」列追加一個表示當前時間的數值,因此,在上方的「欄位」行中輸入「採集時間:Now()」,其含義是我們生成一列新的數據,數據的值是我們追加查詢的執行時間,也就是數據採集的時間。Now()函數和在Excel中的Now()函數一樣,是Access里的一個函數,能夠得到當前的時間。「採集時間:Now()」中的「採集時間」表示我們給該列數據取了一個新名稱,叫做「採集時間」,如圖所示。

選擇Access功能區中「設計→結果→視圖」命令(注意不是上面有一個「驚嘆號」圖標的那個按鈕,帶有「驚嘆號」圖標的按鈕是「執行」追加查詢,不是「預覽」將要追加的數據)。現在我們可以預覽追加查詢將要追加的數據,我們看到在預覽的數據中有一列叫做「採集時間」的數據,內容是查詢運行的時間,如圖所示。

下面單擊Access快捷菜單欄里的「保存」按鈕,在彈出的「另存為」對話框中,給我們所設計的追加查詢取一個有意義的名稱,然後單擊「確定」按鈕。

這時,在Access界面左側的Access對象瀏覽器中可以看到多出來了一個Access的項目,就是我們剛剛設計的查詢。追加查詢的圖標是一個綠色的加號加一個黑色的驚嘆號,如果我們雙擊該查詢對象,該查詢將被立即執行,把當前時刻的在制品庫存數據追加到「在制品庫存-每日」表中,如圖所示。

現在,我們已經利用Access中的追加查詢功能把每天從生產執行系統中抓取實時庫存的任務通過簡單地雙擊就完成了,接著面臨問題是:如何能夠讓這個動作在每天打開Access資料庫時自動完成,完成任務後再自動退出Access資料庫?

我們可以藉助Access中的宏完成這個任務。

5.2 Access中的宏

我們已經知道,在Access中,不再有「錄製宏」的概念,我們需要自己設計宏,但這並不意味著在Access中,宏的使用變得複雜。事實上,Access已經把我們在操作Access時可能涉及的動作已經預先設置好,我們需要做的只是把Access中的預定動作按工作實際需要的順序編排好就可以了,從這個方面上來講,Access中的宏用起來比Excel中的宏更簡單!

下面我們就開始設計宏,單擊Access功能區「創建→宏與代碼」功能組中的「宏」按鈕。進入Access的設計「宏」界面。

在Access的宏設計界面中,我們會見到一個綠色的加號按鈕,在界面的右邊,有一個叫做「操作目錄」的導航欄,在Access中可以執行的各種動作就分門別類地放在這裡。我們現在還用不到這個導航欄,單擊該導航欄右上角的「×」符號關閉它。

單擊Access界面中間的綠色加號按鈕,這表示增加一個宏動作。單擊該按鈕後,展開一個包含有各種預置的「宏動作」的下拉列表。這裡就是Access預先為我們設置好的各種在Access中可以執行的宏動作,包括導入數據、導出數據、打開表格、執行查詢等。

針對我們目前的任務需求,我們需要執行的動作是打開前面設計的追加查詢以追加數據,因此在下拉列表裡選擇「OpenQuery」動作,這是指我們希望打開一個查詢,如圖所示。

這時進入了為我們選定的宏動作設置參數的對話框,我們所選動作「OpenQuery」所需的第一個參數就是查詢的名稱,表示我們要打開哪一個查詢。單擊宏設計界面右側的查詢列表,在該列表中選擇需要執行的查詢名稱,如圖下圖所示。

我們已經在Access資料庫中設計了一個追加查詢「查詢1-追加每日在制品庫存」,所以應該選擇它。對於「OpenQuery」動作後面的兩個參數「視圖」和「數據模式」選項,保持默認值。

單擊「保存」按鈕,給我們的設計的宏取名為「AutoExec」然後關閉Access設計宏界面,如圖所示。我們發現在Access界面左側的Access對象列表中多了一個我們剛剛設計的宏對象。

這裡我們需要特別注意的是:我們在這裡給宏取的名稱不是一個一般的名稱!如果我們給Access中的宏取名為「AutoExec」則表示這是一個在打開Access資料庫文件後,可以自動執行的宏!如果我們給Access取了一個其他的普通名稱,那麼只有在打開Access資料庫文件後,雙擊這個宏的名稱才能夠執行,而不會在打開Access資料庫時「自動」執行!

下面測試一下AutoExcec宏:關閉Access資料庫,再重新打開後,看到彈出如下對話框:「您正準備執行追加查詢,該查詢將修改您表中的數據。」這說明我們的AutoExcec宏已經自動執行了,只是由於Access中的安全機制,對於修改Access中數據的宏動作,需要用戶確認。這裡單擊「是」按鈕,如圖所示。

此時再次彈出確認對話框,表示將要追加數據,單擊「是」按鈕,如圖所示。AutoExec宏執行完畢。

現在雙擊打開Access對象列表中的「在制品庫存-每日」表,我們發現,該表中已經有新的數據追加進去了,而數據的「數據採集時間(追加時間)」已經記錄到了表格的最後一列,如圖所示。

一切看起來還不錯,但是唯一存在的問題是AutoExec宏執行過程中彈出來的那兩個對話框會中斷宏的執行過程。因為我們希望這個宏在無人工干預的情況下自動執行,而不是專門安排一個人來單擊兩次「確認」按鈕。

在Access宏中,有一個叫做SetWarnings的動作可以幫助我們處理這些警告對話框。但是這個宏動作在Access默認情況下是隱藏的。我們需要單擊Access功能區中「設計」標籤下的「顯示所有操作」按鈕後,它才會出現在「添加新操作」下拉列表中。

選擇功能區中的「顯示所有操作」命令。然後單擊「添加新操作」下拉列表,在其中選擇SetWarnings動作。保持下面的「打開警告」默認參數設置為「否」,表示SetWarnings宏動作下方的宏不需要出現警告對話框,如圖所示。

SetWarnings動作需要放在宏中能夠引起報警的動作序列的前面,在SetWarnings動作上按下滑鼠左鍵,把它拖到所有宏動作的最前面。

用SetWarnings動作抑制了警告對話框後,一般情況下,我們還需要在所有宏動作執行完畢後打開警告對話框功能,所以我們在宏序列的最後再增加一個SetWarnings宏動作,設置「打開警告」動作參數為「是」,表示恢復報警功能,如圖所示。

現在關閉資料庫後再將其打開,AutoExec宏自動執行,這次不再出現任何警告對話框,雙擊「在制品庫存-每日」表,根據表中的「數據採集時間」列,發現又有新的數據追加到該表格中了,如圖所示。

到現在為止,我們已經簡化了工作,每天早晨8:00來到公司時,只需雙擊打開我們設計的Access文件,Access會自動執行AutoExec宏,這樣任務完成了!

最後一個問題,由於Office安全機制,含有宏的Access文件在打開時會默認彈出安全警告對話框,這會影響Access宏的自動執行。我們可以用如下方法避免默認彈出的安全警告對話框。

選擇「文件→Access選項→信任中心」命令,在對話框右側單擊「信任中心設置」選項,在彈出的「信任中心」對話框左側單擊「受信任位置」,在對話框右側下方單擊「添加新位置」按鈕。這時彈出「Microsoft Office受信任位置」對話框,如圖所示。在「Microsoft Office受信任位置」對話框中選擇我們剛剛設計的Access文件所在的文件夾。這樣再次雙擊打開剛剛設計的含有宏的Access文件就不會彈出默認的安全警告對話框了。

那麼,如何在打開Access文件時避免執行AutoExec宏呢?可以在按著Shift鍵的同時雙擊打開Access 文件,Access裡面的AutoExec宏就不會被執行,當我們想查看和修改Access文件中的內容時可以使用這種方法打開帶有AutoExec宏的Access文件。

睡著覺就把活幹了

利用前面精心設計Access宏,我們已經把手動操作的工作自動化了,每天早晨8:00來到公司,只需雙擊打開我們設計的Access文件,Access自動執行AutoExec宏,等待幾分鐘後,任務完成了!

可是如果公司領導突發奇想,想採集一下每天午夜24:00的在制品庫存情況,那怎麼辦?難道我們半夜來公司,雙擊打開一下Access文件?

完全不用!利用Windows操作系統中的「計劃任務」工具,可以讓Access在午夜幫我們幹活!

在介紹Windows操作系統中的「計劃任務」工具之前,我們再修改一下前面設計的宏動作序列。

在上一節設計的宏中,宏動作執行完畢後,Access文件並不會自動關閉,我們現在希望在宏中的追加數據動作完成後,自動關閉並退出Access資料庫。

如果剛才的資料庫還處於打開狀態的話,單擊選擇AutoExcec宏,如果資料庫已經關閉,可以在按著Shift鍵的同時,雙擊資料庫文件,打開Access資料庫,以避免AutoExcec自動執行。右鍵菜單中選擇「設計」選項進入設計宏界面,保持Access功能區「設計」標籤下的「顯示所有操作」按鈕按下的狀態,增加一個QuitAccess的動作,參數選擇為「全部保存」。然後保存宏並關閉宏設計界面,最後關閉Access資料庫文件,如圖所示。

這時,再次雙擊打開Access資料庫文件,Access執行宏後,自動關閉資料庫,雖然表面看上去好像什麼也沒發生一樣。事實上,在制品庫存的實時數據已經被採集到了Access中的「在制品庫存-每日」表中了。

我們可以按著Shift鍵的同時雙擊打開Access 文件,查看Access文件中的「在制品庫存-每日」表中是否增加了新的內容。

修改好AutoExec宏後,回過頭來再介紹一下Winows里的「計劃任務」工具。「計劃任務」工具能夠定時打開我們設計的Access程序,「計劃任務」工具在需要在某個特定時刻執行某項程序的時候非常有用。

以Windows XP操作系統為例(Win7以後版本也有這個計劃任務工具,界面可能有所不同),選擇「開始→所有程序→附件→系統工具→任務計劃」命令,在「任務計劃」窗口中,單擊「添加任務計劃」按鈕,此時彈出「任務計劃嚮導」。在「任務計劃嚮導」對話框中單擊「下一步」按鈕,如圖所示。

在這一步中,我們選擇需要定時執行的程序,單擊「瀏覽」按鈕,選擇需要定時執行的Access文件,如圖所示。

進入下面的對話框後,我們給正在設置的任務計劃取一個名稱,在對話框下部,選擇「每天」單選框,表示我們的任務要每天執行。然後單擊「下一步」按鈕,如圖所示。

在下面的對話框中,指定任務的執行時間為8:00,當然根據實際情況的需要,也可以指定運行時間為午夜12:00,然後單擊「下一步」按鈕,如圖所示。

在這個對話框中,需要輸入你的計算機登錄時的密碼,輸入完成後,單擊「下一步」按鈕,如圖所示。

此時彈出如圖對話框,表示任務計劃設置完成。單擊「完成」按鈕,關閉「任務計劃嚮導」對話框,如圖所示。

現在,我們在「任務計劃」窗口中看到了新增加的任務計劃名稱,如圖所示。好了,現在只要保證我們的計算機處於開機的狀態,那麼每天早晨8:00,Access就會忠實地幫我們完成本來需要手動完成的工作了!如果我們的任務計劃設置在午夜12:00點,那麼,我們睡著大覺就把工作做完了!當然,你的計算機需要24小時保持開機。

本文選自《讓Excel飛》第二部分內容,對應的電子版,可閱讀:《Access帶你飛!》百度閱讀搜索_林書明


推薦閱讀:

如何用access搭建資料庫?
如何多用戶訪問access資料庫?
如何在VB6.0中輸入內容並和Excel進行關聯?
如何查找202萬個數據中重複次數為n的數據?

TAG:MicrosoftExcel | MicrosoftAccess |