技術(shù) 點
- 技術(shù)
- 點
- V幣
- 點
- 積分
- 21536
|
本帖最后由 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ù)均可單獨運用于多個方面,也便就起到了一打兩就、一石二鳥、一箭雙雕的作用了。
|
|