Macro pour génération d'un doc Word (signets)

Bonjour,

Après plusieurs recherches sur le net et ici, je n'arrive pas à résoudre mon problème que je vous expose (je précise que je suis débutante - voire très débutante en VBA).

J'ai besoin de faire éditer des contrats par plusieurs personnes à qui on remettra un fiche à compléter (exemple de fichier excel joint). Sur cette base, les éléments complétés doivent générer le document word (exemple joint), compléter les champs et séléctioner les paragraphes rédigés. Les champs conditionnels sont avec signets.

Je voudrais utiliser VBA pour lier les documents et développer, mais je ne connais pas du tout le code à appliquer, et je n'arrive pas à trouver de quoi m'aider. Est-ce que quelqu'un pourrait m'orienter svp ? Soit vers un tutoriel, soit en m'indiquant la méthode que je pourrai dupliquer ensuite ?

Avec mes remerciements d'avance

N'hesitez pas à me demander si vous avez besoin d'infos complémentaires.

Bonjour à tous,

Et pourquoi ne pas faire simplement une fusion-publipostage => https://support.office.com/fr-fr/article/Fusion-et-publipostage-%C3%A0-l-aide-d-une-feuille-de-calcul-Excel-858c7d7f-5cc0-4ba1-9a7b-0a948fa3d7d3

Tu récupères les données de la fiche xlsx dans des colonnes d'un autre xlsx (par simple copier/coller), et tu fait ton publipostage.

Pas de blabla, pas de VBA auquel tu n'es pas habituée.

Gagnant-gagnant

Pierre

Bonjour,

Merci pour votre réponse. Je ne crois pas que le publipostage soit adapté à ma demande. Le vrai document fait une dizaine de pages, avec de paragraphes qui doivent s'intégrer (ou non) en fonction d'option choisie dans la 1ère fiche (excel). Je vais essayer d'apprendre et comprendre les processus VBA.

N'hesitez pas si vous avez d'autres sources pour m'aider.

Un grand merci

Coline

bonjour à tous

à ce stade, il vaut mieux envisager Access ou tout autre SGBD

avec VBA, tu vas essayer d'imiter ce qui se fait avec du papier, un crayon, des ciseaux et de la colle. Bidouillage, pas pro.

Bonjour,

Bon ok, si tu veux du code en voici avec des commentaires d'explication pour l'adapter à ton besoin.

A noter, ce code utilise les liaisons tardives pour éviter de cocher la réf word, ceci pour une meilleure portabilité (mais ce qui oblige à initialiser les constantes habituelles, ici wdGoToBookmark).

Si besoin pour d'autres =>https://msdn.microsoft.com/en-us/library/office/aa211923(v=office.11).aspx

Pierre

Public Const wdGoToBookmark = -1

Sub Excel_vers_Word()
Dim WordApp As Object, WordDoc As Object
Dim NDF As String, NDF2 As String, Rep As String

    NDF = ActiveWorkbook.Path & "\modeleword.docx"  ' le doc modèle est placé dans le même dossier que le xlsm
    Rep = ActiveWorkbook.Path & "\DocComplets\"     ' pour enregistrer le doc résultat dans un sous-dossier

    If Not Exist_Fichier(NDF) Then                  ' vérifie l'existence du doc modèle
        MsgBox "Document 'modeleword.docx' manquant", vbExclamation, "COLINE"
    Else
        If Not Exist_Rep(Rep) Then MkDir Rep        ' vérifie l'existence du sous-dossier et le crée éventuellement
        NDF2 = Rep & "Doc_créé_" & Format(Now(), "yyyymmdd_hhmm") & ".docx"  ' pour enregistrer le résultat

        On Error Resume Next
        If Fichier_IsOpen(NDF) Then                 ' vérifie si le modèle est déjà ouvert
           Set WordApp = GetObject(, "Word.Application")
           Set WordDoc = WordApp.Documents(NDF)
        Else                                        ' sinon ouvre l'appli word et le modèle
            Set WordApp = CreateObject("Word.Application")
            Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=False)
        End If

        With WordApp
            .Visible = False

            .Selection.GoTo What:=wdGoToBookmark, Name:="Nom"       ' va au signet 'Nom'
            .Selection.TypeText Text:=ActiveSheet.Range("A2").Value ' et insère le contenu de la cellule A2

            .Selection.GoTo What:=wdGoToBookmark, Name:="Société"       ' va au signet 'Société'
            .Selection.TypeText Text:=ActiveSheet.Range("B2").Value     ' et insère le contenu de la cellule B2

            ' etc ...

            ' s'il y a un tableau dans le doc word
            With WordDoc.Tables(1)
                ' ajoute le contenu de C2 dans la cellule ligne 2 colonne 2 du tableau word
                .cell(2, 2).Range.InsertAfter ActiveSheet.Range("C2").Value
                ' ajoute le contenu de D2 dans la cellule ligne 2 colonne 3 du tableau word
                .cell(2, 3).Range.InsertAfter ActiveSheet.Range("D2").Value
                ' ...
            End With

        End With

        WordDoc.Application.ActiveDocument.SaveAs NDF2  ' enregistre le doc complété

        WordApp.Visible = True ' ou bien : WordApp.Application.Quit ' pour fermer après remplissage
        Set WordDoc = Nothing
        Set WordApp = Nothing
        MsgBox "Document word prêt"

    End If

End Sub

Function Exist_Fichier(S As String) As Boolean
Dim tatiak As Object

    Set tatiak = CreateObject("Scripting.FileSystemObject")
    Exist_Fichier = tatiak.FileExists(S)
    Set tatiak = Nothing
End Function

Function Exist_Rep(NDF As String) As Boolean
    On Error Resume Next
    Exist_Rep = GetAttr(NDF) And vbDirectory
End Function

Function Fichier_IsOpen(ByRef NDF As String) As Boolean
    On Error Resume Next
    Open NDF For Input Lock Read As #1
    Close #1
    Fichier_IsOpen = (Err.Number <> 0)
End Function

Merci beaucoup. J'ai réussi à compléter tous les signets de mon document, avec un code de type :

Sub generation()

Dim wordApp As Object

Dim wordDoc As Object

Dim i As Byte

Set wordApp = CreateObject("word.application")

Set wordDoc = wordApp.Documents.Open("U:\Modèlefichier0.dotx")

wordApp.Visible = False

wordDoc.Bookmarks("signet0").Range.Text = Cells(5, 2)

wordDoc.Bookmarks("signet0bis").Range.Text = Cells(4, 2)

Etc.

Il ne me manque plus qu'à afficher des paragraphes (identifier à l'aide de signets dans mon modèle) en fonction des données des cellules : exemple : si cell (1,1) = oui alors afficher le "signet1", sinon le cacher

ou encore si cell (1,2) = A, alors afficher le signet "A", et masquer le signet B et le signet C

J'ai essayer le code suivant pour la 1ère option mais ça ne semble pas fonctionner.

If Cells(11, 2) = "Non" Then wordDoc.Bookmarks("signet2").Range.Font.Hidden = True

Sauriez-vous m'indiquer mon erreur et sinon comment dois-je procéder ?

Encore un grand merci !

Bonjour,

Masquer je ne sais pas faire, mais pour supprimer un paragraphe (par ex ici le n°7) c'est :

WordDoc.Paragraphs(7).Range.Delete

Merci beaucoup !

Bonjour Coline,

Je pense avec un besoin similaire au tien,

pourrais tu publier ton code finalisé avec un exemple de feuille excel. Cela pourrait-être très utile.

En te remerciant par avance

Mel

Rechercher des sujets similaires à "macro generation doc word signets"