我一直用微软的Access数据库储存学校所有学生的数据,义务教育档案的整理全部依赖于这个数据库。虽然在用Access,但懂得并不是很多,也就是照猫画虎而已。在整理档案的过程中出现两个问题一直困扰着我,一个就是在打印报表的时候数据不足15个的时候,下面总是有空白,很不美观,另外一个就是在档案中的表册都有序号,但是通过查询出来的一些间隔数据的序号还得另加字段,很是
,表册多的话,更是烦人。
没办法,只得把数据库里面的数据复制到电子表格中通过手工加上表格线和序号。今天想到何不从网上找找看,有没有办法解决这两个问题。晚上花了不少时间从网上搜索相关的资料,终于把这两个问题解决了,很是高兴。
第一个问题是在数据不足一页的时候补上空行,需要的代码比较多,(其实我也不怎么懂代码,能看懂的改成自己的就行了,
)也是非常复杂的,不太懂,也就不帖出来了,我有实例文件保存,呵呵。
1、在要补充空行的报表空白处右击,选择“事件生成器”→“代码生成器”,粘贴如下代码:
Private Sub 主体_Format(Cancel As Integer, FormatCount As
Integer)
SetDetailFormat Me, Txt总计数, 15,
0 ''15是每页的记录数(一般为15)
End Sub
Private Sub Report_Open(Cancel As
Integer)
''打开初始化值
LngAllRecords =
0
IntPageCount =
0
LngSectionCount
= 0
End Sub
Private Sub 页面页眉_Format(Cancel As
Integer, FormatCount As Integer)
IntPageCount = 0 ''页计数清零
End Sub
Private Sub Report_NoData(Cancel As
Integer)
MsgBox "没有数据!"
Cancel = True
End Sub
Private Sub 组页眉0_Format(Cancel As
Integer, FormatCount As Integer)
LngAllRecords =
0 ''节所有记录数清零
LngSectionCount = 0 ''节记录数清零
End Sub
2、在模块中新建一个名为“Comm_SetDetailFormat”的模块,打开并粘贴如下代码:
Option Compare Database
Option Explicit
'Private Const intCountPerPage =
15 ''是指定的每页打印记录行数,和前面的15一样。
Public LngAllRecords As
Long ''统计节全部记录数
Public IntPageCount As
Integer ''页计数
Public LngSectionCount As
Long ''节计数
Public Sub SetDetailFormat(ByVal TheReport As Report, ByVal
CountAllRows As Integer, Optional intCountPerPage As Integer = 15,
Optional SectionSurplusRows As Integer = 0)
'===============================================================================
'-函数名称: SelectDetailFormat
'-功能描述: 设置报表的不足补空行报表
'-输入参数说明:
参数1:TheReport 报表,输入me
' 参数2:CountAllRows 统计所有的行
' 请在报表上增加一个字段(例FieldsA),行来源为"=Count(*),可见性为否
' 参数3:intCountPerPage 每页的行数
' 参数4:SectionSurplusRows 分组剩余行给签名备注栏
'-返回参数说明: 无
'-使用语法示例: SetDetailFormat me,me.FieldsA,20
'-参考:
'-使用注意: 请在报表的Report_Open事件中输入:TempRows=0 '初始化
'-兼容性: 2000,XP已测试
'-作者: 何勇, Email:Cuxun@qq.com ,QQ:100810401
'-更新日期: 2007-9-21
'===============================================================================
On Error GoTo Err:
'当有页面汇总时在页面页脚下相应减去节计数
'LngSectionCount = LngSectionCount - 1
LngAllRecords = LngAllRecords +
1 ''全部的记录计数
IntPageCount = IntPageCount +
1 ''页计数
LngSectionCount = LngSectionCount + 1
''节计数 ''当每节的数据大于最大的数据,并且当页的行数小于每页最低行数时新加空白行
If LngSectionCount >= CountAllRows And IntPageCount
< intCountPerPage - SectionSurplusRows
Then TheReport.NextRecord = False
End
If ''当页包含空行的数据等于最低行数时判断
If IntPageCount Mod intCountPerPage = 0 Then
''分页
TheReport.Section(0).ForceNewPage = 1
Else
''不分页
TheReport.Section(0).ForceNewPage = 0
End
If ''把前面的空行内的数据隐藏成白色
If IntPageCount > CountAllRows Or LngSectionCount
> CountAllRows Then
showHideCtrlAtDetail TheReport, False
Else
showHideCtrlAtDetail TheReport, True
End If
Err:
''不显示出错提示
' If Err.Number <> 0 Then MsgBox
Err.Description
Exit Sub
End Sub
Private Sub showHideCtrlAtDetail(ByVal TheReport As Report, ByVal
isShow As Boolean)
Dim Ctr1 As Control
''只针对主体页
For Each Ctr1 In TheReport.Section(acDetail).Controls
If Ctr1.ControlType = acTextBox Then
If isShow = False Then
Ctr1.ForeColor = 16777215
Else
Ctr1.ForeColor = 0
End If
End If
Next
End Sub
3、添加“排序与分组”字段,设计页面会生成该字段的页眉和页脚,设置好字段的分组功能,然后在页脚处新建一个控件来源为“=Count(*)”的控件。修改该页脚和该控件的可见属性为“否”。
4、注意:班级页眉的名称为要和第一段代码“Private Sub
组页眉0_Format(Cancel As Integer,
FormatCount As Integer)”处的红色部分一样。其他的我也说不上什么,对代码不是太懂,呵呵。
第二个问题是在报表中加序号,很简单的,帖出来吧:在报表的主体中设一个文本框,控件来源:=1,在其“运行总和”属性中选择:工作组之上或总和之上。两种选择的不同效果是,如果你的报表分组了,工作组之上的自动编号范围就只限于分组内,如跨组则重新从1开始(这应该是比较常用的),而总和之上是跨组一直自动编下去的。
当然这得感谢“论坛-中文Access开发社区”中的“咱家是猫”和“何勇”两位高手,我就是把他们的代码拿过来,简单得改了一下,就完事了,
。
很晚了,两个问题解决以后,下学期的档案就用不着再复制到Excel表格中了,哈哈。
2009年8月30日补充:为了不至于忘记,现在把有关于第一个问题的代码实例帖出来,有兴趣的朋友可以下载试试看,如果有更好的办法,还请多多指教并留言,谢谢了。