2017-12-21 56 views
2

Ich bin ein Anfänger mit VBA und Codierung im Allgemeinen und ich bin mit einem Problem mit meinem VBA-Code fest. Hier ist, was ich tun möchte:Aktualisieren von Formularfelder vor dem Speichern eines PDF über VBA

Ich habe zwei füllbare Felder (f_autpar_nom und f_autpar_fiche) mit meiner Access-Datenbank, die auf meine Word-Datei in zwei Formfield (eleves_nom und eleves_numfiche) mit einem command_click() sein müssen. Dann öffnet sich mein Word-Dokument und fordert mich auf mit einem "Möchten Sie das speichern" und danach das Word-Dokument als PDF speichern und per Email versenden.

Alles funktioniert bis auf eine Sache: Die Formularfelder werden nicht aktualisiert, wenn ich die PDF-Datei drucke und die Standardmeldung zurückgebe, die ich eingestellt habe (was "erreur" ist).

Was ich brauche, ist eine Möglichkeit zu finden, das Formularfeld zu aktualisieren, bevor meine Nachricht mich auffordert, die E-Mail zu senden.

Hier ist der Code, den ich mit Zugang haben

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

    On Error Resume Next 
    Error.Clear 
    Path = "P:\Commun\SECTEUR DU TRANSPORT SCOLAIRE\Harnais\Autorisations Parentales\Autorisation parentale vierge envoyée\Autorisation_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:\Commun\SECTEUR DU TRANSPORT SCOLAIRE\Harnais\Autorisations Parentales\Autorisation_blank.docm" 
    Call fillwordform 
End Sub 

und mit 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 
+1

Haben Sie darüber nachgedacht, beide Subroutinen zu einer zu kombinieren, die (eher) von Access ausgelöst werden sollte? Meiner Meinung nach wird es dieses Problem lösen. Also, keine 'Document_Open event'-Aktion, sondern nur ein Makro in Access –

+0

Der' On Error Resume Next'-Befehl löscht alle vorhandenen Fehlerbedingungen. Daher muss es nicht von "Err.Clear" gefolgt (oder vorangegangen) werden. – Variatus

+0

Ihre Access-Routine öffnet das Dokument, füllt den Inhalt der Formularfelder in 'doc' und setzt dann' Doc = Nothing'. Die gespeicherte Version von 'Doc' wird nie geändert. Wenn Sie Änderungen an dem gespeicherten Dokument vornehmen möchten, müssen Sie diese natürlich speichern. – Variatus

Antwort

0

Ich meine nicht die Set Doc = Nothing zu entfernen. Meine Absicht war es, darauf hinzuweisen, dass alles, was du vor diesem Befehl geändert hast, verloren gehen muss, weil sie nicht gerettet wurden. Im folgenden Code wird das Dokument geschlossen und gespeichert.

Private Sub Commande47_Click() 
    Dim mydoc As String 
    mydoc = "P:\Commun\SECTEUR DU TRANSPORT SCOLAIRE\Harnais\Autorisations Parentales\Autorisation_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 

Allerdings stimme ich auch @Kazimierz Jawor, dass Ihr Konstrukt unglücklich ist. Grundsätzlich sollte die On_Open-Prozedur des Dokuments ausgeführt werden, wenn Sie das Dokument von Access öffnen. Daher wird die E-Mail wahrscheinlich gesendet, bevor Sie überhaupt die Formularfelder einstellen können. Mein Vorschlag, die Änderungen zu speichern, wird wahrscheinlich nur wirksam, wenn Sie den Code das zweite Mal ausführen.

Der bessere Weg sollte sein, die Mail von Access oder Word zu senden. Meine Präferenz wäre letzteres. Es sollte einfach sein, zwei Werte aus einer Access-Tabelle mit Word zu extrahieren, sie zu einem Word-Dokument hinzuzufügen und das Ganze zu verschicken. Ich sehe jedoch nicht, warum Sie das Open-Ereignis verwenden sollten, um das zu tun. Wenn diese Wahl die logischere ist, dann wäre alles aus Access heraus die Schlussfolgerung.

Verwandte Themen