![ACCESS窗體查詢實例_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/19/db5b6072-7427-4401-8e04-2d460974ebaa/db5b6072-7427-4401-8e04-2d460974ebaa1.gif)
![ACCESS窗體查詢實例_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/19/db5b6072-7427-4401-8e04-2d460974ebaa/db5b6072-7427-4401-8e04-2d460974ebaa2.gif)
![ACCESS窗體查詢實例_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/19/db5b6072-7427-4401-8e04-2d460974ebaa/db5b6072-7427-4401-8e04-2d460974ebaa3.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、一.概述作為數(shù)據(jù)管理程序,統(tǒng)計和查詢功能是非常重要的。否則,就和電子表格沒有 區(qū)別了。所以,在每個 ACCESS程序中都不可能缺少查詢的功能。本文的目的是由淺入深的介紹幾種最常用的利用主 /子窗體來實現(xiàn)查詢的方法, 使初學者和有一定VBA基礎的人可以更好的使用窗體查詢這種手段。附件中的窗體“常用窗體查詢 O.MDB ”,僅包含3個數(shù)據(jù)表、1個查詢和以這個 查詢?yōu)閿?shù)據(jù)源的報表。是為了大家根據(jù)后面學習的內容作練習用的。我們先看查詢中的數(shù)據(jù):書籍 編號書名類別作者出版社單價進書日期22CHIP-01-08報刊電子計算機與外部設 備期刊社電子計算機與外部 設備¥ 16.802001-9-28
2、25電腦新時代-6光盤光盤UNKNOWN電腦新時代¥ 5.002002-7-827學電腦-7光盤光盤UNKNOWN人民郵電¥ 5.002002-7-1328CHIP-02-07 光盤光盤電子計算機與外部設 備雜志社電子計算機與外部 設備¥ 5.002002-7-1316MCS醉習指南書籍Syngress Media 公司人民郵電¥ 62.002001-9-2817局域網原理與架設技 術內幕大公開書籍蔡昌均中國青年¥ 69.002001-9-2819AccessVBA 基礎書籍Eva nCallaha n人民郵電¥ 39.002001-
3、9-2820中文版 Access2001 冊通書籍趙琳等人民郵電¥ 42.002001-9-2821VISUALBASIC5.0 教程書籍SteveBrow n電子工業(yè)¥ 28.002001-9-2823中文版VisualBasic5.0 程序員指南書籍microsoft中國青年¥ 70.002001-9-2824Access中文版開發(fā)指 南書籍Alison Balter人民郵電¥ 128.002002-2-1629Access 2002數(shù)據(jù)庫系統(tǒng)開發(fā)實例導航書籍桂思強中國鐵道¥ 25.002003-3-1030中國名陵集中華古代名陵之大成書籍
4、羅哲文等百花文藝¥ 14.002003-5-2031邊緣部落一一福音谷書籍林茨(撰文攝影)河北教育¥ 27.002003-5-20為了比較有代表性,這個查詢中包含多種字段類型:數(shù)字類型:【書籍編號】、【單價】字符類型:【書名】、【類別】、【作者】、【出版社】 日期類型:【進書日期】在多條件查詢中,我們會使用除了【書籍編號】之外的其他字段作為查詢條件。其實,在下面介紹的窗體查詢方法中,有些代碼或思路也可以應用在其它窗體 查詢方法中,你對各種代碼、方法和思路越熟練,就越能充分發(fā)揮它們的作用。這篇文章我是從4月初開始構思,到5月中旬開始動筆,花費兩周時間寫成, 里面包含了我對AC
5、CESS窗體查詢所積累的經驗,對初學者和有一定VBA基礎 的人都有針對性的方法。另外,希望其他精通 ACCESS的高手提出意見。二.制作主/子窗體的步驟1. 利用向導制作主窗體話確予舊萍衣審的布局:期 剋 B 別舌股價書 擱怕出里詵丄2>|<|“詒聯(lián)走囪住上股用疇些孑段:可從實千表或査訶中堆皿.I程詢:再書蚤詢P可用宇毆:私査詢取謝 | 卜 r |下芫成®取消 | 上一步(B】|下TOP芫成©諾為宙借措定你題:収上是片號創(chuàng)逢畝住所需的全部詰啟.誦確至黑委打開竊讀還是要俵改宙怖設計廠打開裔體查看或輔入信.息 柑務垠曾體設計M)廠顯看有關硬用菊悻的粘BhdD活請至斯
6、再稈式|存書査匚殖煒l£J 叭5蜒鷲111g匚11融si-F取謝 上一步(B) |下一歩0!)芫威®取洎 上一齒耐"|芫威(fF|現(xiàn)在的主窗體還太小,要已經以下步驟才能變成我們需要的主窗體(如下圖): 把窗體面積放大到足以容納條件輸入字段和子窗體,并調整所有控件的字體; 把窗體的“記錄源”和各控件的“數(shù)據(jù)來源”都刪除(很多初學者很容易犯 的錯誤就是這里),把類別和出版社改為組合框(因為這些字段的可能值比較少, 直接選擇就好,不必讓用戶輸入); 重新調整各字段的位置,并增加了兩個空文本框和標簽放在單價和進書日期 后面(因為我打算使用一個范圍來作查詢條件,而不是一個固
7、定的值,這樣比 較符合實際); 單價后面的兩個文本框改名為“單價開始”和“單價截止”,進書日期后面的 兩個文本框改名為“進書日期開始”和“進書日期截止”; 畫一個矩形框包住所有查詢條件,把矩形框背景設置為常規(guī),背景色為深灰 色,特殊樣式為凹陷,此時矩形框覆蓋了其它控件,要用菜單中“格式"Ta置 于底層”才能讓它們顯示出來; 在窗體上用向導建立一個按鈕,按鈕標題是“查詢”,名稱是“ cmd查詢”先 不管里面的代碼,后面再修改; 窗體屬性中“記錄選定器”=否,“瀏覽按鈕”=否。2. 利用向導設計子窗體可炭用現(xiàn)有畝住創(chuàng)建子畝徉惑子報養(yǎng)"也可以幣表和/卓查詢目 訂創(chuàng)屯誦確足在子筍1
8、$豐子報衷中色色哪些乎図誦湧將陽于子旨住或子報表的數(shù)據(jù)來詛.p阻弔現(xiàn)帕漲槿詢臣用現(xiàn)石的世訐Z1查詢:存書至詞可用字段:可口叢E盍茅亍歪利i£査詢中堆搖乎段.5稔 牡18名SJ者版階 書書笑隹$*%書日期取甜I|下一歩昭)|取詢11上一歩叩|下一步|完成叩 在主窗體中用工具箱中的“子窗體/子報表”對象建立一個子窗體; 以存書查詢?yōu)橛涗浽?,選擇所有字段; 把子窗體命名為“存書查詢子窗體”; 在主窗體上刪除子窗體的標簽,并重新調整子窗體的大?。?關閉主窗體的設計視圖,單獨打開子窗體數(shù)據(jù)表視圖,調整字體和行的大小現(xiàn)在,我們得到了如下的窗體:現(xiàn)在還沒有實際的查詢功能,我們在后面要根據(jù)所使用的方
9、法,修改窗體并增 加一些其他的功能。還有一些小的細節(jié)要注意,比如:按 TAB鍵后的獲得光標的控件的順序要在設 計視圖下,視圖菜單的“ TAB鍵次序”來修改;有些文本框獲得焦點后是否要 打開輸入法,比如輸入單價和日期的地方要關閉,輸入書名和作者的地方要打 開,這些要在控件屬性中設置。.查詢方法1:在查詢中加入條件這種方法對應的實例數(shù)據(jù)庫是:“常用窗體查詢1.MDB1. 設計查詢我們打開“存書查詢”設計視圖如下:在字段【書名】的準則格內寫入:Like llf(lsNull(Forms!存書查詢窗體!書名),'*','*'& Forms!存書查詢窗體!書名&a
10、mp; '*')加入后的設計視圖如下:把這個式子解釋一下:LIKE :是專門用于查詢字符型字段的運算符,一般介紹 ACCESS的書中都有它 的用法。ISNULL(Forms!存書查詢窗體!書名):是用來判斷窗體“存書查詢窗體”上 面的“書名”這個文本框是否是空的。如果文本框是空的,貝心ISNULL(Forms!存書查詢窗體!書名)=TRUE (真)如果文本框不是空的,貝心ISNULL(Forms!存書查詢窗體!書名)=FALSE (假)IIF(EXPR, TRUEPART, FALSEPART)函數(shù):EXPR必要參數(shù)。用來判斷真?zhèn)蔚谋磉_式TRUEPART必要參數(shù)。如果 EXPR
11、為TRUE,則返回這部分的值或表達式。FALSEPART必要參數(shù)。如果 EXPR為FALSE,則返回這部分的值或表達式所以當我們在窗體“存書查詢窗體”上面的“書名”里寫上“ACCESS”,整個式子的結果是:LIKE *ACCESS*相當于查詢所有書名中包含“ ACCESS”的書籍,這樣可以實現(xiàn)模糊查詢Like llf(lsNull(Forms!存書查詢窗體!書名),'*', Forms!存書查詢窗體!書名& '*')Like llf(lsNull(Forms!存書查詢窗體!書名),'*', Forms!存書查詢窗體!書名)如果把準則改為上
12、面兩句中的一句,同樣情況下當我們在窗體“存書查詢窗體” 上面的“書名”里寫上“ ACCESS”,整個式子的結果是:LIKE ACCESS*LIKE ACCESS相當于查詢以“ACCESS”開頭的書籍(半模糊查詢),或者書名就叫“ACCESS” 的書(精確查詢)。具體使用那一種形式的查詢要根據(jù)你的實際情況來修改。當我們在窗體“存書查詢窗體”上面的“書名”里什么也沒有寫,整個式子的 結果是:LIKE *相當于查詢所有的有書名的書 在書寫查詢準則時,F(xiàn)orms!存書查詢窗體!書名這樣的窗體控件名很難寫, 這時你可以在準則格內點鼠標右鍵,選擇生成器,出現(xiàn)如下圖的窗口:在左邊的樹型列表框里找到控件所在的
13、窗體,在中間列表框出現(xiàn)這個窗體包含 的所有控件,雙擊控件名,就會出現(xiàn)“ Forms!存書查詢窗體!書名”。我們再把其他幾個字段的查詢準則寫出:【類別】:在窗體上是組合框,所以它肯定是個精確查詢,跟【書名】一樣,它 是文本字段。查詢準則如下:Like llf(lsNull(Forms!存書查詢窗體!類別),'*',Forms!存書查詢窗體!類別)【作者】:跟【書名】一樣,它是文本字段。我也打算用模糊查詢。查詢準則如下:Like llf(lsNull(Forms!存書查詢窗體!作者),'*','*'& Forms!存書查詢窗體!作者&
14、 '*')【出版社】:跟【類別】的情況完全一樣。查詢準則如下:Like IIf(IsNull(Forms!存書查詢窗體!出版社),'*',Forms! 存書查詢窗體!出版社)【單價】:是一個數(shù)字字段,我在這里準備讓用戶可以查詢“1.5元6.5元”這樣的范圍。查詢準則如下:Between IIf(IsNull(Forms!存書查詢窗體!單價開始),0,Forms!存書查詢窗體!單價開始)And IIf(IsNull(Forms!存書查詢窗體!單價截止),5000,Forms!存書查詢窗體!單價截止)BETWEEN AND :是查詢符合某個范圍之內的值所需的條件格式
15、?!?BETWEEN 1 AND 5 ”相當于“【字段】1 AND【字段】W 5”。根據(jù)前面講解的IIF的內容,我用一個表格來解釋一下各種情況下這個式子的實 際結果,便于大家理解:(0和5000是我事先在條件中設定的最小值和最大值)單價開始的值單價截止的值整個式子的實際結果空空BETWEEN 0 AND 50001.5空BETWEEN 1.5 AND 5000空20BETWEEN 0 AND 201.56.5BETWEEN 1.5 AND 6.5【進書日期】:是一個日期型字段,我在這里準備讓用戶可以查詢“#2001-5-1# #2002-5-1#”這樣的范圍。查詢準則如下:Between (l
16、lf(lsNull(Forms!存書查詢窗體!進書日期開始),#2000-1-1#,Forms! 存書查詢窗體! 進書日期開始) And (llf(lsNull(Forms!存書查詢窗體! 進書日期截止),#2099-12-31#,Forms!存書查詢窗體!進書日期截止)在這個式子中,#2000-1-1#和#2099-12-31#是我設定的兩個默認的開始和截止日 期。如果用戶不輸入,就使用默認值了。這和前面【單價】的情況是一樣的。2. 設計按鈕及代碼2.1查詢按鈕查詢按鈕的代碼非常簡單,關鍵部分只有一句:Private Sub cmd 查詢 _Click()Me.存書查詢子窗體.Requery
17、 ' 這句是關鍵End SubREQUERY :是用來重新查詢控件的數(shù)據(jù)源,這樣可以刷新子窗體顯示的記錄。 對于記錄源是表或查詢的控件如窗體、列表框、組合框等經常用Requery方法來 刷新顯示內容。2.2清除按鈕有了查詢按鈕的代碼之后,大家就可以自己測試查詢的效果了。不過,每次想 換一個查詢的條件時要清除上一個條件輸入的東西,有時候比較麻煩。我們再 來設計一個清除條件的按鈕,控件名稱是“cmd清除”,放在查詢按鈕的下面按鈕的代碼如下:Private Sub cmd 清除 _Click()' 下面這些控件的值要清空Me.書名=NullMe.類別=NullMe.作者=NullMe
18、. 出版社=NullMe. 單價開始=NullMe. 單價截止=NullMe.進書日期開始=NullMe.進書日期截止=NullMe.存書查詢子窗體.Requery '清空之后一樣要重新查詢End Sub2.3打印按鈕有了查詢結果,想打印出來,很簡單。由于報表的記錄源就是“存書查詢”,所以在查詢里設計的條件會直接在報表里體現(xiàn)出來。我們只要用按鈕向導制作一個預覽報表的按鈕就可以了。我們把這個按鈕放在 子窗體下面的右邊??丶Q是“ cmd預覽報表”。由于完全是采用向導制作的,不需修改代碼,所以我就不在這里列出代碼了。2.4導出EXCEL按鈕如果你覺得ACCESS的報表邊框太難看,或者你想
19、在報表上加上一些說明什么 的。你可能更愿意把數(shù)據(jù)導出到 EXCEL里進行再加工。為了初學者容易理解,我打算用一個宏來解決這個問題。宏的設計如下圖:現(xiàn)在,宏里“輸出文件”為空,運行時會自動跳出對話框讓你選擇保存目錄和 文件名。如果你想保存在數(shù)據(jù)庫所在目錄下的“查詢結果.xls ”里,可以在“輸出文件” 一欄里填入:查詢結果.xls"把這個宏存為“導出查詢數(shù)據(jù)宏” 然后再在窗體里加入按鈕。當按鈕向導出現(xiàn)后,直接取消。在按鈕的屬性頁里, 先把按鈕名稱改為“cmd導出”,在按鈕的“單擊事件”里直接用下拉框選擇“導 出查詢數(shù)據(jù)宏”,如下圖。這樣就不必編寫代碼了。百命令按鈕;Ed導出爭件|其他|
20、全部|I卜” I導出查詢數(shù)據(jù)宏3. 增加統(tǒng)計功能經常有人需要在主窗體上顯示符合查詢條件的記錄總數(shù),以及子窗體中某一字 段的合計。所以,我們也準備在主窗體上增加記錄總數(shù)和單價的合計。3.1子窗體上的設計 單獨打開子窗體的設計模式,在窗體頁腳部分拉出一段窗體; 在上面增加兩個文本框:一個是“ txt計數(shù)”,控件來源二Count(*),另一個是txt單價合計”,控件來源二Sum(單價); 在子窗體的窗體屬性中設置:瀏覽按鈕=否,記錄集類型=快照(快照的運 行速度快,占用內存少,但不能編輯更新,正適合我們的需要) ;3.2主窗體上的設計持合條件記錄載:卜存書查詢二單價合計:卜存書査詢冇預覽報表潔玲入奢
21、詢條件導出EXCEL 在子窗體下面的地方設計兩個文本框“計數(shù)”和“合計”,把它們的標簽改為 “符合條件記錄數(shù):”和“單價合計:”; “計數(shù)”文本框的控件來源=存書查詢子窗體.Form.txt計數(shù),“合計”文 本框的控件來源=存書查詢子窗體.Form.txt單價合計; 由于主窗體上的這兩個文本框是自動計算的,為了區(qū)別,設置它們的是否有 效=否,是否鎖定=是,背景顏色=深灰色。4. 方法總結現(xiàn)在,整個窗體就已經完成了。大家可以使用各種條件組合來測試一下窗體的 效果。匕戰(zhàn)社"3書縉H號菟JWftft*21>ISUALEi.SIC5,。執(zhí)甩電干二毀A c ._eu s 2加2取師廉航幵
22、笈窩曲號骯書籍中國*30B國居陛一賓t華吉tts陛才乂應31莎苗茗一晉各林叢河北彳單忻賞計;|號出噫花匚羊(530邊書 mn Izooo-i-i至3099-32-3:!4.1本方法優(yōu)點在查詢中加入條件這種方法比較簡單,只要在查詢中設計好各字段的條件,那 么窗體中的代碼就非常少,而且在打印報表和導出數(shù)據(jù)方面也很容易設計,比 較適合初學ACCESS的人使用。4.2本方法缺點 對查詢中的數(shù)據(jù)有限制,所有設計了條件的字段中必須是每條記錄都有數(shù)據(jù)。 即使你在窗體中并沒有在這個字段對應的文本框中輸入條件。舉例來說,假設你在表“ tb藏書情況”中,把【書籍編號】=16對應的這本書的 作者或單價刪掉,在“存書
23、查詢窗體”中,即使你不輸入任何條件,【書籍編號】 =16對應的這本書你也看不見。 如果在某個查詢組合下,子窗體上根本沒有符合條件的記錄,則主窗體上的 “記錄數(shù)”和“合計”會顯示“#錯誤”。如果把主窗體上的“記錄數(shù)”和“合計”的控件來源改為:=llf(lsError(存書查詢子窗體.Form.txt 計數(shù)),0, 存書查詢子窗體.Form.txt 計數(shù))=llf(lsError(存書查詢子窗體.Form.txt 單價合計),0, 存書查詢子窗體.Form.txt 單價合計)則不會出現(xiàn)“#錯誤”,這是我在下面地址學到的:http:/www.erpbus. net/access/topic.asp?
24、topic_id=8183&forumd=44 報表不能直接打開,每次打開報表就會跳出提示框要求輸入條件。四.查詢方法2 :用VBA生成窗體篩選條件這種方法對應的實例數(shù)據(jù)庫是:“常用窗體查詢2.MDB ”。主窗體的控件與“常用窗體查詢 1.MDB ”相同,只是按鈕中的代碼都改了。子 窗體則完全相同?!按鏁樵儭敝胁恍枰斎肴魏螚l件。1.按鈕代碼設計1.1查詢按鈕本按鈕代碼的設計思想是根據(jù)主窗體上各個條件輸入控件的值,用VBA代碼生成一個條件組合的字符串作為子窗體的窗體篩選的條件。'判斷【書名】條件是否有輸入的值If Not lsNull(Me.書名)Then' 有輸入s
25、trWhere = strWhere & "(書名like '*" & Me.書名 & "*') AND "End If& :是字符串鏈接運算符,它和“ + ”不同之處在于“ &”兩邊如果不是字符串 表達式,它會自動把表達式的值變成字符串,省了你轉換格式了。"(書名LIKE '*":英文雙引號是VBA用來表示字符串的符號,兩個雙引號中 間是一個字符串。""兩個雙引號中間什么也沒有,表示一個空字符串。注意:空字符串工NULL (空值)。所以IsNull(
26、"")=False。'*ACCESS*':英文單引號是SQL語句中用來表示字符串的符號,兩個單引號中 間是一個字符串。(SQL語句中也可以使用雙引號來表示字符串,但在VBA代碼生成SQL語句時,為了簡化格式,一律用單引號表示SQL語句內的字符串)書名:用表明書名是一個字段名、表名或查詢名。使用的作用:可以明確中間是一個名字而不是函數(shù);當字段名、表名或查詢名是ACCESS或VBA保留字(如:DATE、NOTE、TYPEOF等)時,一定要用來標明;當字段名、 表名或查詢名中包含特殊字符(如停止/截止日期、查詢-合計等)時,一定 要用來標明,否則特殊字符會被當作算
27、術運算符而導致出錯。ME.書名:是“存書查詢窗體”上文本框“書名”的值。Me.書名二Me.書名.Value。 Me是對代碼所在窗體的引用。劉小軍(Alex ) 2003-515如果此時“存書查詢窗體”上文本框“書名”的值是"ACCESS",那么此時strWhere 的結果就是:"(書名like '*ACCESS*') AND "跟查詢方法1中一樣,我們也可以改為半模糊查詢和精確查詢,代碼如下:strWhere = strWhere & "(書名like '" & Me.書名 & &quo
28、t;*') AND "strWhere = strWhere & "(書名like '" & Me.書名 & "') AND "接著看關于【單價】的代碼:'判斷【單價】條件是否有輸入的值,由于有【單價開始】【單價截止】兩個文本框' 所以要分開來考慮If Not lsNull(Me.單價開始)Then'【單價開始】有輸入strWhere = strWhere & "(單價="& Me. 單價開始 & ") AND &quo
29、t;End IfIf Not lsNull(Me.單價截止)Then'【單價截止】有輸入strWhere = strWhere & "(單價="& Me. 單價截止 & ") AND "End If這里用“ =”“ =”來代替“ BETWEEN AND ”,效果是一樣的,只是不需要 像查詢方法1中那樣如果不填數(shù)字,會分別寫入0和5000。再來看看關于【進書日期】的代碼:'判斷【進書日期】條件是否有輸入的值,由于有【進書日期開始】【進書日期截止】兩個文本框' 所以要分開來考慮If Not IsNull(Me.
30、進書日期開始)Then'【進書日期開始】有輸入strWhere = strWhere & "(進書日期=#" & Format(Me.進書日期開始,"yyyy-mm-dd") & "#)AND "End IfIf Not IsNull(Me.進書日期截止)Then'【進書日期截止】有輸入strWhere = strWhere & "(進書日期=#" & Format(Me.進書日期截止,"yyyy-mm-dd") & "#
31、)AND "End If使用Format(Me.進書日期開始,"yyyy-mm-dd"),而不是直接用 Me.進書日期開始,是因為有 時候直接用Me進書日期開始的話,會因為計算機日期格式設置的不同而出現(xiàn)一些奇 怪的問題。ACCESS中的日期條件一直都是比較麻煩的,不管是選擇查詢、追 加查詢還是交叉表查詢,設置日期字段的條件都是要特別注意的。(像查詢方法1中直接在查詢準則中引用控件值雖然不會出現(xiàn)類似問題,但交叉表查詢中不能使用控件作為日期字段的條件。)' 先在立即窗口顯示一下 strWhere的值,代碼調試完成后可以取消下一句Debug.Pri nt str
32、WhereDEBUG.PRINT:是專門用于調試的語句,它會把后面表達式的值顯示在VB編輯器的立即窗口里。在適當?shù)氐胤讲迦隓ebug.Pri nt可以檢查程序運行的是否正確。等全部調試結束后,可以把他們都刪掉。' 讓子窗體應用窗體查詢Me. 存書查詢子窗體.Form.Filter = strWhereMe. 存書查詢子窗體.Form.FilterOn = True主窗體或單一窗體設置篩選字符串時用:Me.Filter=""或是 Forms!XX 窗體.Filter二""。' 在子窗體篩選后要運行一下自編子程序CheckSubformCou
33、 nt()Call CheckSubformCou ntCheckSubformCount是一個自編的子程序,CALL是調用子程序的語句,也可以 不寫CALL直接用CheckSubformCount調用子程序。1.2清除按鈕代碼里都有說明,只講以下的一段代碼:For Each ctl In Me.C on trols' 根據(jù)ctl的控件類型來選擇Select Case ctl.C on trolTypeCase acTextBox '是文本框,要清空(注意,子窗體下面還有兩個鎖定的文本框不能賦值)If ctl.Locked = False Then ctl.Value = Nu
34、llCase acComboBox '是組合框,也要清空ctl.Value = Null'其它類型的控件不處理End SelectNextFOR EACH CTL IN ME.CONTROLS :意思是把當前窗體內所有的控件都逐個引 用一次(子窗體控件內的控件不算在內)。這種用“ For Each對象或屬性In 對 象集合或屬性集合”的遍歷方法在ACCESS編程中屬于比較常見的用法,用處 也很多。比如最常見的檢查窗體是否打開的代碼中也有:Function lsLoaded(strFrmName As String) As Boolea n'確定一個窗體是否已被裝載。Co
35、nst conFo rmDesig n = 0Dim objForm As FormIsLoaded = FalseFor Each objForm In FormsIf objForm.FormName = strFrmName The nIf objForm.Curre ntView <> con FormDesig n The n '窗體不是設計模式時IsLoaded = TrueExit Fun ction '一旦找到了此窗體,就退出本函數(shù)。End IfEnd IfNextEnd Function1.3預覽報表按鈕預覽報表按鈕中關鍵是如下語句:strWher
36、e = Me. 存書查詢子窗體.Form.Filter'在打開報表的同時把子窗體的篩選條件字符串也傳遞給報表,' 這樣地話報表也會顯示和子窗體相同的記錄。DoCmd.Ope nReport stDocName, acPreview, , strWhere在我曾經制作的另一個例子:“打印當前記錄的例子”里也使用過類似的方法。這個例子可以在 下載。關于DoCmd.OpenReport的詳細幫助,可以在 VBA幫助里找到。1.4導出按鈕導出方法只能把表或者查詢的內容導出到EXCEL,但是不能把窗體上的記錄集(RECORDSET)導出。所以我們要把子窗體的內容轉變?yōu)橐粋€查詢。我在查詢中
37、增加了一個“查詢結果”,其中的設計隨便就行,因為每次在使用這 個查詢之前,我們都會用 DAO修改查詢的SQL語句。思路很簡單,如果子窗體的篩選條件字符串是:(類別Like ' 書籍')AND ( 單價>=20)那么,我們把“查詢結果”的SQL語句改為:SELECT * FROM 存書查詢 WHERE (類別Like ' 書籍')AND ( 單價>=20)這樣的話,“查詢結果”的記錄與子窗體里的記錄就是相同的劉小軍(Alex)2003-5對應的代碼如下:strWhere = Me.存書查詢子窗體.Form.FilterIf strWhere = &qu
38、ot;" Then'沒有條件strSQL = "SELECT * FROM 存書查詢"Else有條件strSQL = "SELECT * FROM End If存書查詢WHERE " & strWhere這部分用來準備查詢的SQL語句。Set qdf = Curre ntDb.QueryDefs(” qdf.SQL = strSQL qdf.Close查詢結果")Set qdf = Noth ing這一部分用來把做好的SQL語句放在查詢中DoCmd.OutputTo acOutputQuery,"查詢結果&q
39、uot;, acFormatXLS, , True這一部分的作用,和查詢方法1中的“導出查詢數(shù)據(jù)宏”的作用相同。運行時 會自動跳出對話框讓你選擇保存目錄和文件名。如果你想保存在數(shù)據(jù)庫所在目 錄下的“查詢結果.xls”里,可以把這一句改為:查詢結果.xls"DoCmd.OutputTo acOutputQuery,"查詢結果", acFormatXLS, strOutputFileName , True如果你想在文件名上保留時間,以便知道是什么時候做的查詢,可以改為:查詢結果-"& _Format(Date(),"yyyymmdd&quo
40、t;) & ".xls"DoCmd.OutputTo acOutputQuery,"查詢結果", acFormatXLS, strOutputFileName , True_:英文下劃線表明下一行和本行是同一條語句,在語句比較長時,為了便于閱 讀,可以用這種方法把每行變短一些。下劃線之前要有一個空格作分隔,不然 可能會被當作字段名的一部分。1.5 CheckSubformCount 子程序這段子程序的目的在代碼中已經解釋了。目前實例數(shù)據(jù)庫中的代碼中是用代碼 設置文本框的“控件來源”。也可以直接用代碼設置控件的值(前提條件是在窗 體的設計視圖中,把
41、兩個文本框的控件來源都刪掉,使控件變成未綁定)。此外, 我再加幾句代碼,當子窗體無記錄時,下面的導出和預覽按鈕都變成灰色。這 樣的軟件顯得更專業(yè)一些。代碼如下:If Me.存書查詢子窗體.Form.Recordset.RecordCount > 0 Then'子窗體的記錄數(shù)0Me.計數(shù)=Me.存書查詢子窗體.Form.txt計數(shù)Me.合計=Me.存書查詢子窗體.Form.txt單價合計Me.cmd導出.Enabled = TrueMe.cmd預覽報表.Enabled = TrueElse'子窗體的記錄數(shù)=0Me.計數(shù)=0Me.合計=0Me.cmd導出.Enabled =
42、FalseMe.cmd預覽報表.Enabled = FalseEnd If2.方法總結使用VBA來設置子窗體篩選條件的方法解決了方法 1中的幾個缺點,大家可以 逐一測試。但是編寫這樣的VBA代碼需要對VBA比較熟悉,而且要求對邏輯運算有一定 基礎,不然在使用邏輯運算符 AND/OR/NOT和括號組合時會出錯。不太適合初 學者使用。五.主子窗體交叉表查詢實例這種方法對應的實例數(shù)據(jù)庫是:“常用窗體查詢3.MDB交叉表查詢通常作為統(tǒng)計之用,所以查詢條件少了一些。一般學習ACCESS的人,都有可能會被ACCESS的向導誤導,以為子窗體控件 里面一定要放一個子窗體。其實不是,在我的這個例子里,子窗體的對
43、象其實 就是交叉查詢,如下圖。子窗休/于報盍:存書杳詢子窗休源對象 鏈接子孚段 灘接主字盤是否有婁t . , , - r , 是舌速走,金刖匕旬.存書查詢芟更表表.tb就書'昏呪 表.t砒版壯名單 表lb規(guī)團查詢存書查誨直詢.存書宜I址交冥表一直有人問,對于交叉表這樣字段數(shù)量不固定的,怎樣在子窗體中顯示。其實, 直接在子窗體里顯示交叉表本身是最簡單的辦法。另一種方法是事先設計一個包含很多未綁定字段文本框的數(shù)據(jù)表窗體,在顯示 之前,先用VBA設置窗體的“記錄源”和各文本框的“控件來源”,同時還要 控制沒有字段可以顯示的那些列要隱藏,然后再顯示出來。但這樣設計要求編 寫比較多的代碼,只適合比較熟悉 VBA的人使用。(我在這個例子的報表中設 計了類似的代碼,可以參考。)1. 按鈕設計1.1查詢按鈕先看一下沒有條件的交叉表查詢的 SQL語句:TRANSFORM SumK書查詢單價)AS 單價之SumSELECT存書查詢類別FROM存書查詢GROUP BY存書查詢類別PIVOT Format(進書日期,"yyyy/mm");再看一下設置了條件的交叉
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年企業(yè)合作擔保合同
- 隧道工程泥漿處理合同
- 2025年健康生活方式推廣廣告合同
- 園林綠化項目終止施工合同示例
- 游戲代理協(xié)議合同
- 2025年工量具木盒行業(yè)深度研究分析報告
- 生物燃料技術研發(fā)合同2024
- 2025年中國茯苓種植行業(yè)發(fā)展監(jiān)測及投資前景展望報告
- 2024年物聯(lián)網基礎設施建設合作合同
- 2025年度城市綠化工程基礎土方供應合同
- 蟲洞書簡全套8本
- 2023年《反電信網絡詐騙法》專題普法宣傳
- 小學數(shù)學五年級上、下冊口算題大全
- 和平精英電競賽事
- 熱應激的防與控
- 輸液港用無損傷針相關知識
- 高標準農田施工組織設計(全)
- 職業(yè)安全健康工作總結(2篇)
- 14S501-1 球墨鑄鐵單層井蓋及踏步施工
- YB 4022-1991耐火泥漿荷重軟化溫度試驗方法(示差-升溫法)
- 水土保持方案中沉沙池的布設技術
評論
0/150
提交評論