【问题标题】:Where do I put Access vba code to only fire when physically printing?我在哪里放置 Access vba 代码以仅在物理打印时触发?
【发布时间】:2012-07-05 15:04:39
【问题描述】:

当用户实际打印报告时,我想触发一些代码。不是在打印预览等时,而是仅在发送到打印机时。用户需要能够拉出报告并查看它,然后如果他们决定打印,vba 代码将接管并将一些信息写入与用于生成报告不同的表中。我希望不必在实际报告上放置一个打印按钮(即使我知道我可以隐藏它以进行打印),所以我想知道是否可以以某种方式捕获打印对话框。

有没有人有幸这样做过?

【问题讨论】:

  • 您是否考虑过将自己的代码写入打印按钮?
  • @Remou,我已经考虑过了(见上文),但我希望我可以从 File --> Print 或 Ctrl-P 捕获事件。我担心用户只会使用传统的打印方法而不使用我的打印按钮。
  • 我在想的是您将菜单上的打印按钮更改为您自己的宏。您可以重新分配菜单按钮,因此用户可以选择的唯一按钮就是您的按钮。同样,您可以创建自己的右键菜单。
  • 您是想阻止用户执行手动打印,还是希望在文档发送到打印机时只执行附加操作?我建议使用表单的 Timer 事件监视打印假脱机,如果出现文档名称,请执行请求的操作。 Take a look at this code.
  • 我目前还没有带有菜单栏的版本,但我记得自定义按钮来双关我的功能,所以不是说 mnuPrint,而是将 Action 设置为 MyFunction。

标签: ms-access vba ms-access-2003


【解决方案1】:

经过深思熟虑,我认为最好的方法是在报告页面事件期间识别活动窗口文本。在打印预览期间,此文本将是数据库本身的名称,例如“Microsoft Access - DatabaseName : Database (Access 2003)。在实际打印操作期间,活动窗口将为“打印”

我认为大部分代码来自this source

Declare Function GetActiveWindow Lib "user32" () As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
   (ByVal Hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Private Sub Report_Page()
On Error GoTo PrintError

    Dim strCaption As String
       Dim lngLen   As Long

       ' Create string filled with null characters.
       strCaption = String$(255, vbNullChar)
       ' Return length of string.
       lngLen = Len(strCaption)

       ' Call GetActiveWindow to return handle to active window,
       ' and pass handle to GetWindowText, along with string and its length.
       If (GetWindowText(GetActiveWindow, strCaption, lngLen) > 0) Then
          ' Return value that Windows has written to string.
          ActiveWindowCaption = strCaption
       End If

    If ActiveWindowCaption = "Printing" Then

        '
        ' Special activity goes here.
        '

    End If

    Exit Sub

PrintError:
    ' Just in case

End Sub

【讨论】:

  • 工作就像一个魅力,除了 GetActiveWindow 和 GetWindowText 的 Lib 函数之外,我不需要添加任何东西。谢谢!
  • 这种方法的唯一限制是它只允许在后台打印开始后执行操作。如果打算在假脱机之前拦截打印操作并运行功能,则需要像@Remou 建议的那样自定义菜单/功能区。
  • 我同意。 @Remou 的印前处理作品;这适用于后期打印。我一直在为此寻找后期打印,但 Remou 的解决方案将来会很有用。
  • @但对我来说,出现标题为“Printing”的窗口太快了,因此这段代码失败了,所以我添加了一个人工等待/睡眠以在这段代码上成功。
猜你喜欢
  • 1970-01-01
  • 2015-07-21
  • 2018-12-01
  • 1970-01-01
  • 2015-10-31
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
相关资源
最近更新 更多