利用OLE自動化解決ACESS97中文版報表生成器直線不能往下順延的缺陷
ACCESS97是一個非常優秀的數據庫軟件,它不僅能充當辦公自動化的桌面數據管理工具,也是一個開發Client/Server產品的優秀前端開發工具.它的特點是易學易用、工具豐富、不需寫大量代碼就可以在很短的時間內開發出界面優美且功能強大的系統,長期以來受到廣大開發者的青睐。但筆者在使用時發現其報表生成器中有一個明顯不適合我國國情的缺陷,就是當設置報表DETAIL節上的字段長度因為橫向空間不夠而設為自動向下順延(CanGrow屬性為True)時,如果字段旁有豎線(國內大部分公文報表都有豎線,而國外則很少有),則豎線不能和字段一起向下順延。使整個報表看起來不美觀。這個缺陷在ACCESS2.0和ACCESS97中文版上都有,而在FoxPro2.5B/3.0/5.0下卻沒有。據微軟技術服務部的工作人員說是由於本地化時測試不夠原因所致。為此,筆者在ACCESS內采用了OLE自動化!
方法,將ACCESS97查詢生成的表送交EXCEL97進行處理(分類匯總、打印、預演),較好地解決了這個問題。由於ACCESS97和EXCEL97的VBA在97版本上幾乎完全兼容,在EXCEL97下錄制的宏代碼只需在ACCESS下稍加修改就行了,所以采用此方法和用內部報表生成器設計所用的時間差不多。整個工作需要下面幾步:
在EXCEL97下設計好報表的樣式,包括表頭、頁眉、頁碼等,對需要自動翻轉的列,在"單元格格式設置"下設為"自動換行"。
在EXCEL97下錄制好當數據送入後進行的操作宏(如分類匯總、加邊框線,加空行、打印輸出、預演等動作)。
在ACCESS下用VBA語句和DAO對象的方法將數據送入EXCEL表內,並將EXCEL下宏操作變成ACCESS下的語句。
以下是ACCESS97下的程序代碼,實際應用程序界面是一個對話框屏幕(FORM),上面有五個下拉框(Comb_)和一個文字框(Text),由用戶選擇相應的信息,然後用戶按"確定"命令按鈕執行程序。其中有些屬性和方法在ACCESS2.0下不能使用,可采用相應的語句.
PrivateSub確認_Click()
OnErrorGoToErrorHandler
DimstDocNameAsString
DimkAsInteger
stDocName="Pqry_YEAR"
DoCmd.OpenQuerystDocName'從原始表內根據用戶輸入的信息條件運行"生成表查詢",生成一個供打印用的表.
'增加空記錄處理--為了保證記錄數少時也打印整張表.
IfVal(Me![Comb空行])>0Then'如果用戶輸入了大於0的數值,表示加空行
Fork=1ToVal(Me![Comb空行])
CurrentDb.Execute"INSERTINTOPqry_YEAR
(項目類)VALUES('空行空行空行');"
Nextk
EndIf
DimmsgVarAsInteger
'定義EXCEL對象變量
'------------------------------
DimxlobjAsObject
DimxlsheetobjAsObject
DimxlrangeAsObject
'------------------------------
'定義ACESS記錄集對象變量
DimdbsAsDatabase,rstAsRecordset
DimstrSQLAsString
DimrecTotal,fieldTotalAsInteger'recTotal:
表示該表內記錄總數;
fieldTotal表示字段總數
Dimi,jAsInteger
i=0
j=0
'Returnreferencetocurrentdatabase.
Setdbs=CurrentDb'當前數據庫
Setrst=dbs.OpenRecordset("Pqry_YEAR")'選擇記錄集
recTotal=rst.RecordCount'得出記錄數
fieldTotal=rst.Fields.Count'得出字段數
'----------------------------------
'建立EXCEL對象
Setxlobj=CreateObject("Excel.Application.8")
'打開設計好的EXCEL表--REPORT.XLS
xlobj.Workbooks.OpenFileName:=pPathname&"REPORT.xls"
Setxlsheetobj=xlobj.ActiveWorkbook.Worksheets("REPORT")
'指向工作表
'如果是改動過的表,不再打開
IfMsgBox("當前打印表格文件中已有數據,
是否需要更新?"
&Chr(13)&_
"提示:只有對數據進行改動後,才需要更新.",68)
=vbYesThen
DoCmd.HourglassTrue'由於時間較長,
將鼠標設為沙漏形狀
xlsheetobj.Rows("5:200").Select'選定區域
xlobj.Selection.DeleteShift:=-4162'
注意!原錄制宏中-4162為xlnone,是EXCEL97的常量,但在ACCESS下卻不認,只能到EXCEL下的對象浏覽器去查詢對應的常數.
'開始向EXCEL傳送數據
DoUntilrst.EOF
Forj=1TofieldTotal
xlsheetobj.cells(5 i,j).Value=rst.Fields(j-1)
Nextj
rst.MoveNext
i=i 1
Loop
rst.Close
'在EXCEL中調整,具體常數參見EXCEL下的對象浏覽器
xlsheetobj.Range("A4:Q"&Trim(Str(recTotal 4))).
Select'選定范圍
'以下為設置邊框線錄制的宏代碼,已刪除了相似的語句.
xlobj.Selection.Borders(5).LineStyle=-4142
xlobj.Selection.Borders(6).LineStyle=-4142
Withxlobj.Selection.Borders(7)
.LineStyle=1
.Weight=-4138
.ColorIndex=-4105
EndWith
Withxlobj.Selection
'確定是合計在表上還是在表尾
IfMe![Fram位置]=1Then
.SubtotalGroupBy:=2,Function:=-4157,
TotalList:=Array(6,9,10,_
11,12,13,14,15,16),Replace:=True,
PageBreaks:=False,_
SummaryBelowData:=False
Else
.SubtotalGroupBy:=2,Function:=-4157,
TotalList:=Array
(6,9,10,_
11,12,13,14,15,16),Replace:=True,
PageBreaks:=False,_
SummaryBelowData:=True
EndIf
EndWith
'根據用戶的選擇設置頁眉和頁尾。
Withxlsheetobj.PageSetup
.LeftHeader=""&Chr(10)&""&Chr(10)&"
"&Mid(Me![Cmbo單位],4)
.CenterHeader="&""宋體,加粗""&18"&Me!
[Cmbo年度]&"年"&Mid(Me![Cmbo類別],4)&"XXX表"
EndWith
xlsheetobj.Range("A1").Select
'將空行內容清掉
k=Val(Me![Comb空行])
IfVal(Me![Comb空行])>0Then
DimcontentAsString
i=5
content=xlsheetobj.cells(i,2).formulaR1C1
DoWhileInStr(1,content,"空行空行空行")=0
i=i 1
content=xlsheetobj.cells(i,2).formulaR1C1
Loop
xlsheetobj.Range("B"&Trim(Str(i-k 5))&":"&"Q"
&Trim(Str(i 5))).Select
xlobj.Selection.ClearContents
xlsheetobj.Range("A1").Select
EndIf
Else'不更新
xlsheetobj.Activate
EndIf
xlobj.ActiveWindow.SelectedSheets.PrintPreview'預演報表
'如為打印:xlobj.ActiveWindow.SelectedSheets.PrintOut
DoCmd.HourglassFalse'恢復鼠標形狀
xlobj.Visible=True'讓EXCEL可見
清除對象變量空間,節省內存
Setdbs=Nothing
Setxlobj=Nothing
xlobj.quit'關閉EXCEL
ExitSub
ErrorHandler:'出錯處理
DoCmd.HourglassFalse
MsgBox"Errornumber"&Err.Number&":"&Err.Description
'Resumewithstatementfollowingoccurrenceoferror.
ResumeNext
EndSub
通過這個例子我們看到在OFFICE97下利用OLE自動化擴展應用程序的功能是多麼方便和強大。用EXCEL完成的報表的優點是格式美觀,修改方便.缺點是第一次生成EXCEL表格時速度較慢.
本例是用EXCEL對數據進行報表操作,其實也可參照此例的方法在EXCEL上建立圖形統計、財務分析、數據透視表分析等應用程序,只要在EXCEL下錄制相應的宏,再加到ACCESS下就行了。->