作为一名非传统程序员,我倾向于以不同的视角看待事物。这恰好是其中一次。我有一个accdb
,目前每2分钟运行并输出PDF
个文件。当有人打开其中一个文件时,新的PDF
将覆盖旧的 。在这种情况下,它会跳过打开的文件,2分钟后重新尝试。我遇到的问题是打开这些PDF
的一些用户,最小化它们并忘记它们,在某些情况下,不允许文件更新数天,甚至数周。我想要做的是在打开几个小时后嵌入一个工作动作来关闭文件。我发现了如何做到这一点enter link description here我已经对它进行了测试,并且它有效。我遇到的问题是我需要通过VBA
以某种方式将该动作嵌入PDF
中。我用来创建它的代码是:
DoCmd.OutputTo acOutputReport, "H&B Stock Research", acFormatPDF, strPathAndFile, False
我研究过的所有网站都向您展示了如何通过Acrobat GUI完成添加脚本/操作。但我想尝试在Access中通过VBA
进行预测。原因是该文件每2分钟生成一次,并且大约有50个副本被更新。
答案 0 :(得分:0)
我会将操作代码保存在一个位置以便更好地进行概述。话虽如此,我会扩展您当前的VBA功能,以检查文件是否已打开,如果打开时间超过2小时,则可以复制新版本。关闭打开的文件并复制最新版本。
通过这种方式,您可以完全控制复制最新版本,并可以在一个地方管理您的代码。
我假设你已经有了检查PDF是否打开的功能。 添加此代码将帮助您终止打开的文件。
Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" _
Alias "PostMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
'Constants that are used by the API
Const WM_CLOSE = &H10
Dim mHwnd As Long
mHwnd = FindWindow(vbNullString, mFileName & " - Adobe Reader") ' application title
If IsWindow(mHwnd ) = 1 Then ' or just If mHwnd Then
'Send termination signal
' you can also capture the return value from postmessage to understand errors.
PostMessage mHwnd , WM_CLOSE, 0&, 0& '
Debug.print "File was open but closed: " & mFileName
End If
.. continue with your copy function