設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 6652|回復(fù): 6
打印 上一主題 下一主題

[模塊/函數(shù)] 【Access小品】一打兩就--自定義函數(shù)編制講座五

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2011-6-14 21:09:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 todaynew 于 2011-6-15 06:59 編輯

  版友付謙同志問如何導(dǎo)出子窗體中的數(shù)據(jù)到Excel表中,這個問題有非常多的解法。我想結(jié)合這個問題說一下,編寫自定義函數(shù)時注意其運用的多角度多方面的問題。標(biāo)題中的“一打兩就”是湖北人常用的口頭禪,是一石二鳥、一箭雙雕的意思。寫自定義函數(shù)時,要善于拆分功能,使之各個部分能獨立的運用。

  我們知道導(dǎo)出Excel表可以用DoCmd.OutputTo、DoCmd.TransferDatabase、DoCmd.TransferSpreadsheet等方法,這類方法使用中有一個條件,就是必須針對數(shù)據(jù)表或者查詢,不能用sql語句字符串。要想用這類方法,就需要建立查詢。于是我們可以寫一個如下的函數(shù)來導(dǎo)出子窗體中的記錄:

Public Function 導(dǎo)出E(frm As Form)
'示例:導(dǎo)出E(me.子窗體.form)
Dim Qdef As QueryDef
Dim ssql As String
Dim strwh As String
ssql = frm.RecordSource
ssql = Trim(ssql)
If Right(ssql, 1) = ";" Then
    ssql = Left(ssql, Len(ssql) - 1)
End If
ssql = "select * from (" & ssql & ") where "
strwh = "True"
If frm.Filter <> "" Then
    strwh = strwh & " and " & frm.Filter
End If
ssql = ssql & strwh
Set Qdef = CurrentDb.CreateQueryDef("TempQ")
Qdef.SQL = ssql
DoCmd.OutputTo acOutputQuery, "TempQ", acFormatXLS
DoCmd.DeleteObject acQuery, "TempQ"
Qdef.Close
Set Qdef = Nothing
End Function

  這個函數(shù)的處理過程中,實際上進行了三個主要步驟,其一是用子窗體的數(shù)據(jù)源和篩選獲得一個SQL語句字符串,其二是創(chuàng)建一個查詢,其三是導(dǎo)出Excel表。這三個步驟中的前兩個實際上在其他方面也會有運用,比如可以用第一個步驟得到的sql語句字符串進行ADO計算,再比如用第二個步驟創(chuàng)建查詢的方法做其他用途。由此我們就可以考慮到,將上面的函數(shù)做功能上的解構(gòu),形成相對獨立的函數(shù)。這樣我們可以寫三個自定義函數(shù)如下:

Public Function GetfrmSql(frm as Form) as String
'得到窗體sql語句字符串
Dim ssql As String
Dim strwh As String
ssql = frm.RecordSource
ssql = Trim(ssql)
If Right(ssql, 1) = ";" Then
    ssql = Left(ssql, Len(ssql) - 1)
End If
ssql = "select * from (" & ssql & ") where "
strwh = "True"
If frm.Filter <> "" Then
    strwh = strwh & " and " & frm.Filter
End If
ssql = ssql & strwh
GetfrmSql=ssql
End Function

Public Function CrtQDef(strname As String, strsql As String)
'創(chuàng)建查詢
Dim Qdef As QueryDef
Set Qdef = CurrentDb.CreateQueryDef(strname)
Qdef.SQL = strsql
Qdef.Close
Set Qdef = Nothing
End Function

Public Function AccToExl(frm As Form)
'示例:導(dǎo)出E(me.子窗體.form)
Dim Qdef As QueryDef
Set Qdef = CurrentDb.CreateQueryDef("TempQ")
Qdef.SQL = GetfrmSql(frm)
DoCmd.OutputTo acOutputQuery, "TempQ", acFormatXLS
DoCmd.DeleteObject acQuery, "TempQ"
Qdef.Close
Set Qdef = Nothing
End Function

  通過上面的改造,三個函數(shù)均可單獨運用于多個方面,也便就起到了一打兩就、一石二鳥、一箭雙雕的作用了。

本帖被以下淘專輯推薦:

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享分享 分享淘帖1 訂閱訂閱
2#
發(fā)表于 2011-6-14 22:46:44 | 只看該作者
先下手為強!
3#
發(fā)表于 2011-6-15 14:46:42 | 只看該作者
報到,學(xué)習(xí)!

點擊這里給我發(fā)消息

4#
發(fā)表于 2011-6-15 11:49:25 | 只看該作者
收藏了!
5#
發(fā)表于 2011-6-15 13:04:10 | 只看該作者
6#
發(fā)表于 2011-8-9 14:56:45 | 只看該作者
學(xué)習(xí)先
7#
發(fā)表于 2011-9-13 07:49:22 | 只看該作者
收藏了!
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-13 07:58 , Processed in 0.173995 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表