?? 04.txt
字號:
Access97的報表解決方案
利用OLE自動化解決ACESS97中文版報表生成器直線不能往下順延的缺陷
ACCESS97 是一個非常優秀的數據庫軟件, 它不僅能充當辦公自動化的桌面數據管理工具, 也是一個開發Client/Server 產品的優秀前端開發工具. 它的特點是易學易用、工具豐富、不需寫大量代碼就可以在很短的時間內開發出界面優美且功能強大的系統,長期以來受到廣大開發者的青睞。但筆者在使用時發現其報表生成器中有一個明顯不適合我國國情的缺陷,就是當設置報表DETAIL 節上的字段長度因為橫向空間不夠而設為自動向下順延(Can Grow 屬性為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 下不能使用, 可采用相應的語句.
Private Sub 確認_Click()
On Error GoTo ErrorHandler
Dim stDocName As String
Dim k As Integer
stDocName = "Pqry_YEAR"
DoCmd.OpenQuery stDocName ' 從原始表內根據用戶輸入的信息條件運行" 生成表查詢", 生成一個供打印用的表.
' 增加空記錄處理-- 為了保證記錄數少時也打印整張表.
If Val(Me![Comb 空行]) > 0 Then ' 如果用戶輸入了大于0 的數值, 表示加空行
For k = 1 To Val(Me![Comb 空行])
CurrentDb.Execute "INSERT INTO Pqry_YEAR
( 項目類) VALUES (' 空行空行空行');"
Next k
End If
Dim msgVar As Integer
' 定義EXCEL 對象變量
'------------------------------
Dim xlobj As Object
Dim xlsheetobj As Object
Dim xlrange As Object
'------------------------------
' 定義ACESS 記錄集對象變量
Dim dbs As Database, rst As Recordset
Dim strSQL As String
Dim recTotal, fieldTotal As Integer ' recTotal:
表示該表內記錄總數;
fieldTotal 表示字段總數
Dim i, j As Integer
i = 0
j = 0
' Return reference to current database.
Set dbs = CurrentDb ' 當前數據庫
Set rst = dbs.OpenRecordset("Pqry_YEAR ") ' 選擇記錄集
recTotal = rst.RecordCount ' 得出記錄數
fieldTotal = rst.Fields.Count ' 得出字段數
'----------------------------------
' 建立EXCEL 對象
Set xlobj = CreateObject("Excel.Application.8")
' 打開設計好的EXCEL 表--REPORT.XLS
xlobj.Workbooks.Open FileName:=pPathname & " REPORT.xls"
Set xlsheetobj = xlobj.ActiveWorkbook.Worksheets("REPORT ")
' 指向工作表
' 如果是改動過的表, 不再打開
If MsgBox(" 當前打印表格文件中已有數據,
是否需要更新?"
& Chr(13) & _
" 提示: 只有對數據進行改動后, 才需要更新.", 68)
= vbYes Then
DoCmd.Hourglass True ' 由于時間較長,
將鼠標設為沙漏形狀
xlsheetobj.Rows("5:200").Select ' 選定區域
xlobj.Selection.Delete Shift:=-4162 '
注意! 原錄制宏中-4162 為xlnone, 是EXCEL97 的常量, 但在ACCESS 下卻不認, 只能到EXCEL 下的對象瀏覽器去查詢對應的常數.
' 開始向EXCEL 傳送數據
Do Until rst.EOF
For j = 1 To fieldTotal
xlsheetobj.cells(5 + i, j).Value = rst.Fields(j - 1)
Next j
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
With xlobj.Selection.Borders(7)
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With xlobj.Selection
' 確定是合計在表上還是在表尾
If Me![Fram 位置] = 1 Then
.Subtotal GroupBy:=2, Function:=-4157,
TotalList:=Array(6, 9, 10, _
11, 12, 13, 14, 15, 16), Replace:=True,
PageBreaks:=False, _
SummaryBelowData:=False
Else
.Subtotal GroupBy:=2, Function:=-4157,
TotalList:=Array
(6, 9, 10, _
11, 12, 13, 14, 15, 16), Replace:=True,
PageBreaks:=False, _
SummaryBelowData:=True
End If
End With
' 根據用戶的選擇設置頁眉和頁尾。
With xlsheetobj.PageSetup
.LeftHeader = "" & Chr(10) & "" & Chr(10) & "
" & Mid(Me![Cmbo 單位], 4)
.CenterHeader = "&"" 宋體, 加粗""&18 " & Me!
[Cmbo 年度] & " 年" & Mid(Me![Cmbo 類別], 4) & "XXX 表"
End With
xlsheetobj.Range("A1").Select
' 將空行內容清掉
k = Val(Me![Comb 空行])
If Val(Me![Comb 空行]) > 0 Then
Dim content As String
i = 5
content = xlsheetobj.cells(i, 2).formulaR1C1
Do While InStr(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
End If
Else ' 不更新
xlsheetobj.Activate
End If
xlobj.ActiveWindow.SelectedSheets.PrintPreview ' 預演報表
' 如為打印:xlobj.ActiveWindow.SelectedSheets.PrintOut
DoCmd.Hourglass False ' 恢復鼠標形狀
xlobj.Visible = True ' 讓EXCEL 可見
清除對象變量空間,節省內存
Set dbs = Nothing
Set xlobj = Nothing
xlobj.quit ' 關閉EXCEL
Exit Sub
ErrorHandler: ' 出錯處理
DoCmd.Hourglass False
MsgBox "Error number " & Err.Number & ": " & Err.Description
' Resume with statement following occurrence of error.
Resume Next
End Sub
通過這個例子我們看到在OFFICE97 下利用OLE 自動化擴展應用程序的功能是多么方便和強大。用EXCEL 完成的報表的優點是格式美觀, 修改方便. 缺點是第一次生成EXCEL 表格時速度較慢.
本例是用EXCEL 對數據進行報表操作, 其實也可參照此例的方法在EXCEL 上建立圖形統計、財務分析、數據透視表分析等應用程序,只要在EXCEL 下錄制相應的宏,再加到ACCESS 下就行了。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -