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

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Répondre
C
Coline07
Nouveau venu
Nouveau venu
Messages : 5
Inscrit le : 24 mars 2017
Version d'Excel : 2010

Message par Coline07 » 25 mars 2017, 00:15

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.
exemple fichier Ex.xlsx
(13.55 Kio) Téléchargé 144 fois
Modifié en dernier par Coline07 le 26 mars 2017, 03:21, modifié 1 fois.
Avatar du membre
pierrep56
Membre impliqué
Membre impliqué
Messages : 1'197
Appréciations reçues : 197
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 25 mars 2017, 09:04

Bonjour à tous,

Et pourquoi ne pas faire simplement une fusion-publipostage => https://support.office.com/fr-fr/articl ... 948fa3d7d3

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
C
Coline07
Nouveau venu
Nouveau venu
Messages : 5
Inscrit le : 24 mars 2017
Version d'Excel : 2010

Message par Coline07 » 25 mars 2017, 16:38

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
j
jmd
Fanatique d'Excel
Fanatique d'Excel
Messages : 10'599
Appréciations reçues : 250
Inscrit le : 8 décembre 2007
Version d'Excel : 365 + PowerBI

Message par jmd » 25 mars 2017, 17:31

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.
Apprenez les fonctions d'Excel.
Exemple "Mettre sous forme de tableau", TCD, "Récupérer des données".
Apprendre les fonctionnalités "récentes".
Avatar du membre
pierrep56
Membre impliqué
Membre impliqué
Messages : 1'197
Appréciations reçues : 197
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 26 mars 2017, 09:42

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/librar ... e.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
C
Coline07
Nouveau venu
Nouveau venu
Messages : 5
Inscrit le : 24 mars 2017
Version d'Excel : 2010

Message par Coline07 » 28 mars 2017, 23:17

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 !
Avatar du membre
pierrep56
Membre impliqué
Membre impliqué
Messages : 1'197
Appréciations reçues : 197
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 29 mars 2017, 10:11

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
C
Coline07
Nouveau venu
Nouveau venu
Messages : 5
Inscrit le : 24 mars 2017
Version d'Excel : 2010

Message par Coline07 » 29 mars 2017, 10:49

Merci beaucoup !
l
loka
Jeune membre
Jeune membre
Messages : 11
Inscrit le : 10 juin 2016
Version d'Excel : 2010

Message par loka » 22 janvier 2019, 11:27

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
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message