在通过vba保存pdf之前更新表单域

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在通过vba保存pdf之前更新表单域相关的知识,希望对你有一定的参考价值。

我是VBA和编码的初学者,我遇到了我的VBA代码问题。这就是我想要做的事情:

我有两个可填写的字段(f_autpar_nom和f_autpar_fiche),我的Access数据库需要使用command_click()在两个formfield(eleves_nom和eleves_numfiche)上的Word文件中。然后,我的Word文档打开并提示我“你想保存这个”,然后Word文档保存为PDF并通过电子邮件发送。

一切都在工作,除了一件事:当我打印PDF并返回我设置的默认消息(这是“erreur”)时,表单字段不会更新。

我需要的是找到一种方法来更新formfield之前我的消息框提示我发送电子邮件。

这是我使用Access的代码

Function fillwordform()
    Dim appword As Word.Application
    Dim doc As Word.Document
    Dim Path As String

    On Error Resume Next
    Error.Clear
    Path = "P:CommunSECTEUR DU TRANSPORT SCOLAIREHarnaisAutorisations ParentalesAutorisation parentale vierge envoyéeAutorisation_blank.docm"
    Set appword = GetObject(, "word.application")

    If Err.Number <> 0 Then
        Set appword = New Word.Application
        appword.Visible = True
    End If
    Set doc = appword.Documents.Open(Path, , False)
    With doc
        .FormFields("eleves_nom").Result = Me.f_autpar_nom
        .FormFields("eleves_numfiche").Result = Me.f_autpar_fiche
        appword.Visible = True
        appword.Activate
    End With

    Set doc = Nothing
    Set appword = Nothing    
End Function

Private Sub Commande47_Click()
    Dim mydoc As String
    mydoc = "P:CommunSECTEUR DU TRANSPORT SCOLAIREHarnaisAutorisations ParentalesAutorisation_blank.docm"
    Call fillwordform
End Sub

和Word

Private Sub document_open()
    Dim outl As Object
    Dim Mail As Object
    Dim Msg, Style, Title, Help, Ctxt, Response, MyString
    Dim PDFname As String

    Msg = "L'autorisation sera sauvegardée et envoyée par email.  Continuer?"
    Style = vbOKCancel + vbQuestion + vbDefaultButton2
    Title = "Document"
    Ctxt = 1000
    Response = MsgBox(Msg, Style, Title, Help, Ctxt)
    If Response = vbOK Then
        ActiveDocument.Save
        PDFname = ActiveDocument.Path & "" & "Autorisation Parentale " & FormFields("eleves_nom").Result & ".pdf"
       ActiveDocument.SaveAs2 FileName:=PDFname, FileFormat:=wdFormatPDF
        Set outl = CreateObject("Outlook.Application")
        Set Mail = outl.CreateItem(0)
        Mail.Subject = "Autorisation parentale " & FormFields("eleves_nom").Result & " " & FormFields("eleves_numfiche")
        Mail.To = ""
        Mail.Attachments.Add PDFname
        Mail.Display
        Application.Quit SaveChanges:=wdDoNotSaveChanges

    Else
        MsgBox "Le fichier ne sera pas envoyé."
        Cancel = True
    End If
End Sub
答案

我不是故意要删除Set Doc = Nothing。我的目的是要指出,在该命令之前所做的任何改变都必须丢失,因为它们没有被保存。在下面的代码中,文档已关闭并保存。

Private Sub Commande47_Click()
    Dim mydoc As String
    mydoc = "P:CommunSECTEUR DU TRANSPORT SCOLAIREHarnaisAutorisations ParentalesAutorisation_blank.docm"
    Call FillWordForm
End Sub

Function FillWordForm(Ffn As String)

    Dim appWord As Word.Application
    Dim Doc As Word.Document

    On Error Resume Next
    Set appWord = GetObject(, "word.application")
    If Err.Number Then Set appWord = New Word.Application
    appWord.Visible = True
    On Error GoTo 0

    Set Doc = appWord.Documents.Open(Ffn, , False)
    ' the newly opened document is activated by default
    With Doc
        .FormFields("eleves_nom").Result = Me.f_autpar_nom
        .FormFields("eleves_numfiche").Result = Me.f_autpar_fiche
        .Close True             ' close the file and save the changes made
    End With

    Set appWord = Nothing
End Function

但是,我也同意@Kazimierz Jawor你的构造是不幸的。基本上,当您从Access打开文档时,应该运行文档的On_Open过程。因此,您甚至可以在设置表单字段之前发送电子邮件。我保存更改的建议可能仅在您第二次运行代码时生效。

更好的方法应该是从Access或Word发送邮件。我的偏好是后者。使用Word从Access表中提取两个值应该很容易,将它们添加到Word文档并邮寄出整个文件。但是,我没有看到为什么你应该使用Open事件来做到这一点。如果这个选择更合乎逻辑,那么从Access中做所有事情就是结论。

以上是关于在通过vba保存pdf之前更新表单域的主要内容,如果未能解决你的问题,请参考以下文章

使用 Access VBA 使用循环填充 Word 表单

如何在进行邮件合并(VBA)时自动保存为PDF

带有可填写表单域的 PDF +“另存为”=带有固定文本的 PDF - 如何?

Excel VBA > 公式在保存工作簿之前不会更新

使用 Excel VBA saveas 功能通过用户交互保存为 PDF

在 iOS 上修改 PDF 交互式表单域的最佳方法是啥?