这并不理想,但它有效。通过 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
控件创建代码使用NewName参数调用,"HIDE" & ControlTop & ControlLeft以允许命名所有需要的控件而无需重复名称。隐藏之前,报表以设计模式打开,以防止屏幕闪烁/减速。然后,打印代码循环遍历报表上的所有控件,查找以“HIDE”开头的名称并隐藏它们。一旦所有控件都被隐藏,报表将正常重新打开以打印,然后重复该过程以取消隐藏这些控件并向用户显示原始报表。
我仍然无法print正确捕获事件(这是解决方案不是我最喜欢的选项的地方),所以我在最初创建报告时提示用户打印,调用新创建的CapturePrintSub(同时隐藏这些字段)。如果他们选择不这样做,那么他们可以在不隐藏字段的情况下正常打印,或者重新生成报告以隐藏它们/再次提示。