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
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