在打印中隐藏报告字段
在Access 2003数据库中,我有一个通过VBA生成的员工状态/反馈报告。我在VBA中创建了报表,因为所需的报表格式使我能够更轻松地这样做(组合多个记录集,显示来自与其他人对齐的记录集中的多个记录,自定义一些基于格式的元素部门等)。可能有更好的方法来创建这些报告,但这是正常运行,所以我宁愿避免重新创建如果可能的话。在打印中隐藏报告字段
我的问题是这样的:由于这是员工反馈表,所以主管希望能够看到但不显示员工的详细信息。生成报告时,主管有机会从报告本身(通过用户表单,报告中的事件处理)查看数据/进行更改。部分审查是查看一组字段(作为标签添加到报告中),但是当报告最终打印时应隐藏这些字段。
在我的脑海中,我想我曾经见过一种方式来隐藏特定的控件,并用一些Google搜索来找到this MSDN resource的DisplayWhen
。但是,看起来DisplayWhen
仅适用于表单。有没有办法使用报告设置此值(或类似/相关选项)?对SO进行搜索时,我在DisplayWhen查询中发现只有一个问题,这对我没有帮助。
使用.Visible = False
关于创建报告的报告将不起作用,因为主管需要查看这些字段。它似乎没有打印时可以设置此属性,因为我看不到此事件处理选项。我可以创建一个自定义事件处理程序来捕获打印命令吗?
这里的控制创建代码:
Private Sub AddOneOnOneField(Rpt As Report, Left As Integer, Top As Integer, Width As Integer, Height As Integer, _
Optional Cap As String = vbNullString, Optional Align As Integer = cnFontCenter, Optional Size As Integer = 10, _
Optional Bold As Integer = cnBoldFont, Optional DisplayWhen As Byte = 0)
With CreateReportControl(Rpt.Name, acLabel, acDetail, vbNullString, vbNullString, _
Left, Top, Width, Height)
.Properties("FontSize") = Size
.Properties("FontWeight") = Bold
.Properties("BorderStyle") = 1
.Properties("TextAlign") = Align
.Properties("Caption") = Cap
.Properties("DisplayWhen") = DisplayWhen ' This does not work!
End With
End Sub
重申一下我的问题:
- 如何设置某些报表字段只显示在打印预览,但不打印?
- 我可以创建一个自定义事件处理程序来捕获报告中的打印命令吗?
- 有没有办法在报告字段上设置
DisplayWhen
属性(或类似/相关选项)?
这并不理想,但它的工作原理。通过VBA创建报表时,我已经有了在报表模块中创建代码的代码。我添加到该功能来捕获字段的打印/强制隐藏,打印,然后取消隐藏。
Private Sub AddReportCode(mdlNew As Module)
Dim sNewCode As String
sNewCode = "Option Compare Database" & vbCr & "Option Explicit"
sNewCode = sNewCode & vbCr
sNewCode = sNewCode & vbCr & "Public Sub CapturePrint()"
sNewCode = sNewCode & vbCr & "Dim v As Variant"
sNewCode = sNewCode & vbCr & "If Application.CurrentObjectName = ""OneOnOneReport"" And Application.CurrentObjectType = acReport Then"
sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acViewDesign"
sNewCode = sNewCode & vbCr & "Reports(""OneOnOneReport"").Visible = False"
sNewCode = sNewCode & vbCr & "For Each v In Reports(""OneOnOneReport"").Controls"
sNewCode = sNewCode & vbCr & "If Left(v.Properties(""Name""), 3) = ""Occ"" Then"
sNewCode = sNewCode & vbCr & "v.Visible = False"
sNewCode = sNewCode & vbCr & "End If"
sNewCode = sNewCode & vbCr & "Next v"
sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acNormal"
sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acViewDesign"
sNewCode = sNewCode & vbCr & "For Each v In Reports(""OneOnOneReport"").Controls"
sNewCode = sNewCode & vbCr & "If Left(v.Properties(""Name""), 4) = ""HIDE"" Then"
sNewCode = sNewCode & vbCr & "v.Visible = True"
sNewCode = sNewCode & vbCr & "End If"
sNewCode = sNewCode & vbCr & "Next v"
sNewCode = sNewCode & vbCr & "Reports(""OneOnOneReport"").Visible = True"
sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acViewPreview"
sNewCode = sNewCode & vbCr & "End If"
sNewCode = sNewCode & vbCr & "End Sub"
mdlNew.DeleteLines 1, mdlNew.CountOfLines
mdlNew.InsertText sNewCode
End Sub
为了增强可读性,这里的实际代码,模块中在此之后运行:
Option Compare Database
Option Explicit
Public Sub CapturePrint()
Dim v As Variant
If Application.CurrentObjectName = "OneOnOneReport" And Application.CurrentObjectType = acReport Then
DoCmd.OpenReport "OneOnOneReport", acViewDesign
Reports("OneOnOneReport").Visible = False
For Each v In Reports("OneOnOneReport").Controls
If Left(v.Properties("Name"), 3) = "Occ" Then
v.Visible = False
End If
Next v
DoCmd.OpenReport "OneOnOneReport", acNormal
DoCmd.OpenReport "OneOnOneReport", acViewDesign
For Each v In Reports("OneOnOneReport").Controls
If Left(v.Properties("Name"), 4) = "HIDE" Then
v.Visible = True
End If
Next v
Reports("OneOnOneReport").Visible = True
DoCmd.OpenReport "OneOnOneReport", acViewPreview
End If
End Sub
当增加新的控制报告(见问题体内原有的代码),我加的能力有选择地指定一个名称对照:
.Properties("Name") = NewName
控制创建代码被称为与"HIDE" & ControlTop & ControlLeft
一个NewName
参数允许命名所有需要控件不重复名称。隐藏之前,报告在设计模式下打开以防止屏幕闪烁/放慢。然后,打印代码循环浏览报告中的所有控件,查找以“HIDE”开头的名称并隐藏它们。一旦所有控件都隐藏起来,报表将按照正常打印重新打开,然后该过程重复取消隐藏这些控件并向用户显示原始报告。
我还是没能正确采集print
事件(这就是解决变得不是我喜欢的选项),所以不是我提示在初始创建打印报告的用户,调用新创建CapturePrint
Sub(隐藏这些字段)。如果他们选择不这样做,那么他们可以正常打印而不隐藏字段,或重新生成报告以隐藏它们/再次提示。
如果隐藏数据是非常重要的,你选择了错误的数据库,如果是有些随便,你可以问管理员输入一个代码,并可以隐藏或显示基于代码的字段。或者,您可以为管理员提供稍微不同的前端。
如果您不想打印它,您为什么要在打印预览中显示它?这不是很具误导性吗? – 2012-07-16 18:27:31
@DanielCook我的理解是查看报告的唯一方法是以打印预览或编辑模式查看报告,并且我不希望他们编辑报告。我想在屏幕上显示与打印输出不同的内容。主管希望得到更多的信息,总结一下,他们想让员工隐藏起来。他们可以在其他地方获得这些数据,但为了方便起见,我正在试图将其写入此报告。 – Gaffi 2012-07-16 19:14:27