在打印中隐藏报告字段

问题描述:

在Access 2003数据库中,我有一个通过VBA生成的员工状态/反馈报告。我在VBA中创建了报表,因为所需的报表格式使我能够更轻松地这样做(组合多个记录集,显示来自与其他人对齐的记录集中的多个记录,自定义一些基于格式的元素部门等)。可能有更好的方法来创建这些报告,但这是正常运行,所以我宁愿避免重新创建如果可能的话。在打印中隐藏报告字段

我的问题是这样的:由于这是员工反馈表,所以主管希望能够看到但不显示员工的详细信息。生成报告时,主管有机会从报告本身(通过用户表单,报告中的事件处理)查看数据/进行更改。部分审查是查看一组字段(作为标签添加到报告中),但是当报告最终打印时应隐藏这些字段。

在我的脑海中,我想我曾经见过一种方式来隐藏特定的控件,并用一些Google搜索来找到this MSDN resourceDisplayWhen。但是,看起来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属性(或类似/相关选项)?
+0

如果您不想打印它,您为什么要在打印预览中显示它?这不是很具误导性吗? – 2012-07-16 18:27:31

+0

@DanielCook我的理解是查看报告的唯一方法是以打印预览或编辑模式查看报告,并且我不希望他们编辑报告。我想在屏幕上显示与打印输出不同的内容。主管希望得到更多的信息,总结一下,他们想让员工隐藏起来。他们可以在其他地方获得这些数据,但为了方便起见,我正在试图将其写入此报告。 – Gaffi 2012-07-16 19:14:27

这并不理想,但它的工作原理。通过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(隐藏这些字段)。如果他们选择不这样做,那么他们可以正常打印而不隐藏字段,或重新生成报告以隐藏它们/再次提示。

如果隐藏数据是非常重要的,你选择了错误的数据库,如果是有些随便,你可以问管理员输入一个代码,并可以隐藏或显示基于代码的字段。或者,您可以为管理员提供稍微不同的前端。

+0

请参阅我对丹尼尔库克关于这个问题的评论。 – Gaffi 2012-07-16 19:14:41

+1

看看是否有帮助:http://*.com/questions/11347139/where-do-i-put-access-vba-code-to-only-fire-when-physically-printing – Fionnuala 2012-07-16 19:31:55

+1

我能够与自定义菜单功能的想法,但在捕获所有可能的打印方法时遇到了一些麻烦。我自己解决了这个问题,并在此发布了答案。 – Gaffi 2012-07-17 14:46:31