我正在使用David-W-Fenton 对此问题的回答来尝试允许用户在单击控件时打印报告,但我收到以下错误消息:
runtime error 2448: you cannot assign a value to this object.
触发错误的代码行是:
Me.txtPageTo.Value = numPages
这是表单的 OnLoad 事件处理程序的完整代码:
Private Sub Form_Load()
Dim varPrinter As Printer
Dim strRowsource As String
Dim strReport As String
If Len(Me.OpenArgs) > 0 Then
strReport = Me.OpenArgs
Me.Tag = strReport
For Each varPrinter In Application.Printers
strRowsource = strRowsource & "; " & varPrinter.DeviceName
Next varPrinter
Me!cmbPrinter.RowSource = Mid(strRowsource, 3)
' first check to see that the report is still open
If (1 = SysCmd(acSysCmdGetObjectState, acReport, strReport)) Then
With Reports(strReport).Printer
Me!cmbPrinter = .DeviceName
Me!optLayout = .Orientation
End With
Dim numPages As String
numPages = Reports(strReport).Pages
Debug.Print "numPages = " & numPages
TypeName(Me.txtPageTo) 'added this line as a test after
Me.txtPageTo.Value = numPages
End If
End If
End Sub
numPages 在抛出错误之前打印出等于 0,即使报告应该至少有一页。此外,当表单已经打开时,不会引发错误。只有在必须打开表单时才会引发错误。(可能是因为有问题的代码在 onload 事件中。)
当我添加 TypeName(Me.txtPageTo) 时,它触发了运行时错误 2424:您输入的表达式具有mydatabasename找不到的字段、控件或属性名称。
我认为问题是我需要为txtPageFrom和txtPageTo设置控制源。但是我该怎么做呢?此表单将仅由尝试打印报告的 vba 方法加载,因此 txtPageFrom 和 txtPageTo 的值将来自调用方法,而不是来自某些基础数据表。(此对话框没有基础数据表。)
cmbPrinter 和 optLayout 似乎使用上面的代码正确填充。
谁能告诉我如何克服错误消息以便正确加载表单?
正确,完整的答案:
这个问题的答案是大大简化代码。这篇文章顶部链接中的代码太复杂了,它试图重新发明 Access 和 VBA 中内置的工具已经很好地完成的事情。只需在与报表关联的表单上的控件的单击事件中使用以下代码,我就能够在没有任何复杂解决方案的情况下打印报表:
Private Sub txtPrintReport_Click()
On Error GoTo Error_Handler
Dim commNum As Long
commNum = Me.CommunicationNumber
Dim strReport As String
Dim strVarName As String
strReport = "rptCommunicationFormForPrinting"
strVarName = "CommunicationNumber"
DoCmd.OpenReport strReport, acViewPreview, , strVarName & " = " & commNum, acWindowNormal, acHidden
DoCmd.RunCommand acCmdPrint
DoCmd.Close acReport, strReport
Exit_Point:
Exit Sub
Error_Handler: 'this handles the case where user clicks cancel button
If Err.Number <> 2501 Then
MsgBox Err.Description, _
vbExclamation, "Error " & Err.Number
End If
DoCmd.Close acReport, strReport
End Sub
这就是所需的所有代码。比这个问题开头的链接要少得多。而且也比下面的答案少得多。我将 John Bingham 的答案标记为已接受的答案,因为他显然在这方面做了很多工作,对此我非常感激。但我最终用 A LOT LESS CODE 解决了这个问题。我的解决方案不需要自定义对话框表单,因为它使用 Windows 打印对话框表单。因此,我的帖子中的加载事件代码(取自上面的链接)是不必要的。