Bonjour,
Je cherche la (les) ligne(s) de commande(s) permettant d'ouvrir depuis un fichier EXCEL (donc macro EXCEL) un fichier Word et ceci via un explorateur de fichier.
Si vous avez des suggestions je suis preneur. Merci par avance.
Cdlt.
Jérôme.
Version imprimable
Bonjour,
Je cherche la (les) ligne(s) de commande(s) permettant d'ouvrir depuis un fichier EXCEL (donc macro EXCEL) un fichier Word et ceci via un explorateur de fichier.
Si vous avez des suggestions je suis preneur. Merci par avance.
Cdlt.
Jérôme.
Bonjour,
Sans code VBA, la fonction LIEN_HYPERTEXTE permet de naviguer dans un répertoire, voir ce billet La fonction LIEN_HYPERTEXTE et l'ouverture de répertoire
On peut également ouvrir directement un document Word depuis Excel à l'aide la même fonction
Exemple pour l'ouverture du document Tutoriel - Hyperlink.docx se trouvant dans le même répertoire que le classeur où se trouve la fonction
Exemple d'ouverture du même document en sélectionnant le signet nommé OffreCode:=LIEN_HYPERTEXTE("Tutoriel - Hyperlink.docx";"Tuto LIEN_HYPERTEXTE")
Il est évidemment possible d'ouvrir un document Word se trouvant dans un autre répertoire.Code:=LIEN_HYPERTEXTE("Tutoriel - Hyperlink.docx#Offre";"Signet 'Offre' du tutoriel LIEN_HYPERTEXTE")
Pour la syntaxe voir cet autre billet Ouvrir un classeur à l'aide de la fonction LIEN_HYPERTEXTE
Bonjour,
Peut-être je me trompe, mais je cherche plutôt à ouvrir un fichier word avec un menu du type "fichier / ouvrir" et à partir de là je peux naviguer dans les dossiers et sous dossier et finalement sélectionner le fichier word voulu.
Toutes les fonctionnalités que vous citez m intéressent malgré tout.
Merci bcp.
Cdlt.
Jerome
Je ne comprends pas ce que tu veux dire par "via un explorateur de fichier".
Est-ce que tu veux dire par là que tu veux pouvoir sélectionner le fichier dans une fenêtre semblable à celle qu'on obtient quand on fait Fichier>Ouvrir ?
Si c'est le cas, utilise la méthode GetOpenFilename.
Lire ceci : https://docs.microsoft.com/fr-fr/off...etopenfilename
Attention, cette méthode te permet seulement de sélectionner le fichier. Elle ne l'ouvre pas.
Pour ouvrir un fichier Word sans Excel, il y a plusieurs méthodes.
Celle que je trouve la plus simple est la fonction GetObject.
Lire ça : https://docs.microsoft.com/fr-fr/off...bject-function
Attention, pense à mettre le résultat de cette fonction dans une variable de type Word.Document pour pouvoir y faire référence dans la suite du code.
Bonjour Menhir,
Voici une copie d'écran du fichier EXCEL à partir duquel j'exécute la macro en cliquant sur le bouton fluo.
Pièce jointe 536169
Voici une copie d'écran du fichier Word vers lequel je transfère les valeurs de champs.
Pièce jointe 536173
Voici la macro dans sa version actuelle :
Comme je suis en phase de développement, je n'ai pas encore mis tous les champs dans le documents word. C'est pour cette raison que certaines lignes sont encore en commentaires.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119 Option Explicit Sub publipostage() ' ' Déclaration des variables ' Dim A_Doc_Title As String Dim A_Doc_Origin As String Dim A_Doc_Reference As String Dim A_Doc_Issue As String Dim A_Doc_Date As String Dim A_AC_Applicability As String Dim A_Customer As String Dim A_ATA_Applicability As String Dim A_Authoring_Name1 As String Dim A_Authoring_Function1 As String Dim A_Approval_Name1 As String Dim A_Approval_Function1 As String Dim A_Authorization_Name1 As String Dim A_Authorization_Function1 As String Dim Ref_RFF As String Dim Title_RFF As String Dim Issue_RFF As String Dim Date_RFF As String Dim Source_Siglum_RFF As String Dim Source_Name_RFF As String Dim Ref_FS As String Dim Title_FS As String Dim Issue_FS As String Dim Date_FS As String Dim Source_Siglum_FS As String Dim Source_Name_FS As String Dim Ref_ID As String Dim WordApp As Object Dim WordDoc As Object Dim pRange As Object ' 'Activation du fichier "BD_DRC.xlsm", on se place dans l'onglet "Feuil1" ' Windows("BD_DRC.xlsm").Activate Sheets("Feuil1").Activate ' ' Mise en mémoire ' A_Doc_Title = Range("B2").Value A_Doc_Origin = Range("C2").Value A_Doc_Reference = Range("D2").Value A_Doc_Issue = Range("E2").Value A_Doc_Date = Range("F2").Value A_AC_Applicability = Range("G2").Value A_Customer = Range("H2").Value A_ATA_Applicability = Range("I2").Value A_Authoring_Name1 = Range("J2").Value A_Authoring_Function1 = Range("K2").Value A_Approval_Name1 = Range("L2").Value A_Approval_Function1 = Range("M2").Value A_Authorization_Name1 = Range("N2").Value A_Authorization_Function1 = Range("O2").Value Ref_RFF = Range("P2").Value Title_RFF = Range("Q2").Value Issue_RFF = Range("R2").Value Date_RFF = Range("S2").Value Source_Siglum_RFF = Range("T2").Value Source_Name_RFF = Range("U2").Value Ref_FS = Range("V2").Value Title_FS = Range("W2").Value Issue_FS = Range("X2").Value Date_FS = Range("Y2").Value Source_Siglum_FS = Range("Z2").Value Source_Name_FS = Range("AA2").Value Ref_ID = Range("AB2").Value ' ' Ouverture de Word ' Set WordApp = CreateObject("Word.application") WordApp.Visible = True ' ' Ouverture du document "UH Temp IZRCK6 - Copie.docm" avec Word ' Set WordDoc = WordApp.Documents.Add(Template:="C:\Users\AB25418\Desktop\TEST\UH Temp IZRCK6 - Copie.docm", Newtemplate:=False, DocumentType:=0) ' ' Modification des champs ' WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Title") = A_Doc_Title WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Origin") = A_Doc_Origin WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Reference") = A_Doc_Reference WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Issue") = A_Doc_Issue WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Date") = A_Doc_Date WordApp.ActiveDocument.CustomDocumentProperties("A_AC_Applicability") = A_AC_Applicability WordApp.ActiveDocument.CustomDocumentProperties("A_Customer") = A_Customer WordApp.ActiveDocument.CustomDocumentProperties("A_ATA_Applicability") = A_ATA_Applicability WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Name1") = A_Authoring_Name1 WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Function1") = A_Authoring_Function1 WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Name1") = A_Approval_Name1 WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Function1") = A_Approval_Function1 WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Name1") = A_Authorization_Name1 WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Function1") = A_Authorization_Function1 WordApp.ActiveDocument.CustomDocumentProperties("Ref_RFF") = Ref_RFF 'WordApp.ActiveDocument.CustomDocumentProperties("Title_RFF") = Title_RFF 'WordApp.ActiveDocument.CustomDocumentProperties("Issue_RFF") = Issue_RFF 'WordApp.ActiveDocument.CustomDocumentProperties("Date_RFF") = Date_RFF 'WordApp.ActiveDocument.CustomDocumentProperties("Source_Siglum_RFF") = Source_Siglum_RFF 'WordApp.ActiveDocument.CustomDocumentProperties("Source_Name_RFF") = Source_Name_RFF 'WordApp.ActiveDocument.CustomDocumentProperties("Ref_FS") = Ref_FS 'WordApp.ActiveDocument.CustomDocumentProperties("Title_FS") = Title_FS 'WordApp.ActiveDocument.CustomDocumentProperties("Issue_FS") = Issue_FS 'WordApp.ActiveDocument.CustomDocumentProperties("Date_FS") = Date_FS 'WordApp.ActiveDocument.CustomDocumentProperties("Source_Siglum_FS") = Source_Siglum_FS 'WordApp.ActiveDocument.CustomDocumentProperties("Source_Name_FS") = Source_Name_FS WordApp.ActiveDocument.CustomDocumentProperties("Ref_ID") = Ref_ID ' ' Mise à jour champs dans feuilles et entêtes ' For Each pRange In WordApp.ActiveDocument.StoryRanges pRange.Fields.Update Next ' MsgBox ("Procedure completed !!") ' End Sub
Mon problème : Les champs situés en entête du document word sont bien mis à jour mais pas ceux présents dans le corps du texte (en l'occurence les champs "Ref_RFF" et "Ref_ID" surlignés en fluo).
que dois-je faire pour que TOUS les champs soient mis à jour ?
Concernant l'explorateur de fichier : "Je ne comprends pas ce que tu veux dire par "via un explorateur de fichier"".
En fait je souhaiterais que lorsque le code arrive à la ligne 79 (Set WordDoc = ...) un menu comme indiqué ci-dessous apparaisse :
Pièce jointe 536175
Je peux ainsi me déplacer dans le bon dossier/sous-dossier et sélectionner le fichier souhaité.
Merci par avance.
Cdlt.
Jérôme.
Je ne comprends pas pourquoi tu utilises des variables intermédiaires entre la valeur de cellule et le renseignement dans le document Word.
Il est possible d'adresser directement ces cellules.
Personnellement, je préfère utiliser des Bookmark (signets) dans Word pour désigner les parties à modifier.Citation:
Mon problème : Les champs situés en entête du document word sont bien mis à jour mais pas ceux présents dans le corps du texte (en l'occurence les champs "Ref_RFF" et "Ref_ID" surlignés en fluo).
que dois-je faire pour que TOUS les champs soient mis à jour ?
Ca donnerait des lignes de code comme celle-ci :
En mettant dès le début du code Set ExcelWS = Workbooks("BD_DRC.xlsm").Sheets("Feuil1") plus fiable que tes Activate.Code:WordDoc.Bookmarks("BM_Title").Range.Text = ExcelWS.Range("B2").Text
Ce code ne pourrait bien sûr fonctionner que si les signets correspondant son mis en place dans le modèle Word.
C'est ce que fait la méthode GetOpenFilename que j'ai indiqué dans ma réponse précédente.Citation:
En fait je souhaiterais que lorsque le code arrive à la ligne 79 (Set WordDoc = ...) un menu comme indiqué ci-dessous apparaisse :
Je peux ainsi me déplacer dans le bon dossier/sous-dossier et sélectionner le fichier souhaité.
Et tu pourrais éliminer ton CreateObjet (et le Documents.Add qui suit) en le remplaçant par un GetObjet.
L'as-tu au moins testée ?
Bonjour Menhir,
J'ai essayé de tenir compte de tes commentaires cependant je cale au niveau du Getobjet ??
De la même façon je ne suis pas du tout sûr de la partie déclaration des variables...Je pensais qu'il fallait déclarer ExcelWS comme un Workbook (comme j'ai eu un message d'erreur de compilation j'ai alors mis object, sans savoir pourquoi, je n'ai plus d'erreur à ce niveau :oops:)
Voici la version modifiée de la macro, notablement plus courte que la version initiale :
Merci par avance.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 Option Explicit Sub publipostage() ' ' Déclaration des variables ' Dim WordApp As Object Dim WordDoc As Object Dim pRange As Object Dim ExcelWS As Object Dim Template As Variant ' 'Activation du fichier "BD.xlsm", on se place dans l'onglet "Feuil1" ' Set ExcelWS = Workbooks("BD.xlsm").Sheets("Feuil1") ' ' 'Ouverture du template Word ' Template = Application.GetOpenFilename("Documents Word prenant en charge les macros (*.docm), Tous les fichiers (*.*),*.* ", 1, "Sélect the template", , False) Getobjet ????? ' ' Modification des champs ' WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Title") = Range("B2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Origin") = Range("C2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Reference") = Range("D2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Issue") = Range("E2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Date") = Range("F2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_AC_Applicability") = Range("G2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Customer") = Range("H2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_ATA_Applicability") = Range("I2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Name1") = Range("J2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Function1") = Range("K2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Name1") = Range("L2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Function1") = Range("M2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Name1") = Range("N2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Function1") = Range("O2").Value WordApp.ActiveDocument.CustomDocumentProperties("Ref_RFF") = Range("P2").Value WordApp.ActiveDocument.CustomDocumentProperties("Ref_ID") = Range("AB2").Value ' ' Mise à jour champs dans feuilles et entêtes ' For Each pRange In WordApp.ActiveDocument.StoryRanges pRange.Fields.Update Next ' MsgBox ("Procedure completed !!") ' End Sub
Cdlt.
Jérôme.
Dans ce code, ExcelWS ne désigne pas le classeur entier (Workbook) mais la feuille (Worksheet) qui contient les données, comme le laisse supposé l'acronyme "WS" que j'ai utilisé dans son nom mais surtout, comme le montre le "Set" que j'ai écrit dans ma réponse précédente.
Le GetObject s'utilise presque de la même façon que le CreateObject, à ceci près qu'il ne se contente pas de créer un nouvelle élément d'une application extérieure mais ouvre directement le fichier avec son application.Citation:
J'ai essayé de tenir compte de tes commentaires cependant je cale au niveau du Getobjet ??
Le CreateObject n'a de sens que si l'on veut créer un objet (Document, classeur, etc.) vierge.
Si l'on veut ouvrir un fichier existant, il est plus simple et rapide de l'ouvrir directement avec un GetObject qu'en deux temps avec un CreateObject puis un Open.
Petit détail : GetObject est une fonction et, à ce titre, retourne une valeur qui référence de l'objet ouvert. Par exemple, dans ton cas, un document Word.
Donc, il faut mettre cet valeur dans une variable de type Word.Document si on veut pouvoir faire référence à ce document dans la suite du code.
Bonjour Menhir,
Voici une nouvelle version du code, pour laquelle j'ai un message d'erreur à la ligne 20 :
Pièce jointe 536623
Par ailleurs la ligne 21 est-elle utile ? La ligne 22 permet-elle d'afficher un menu qui permet de se balader dans les dossier/sous dossier et de sélectionner un fichier (ce que je veux) ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 Option Explicit Sub publipostage() ' ' Déclaration des variables ' Dim WordApp As Object Dim WordDoc As Object Dim pRange As Object Dim ExcelWS As Object Dim Template As Variant Dim wrd As Object ' 'Activation du fichier "BD.xlsm", on se place dans l'onglet "Feuil1" ' Set ExcelWS = Workbooks("BD.xlsm").Sheets("Feuil1") ' ' 'Ouverture du template Word ' Set wrd = GetObject(, "Word.Application") wrd.Visible = True wrd.Documents.Open ' ' Modification des champs ' WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Title") = Range("B2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Origin") = Range("C2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Reference") = Range("D2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Issue") = Range("E2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Date") = Range("F2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_AC_Applicability") = Range("G2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Customer") = Range("H2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_ATA_Applicability") = Range("I2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Name1") = Range("J2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Function1") = Range("K2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Name1") = Range("L2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Function1") = Range("M2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Name1") = Range("N2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Function1") = Range("O2").Value WordApp.ActiveDocument.CustomDocumentProperties("Ref_RFF") = Range("P2").Value WordApp.ActiveDocument.CustomDocumentProperties("Ref_ID") = Range("AB2").Value ' ' Mise à jour champs dans feuilles et entêtes ' For Each pRange In WordApp.ActiveDocument.StoryRanges pRange.Fields.Update Next ' MsgBox ("Procedure completed !!") ' End Sub
Regarde le lien que j'ai placé dans ma réponse #4 concernant le GetObjet().
Cette fonction doit avoir en paramètre le chemin et le nom du fichier à ouvrir. Sinon le code ne sait pas quel fichier ouvrir.
Non.Citation:
La ligne 22 permet-elle d'afficher un menu qui permet de se balader dans les dossier/sous dossier et de sélectionner un fichier (ce que je veux) ?
Open permet uniquement d'ouvrir un document indiqué.
Je le répète à nouveau : c'est la méthode GetOpenFilename qui permet de "naviguer" dans les dossier pour choisir le fichier à ouvrir.
Puis, une fois le fichier sélectionné (et donc son nom et son chemin connus), la fonction GetObject permet de l'ouvrir en même temps que ton application.
Avec cette façon de procéder (je le répète également) la méthode Open n'est pas utile puisque c'est le GetObject qui ouvre le document.
Autre détail : rajoute le parent (la Worksheet) dans la désignation des références de cellules, comme je l'ai spécifié dans la ligne de code que j'ai donné en exemple dans la réponse #6.
Clairement, je patauge...:ptdr::oops::oops:...Ben pas du tout développeur...:oops:
Si j'ai bien compris je dois d'abord mettre le GetOpenFilename et juste après le GetObject ?
La syntaxe pour le GetOpenFilename ne semble pas bonne (ligne 20) ---> message d'erreur.
Quelle est la bonne syntaxe ?
Syntaxe pour GetObject (ligne 21) ?? J'ai comme l'impression que cette ligne (telle que je l'ai écrite) n'ouvre pas le fichier sélectionné à l'étape précédente (ligne 20).
Je ne sais pas où le mettre ainsi que la syntaxe précise ? Le parent est à mettre dans le GetObject ? :oops:Citation:
Autre détail : rajoute le parent (la Worksheet) dans la désignation des références de cellules, comme je l'ai spécifié dans la ligne de code que j'ai donné en exemple dans la réponse #6.
Voici une nouvelle version me retournant une erreur :
Je tourne en rond...:scarymov::mur:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 Option Explicit Sub publipostage() ' ' Déclaration des variables ' Dim WordApp As Object Dim WordDoc As Object Dim pRange As Object Dim ExcelWS As Object Dim Template As Variant Dim wrd As Object ' 'Activation du fichier "BD.xlsm", on se place dans l'onglet "Feuil1" ' Set ExcelWS = Workbooks("BD.xlsm").Sheets("Feuil1") ' ' 'Sélection du fichier via browse ' Template = Application.GetOpenFilename("Documents Word prenant en charge les macros (*.docm), Tous les fichiers (*.*),*.* ", 1, "Sélect the template", , False) Set wrd = GetObject(, "Word.Application") ' ' Modification des champs ' WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Title") = Range("B2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Origin") = Range("C2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Reference") = Range("D2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Issue") = Range("E2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Date") = Range("F2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_AC_Applicability") = Range("G2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Customer") = Range("H2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_ATA_Applicability") = Range("I2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Name1") = Range("J2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Function1") = Range("K2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Name1") = Range("L2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Function1") = Range("M2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Name1") = Range("N2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Function1") = Range("O2").Value WordApp.ActiveDocument.CustomDocumentProperties("Ref_RFF") = Range("P2").Value WordApp.ActiveDocument.CustomDocumentProperties("Ref_ID") = Range("AB2").Value ' ' Mise à jour champs dans feuilles et entêtes ' For Each pRange In WordApp.ActiveDocument.StoryRanges pRange.Fields.Update Next ' MsgBox ("Procedure completed !!") ' End Sub
Merci de votre (immense) patience...:oops:
Cdlt.
Jérôme
Personnellement, pour faire un code propre, je mettrais entre les deux un test pour vérifier que l'utilisateur a effectivement sélectionné un fichier et n'est pas sorti de la fenêtre avec un "Annuler".
Celle qui est expliquée dans le lien que j'ai donné en réponse #4. L'as-tu consulté.Citation:
La syntaxe pour le GetOpenFilename ne semble pas bonne (ligne 20) ---> message d'erreur.
Quelle est la bonne syntaxe ?
Le GetObject ne peut pas ouvrir un fichier si tu ne lui indiques pas le nom et le chemin de ce fichier.Citation:
J'ai comme l'impression que cette ligne (telle que je l'ai écrite) n'ouvre pas le fichier sélectionné à l'étape précédente (ligne 20).
Je le répète, le GetOpenFilename sert a sélectionner un fichier et à récupérer son nom et son chemin dans une variable.
Il n'y a pas de lien direct entre GetOpenFilename et GetObject.
Il faut utiliser la variable qui récupère le nom et le chemine du fichier suite au GetOpenFilename pour indiquer à GetObject quel fichier ouvrir.
Non, je parlais de la série de Range qu'il y a ensuite.Citation:
Je ne sais pas où le mettre ainsi que la syntaxe précise ? Le parent est à mettre dans le GetObject ?Citation:
Autre détail : rajoute le parent (la Worksheet) dans la désignation des références de cellules, comme je l'ai spécifié dans la ligne de code que j'ai donné en exemple dans la réponse #6.
Si tu n'indiques pas à quelle feuille appartiennent ces Range, VBA risque de faire une confusion.
Voir dans mon message #6 la ligne de code qui montre comment transférer d'un Range Excel vers un Bookmark Word.
Oui et j’ai également fouillé sur le net car je ne comprenais pas bien ce qui était proposé. J'ai finalement repris une ligne de commande sur un site.Citation:
La syntaxe pour le GetOpenFilename ne semble pas bonne (ligne 20) ---> message d'erreur.
Quelle est la bonne syntaxe ?
Celle qui est expliquée dans le lien que j'ai donné en réponse #4. L'as-tu consulté.
En ligne 20, je propose donc en remplacement :
OK ?Code:Template = Application.GetOpenFilename("Documents Word prenant en charge les macros (*.docm), *.docm)")
La ligne de commande proposée juste avant ne récupère donc pas le nom et le chemin ?? Il faut donc que je créé deux variables, une qui va récupérer le nom et l’autre qui va récupérer le chemin ? Quelque chose comme :Citation:
Le GetObject ne peut pas ouvrir un fichier si tu ne lui indiques pas le nom et le chemin de ce fichier.
Je le répète, le GetOpenFilename sert a sélectionner un fichier et à récupérer son nom et son chemin dans une variable.
Code:
1
2
3 Template = Application.GetOpenFilename("Documents Word prenant en charge les macros (*.docm), *.docm)") NomFichier = ??? syntaxe ?? Chemin = ?? syntaxe ??
C’est juste après que je met le GetObject si je comprend bien ?
Il me faut donc une ligne d’instruction contenant NomFichier, Chemin et GetObject ?? Syntaxe ??
Et en terme de déclaration de variables ?
OK ?Code:
1
2
3 Dim NomFichier as Variant Dim Chemin as Variant Dim Template as Variant
Je dois partir, mais je suivrais sur mon téléphone portable toute réponse éventuelle.
Merci encore.
Cdlt.
Jérôme.
Le GetOpenFilename récupère le nom et le chemin du fichier.
Cette information est placée dans la variable Template grace au "=" entre la variable et la méthode.
Non, le nom et le chemin forment une seule chaine de caractère.Citation:
Il faut donc que je créé deux variables, une qui va récupérer le nom et l’autre qui va récupérer le chemin ?
Fais un Debug.Print ou un MsgBox pour afficher le contenu de cette variable ou regarde dans la fenêtre des variables locales ou une des multiples autres méthodes disponibles.
Je crois que j'ai répondu au moins 4 fois à cette question. Je doute qu'une cinquième fois ait une quelconque utilité.Citation:
C’est juste après que je met le GetObject si je comprend bien ?
Non, il faut juste mettre Template dans le GetObject suivant la syntaxe présentée dans le lien que j'ai mis en réponse #4.Citation:
Il me faut donc une ligne d’instruction contenant NomFichier, Chemin et GetObject ?? Syntaxe ??
Template en StringCitation:
Et en terme de déclaration de variables ?
WordDoc en Word.Document (déjà dit).
ExcelWS en Worksheet (déjà dit).
Les Variant, il vaut mieux éviter à moins d'y être forcé.
Bonjour,
Voici les modif apportées à mon code (tout en bas de ce message).
J'ai déclaré dans un premier temps ma variable "Template" de la façon suivante :
A l'éxécution j'obtiens une erreur :Code:Dim Template As Word.Document
Pièce jointe 537591
Suite à ce message d'erreur je modifie la ligne et je rentre :
Cela me permet lorsque j'exécute la macro pas à pas de passer à la ligne suivante sans message d'erreur.Code:Dim Template As Object
Lorsque j'arrive à la ligne :
Un menu "ouvrir" s'ouvre (ENFIN ce que je veux :bravo:), je sélectionne alors le fichier .docm souhaité et j'ai alors un message d'erreur :Code:Template = Application.GetOpenFilename("Documents Word prenant en charge les macros (*.docm), *.docm)")
Pièce jointe 537592
Dans le code ci-dessous, mon commentaire est-il exact ? De façon générale est-ce que les commentaires indiqués dans mon code tout en bas sont exact ? Cela me permet de valider pas à pas ce que je fais (pas du tout développeur).
Citation:
' Ouverture du fichier sélectionné précédemment ??
'
Set wrd = GetObject(Template, "Word.Application")
Nouveau code :
Merci encore.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 Option Explicit Sub publipostage() ' ' Déclaration des variables ' Dim WordApp As Object Dim WordDoc As Object Dim pRange As Object Dim ExcelWS As Object Dim Template As Object Dim wrd As Object ' 'Activation du fichier "BD.xlsm", on se place dans l'onglet "Feuil1" ' Set ExcelWS = Workbooks("BD.xlsm").Sheets("Feuil1") ' ' 'Sélection du fichier via browse ' Template = Application.GetOpenFilename("Documents Word prenant en charge les macros (*.docm), *.docm)") MsgBox ("Template = ") & Template ' ' Ouverture du fichier sélectionné précédemment ?? ' Set wrd = GetObject(Template, "Word.Application") ' ' Modification des champs ' WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Title") = Range("B2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Origin") = Range("C2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Reference") = Range("D2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Issue") = Range("E2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Date") = Range("F2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_AC_Applicability") = Range("G2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Customer") = Range("H2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_ATA_Applicability") = Range("I2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Name1") = Range("J2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Function1") = Range("K2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Name1") = Range("L2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Function1") = Range("M2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Name1") = Range("N2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Function1") = Range("O2").Value WordApp.ActiveDocument.CustomDocumentProperties("Ref_RFF") = Range("P2").Value WordApp.ActiveDocument.CustomDocumentProperties("Ref_ID") = Range("AB2").Value ' ' Mise à jour champs dans feuilles et entêtes ' For Each pRange In WordApp.ActiveDocument.StoryRanges pRange.Fields.Update Next ' MsgBox ("Procedure completed !!") ' End Sub
Cdlt.
Jérôme
Tu n'as pas chargé la bibliothèque d'objets Word : Menu Outils > Références > Cocher la bibliothèque Microsoft Word 16.0 Object Library.
Cela dit, dans ma réponse précédente, je t'avais dit de le déclarer en String.
Je me demande s'il y a vraiment un intérêt à écrire...
GetOpenFilename, comme son nom l'indique, ne renvoie pas un objet mais un nom de fichier, donc un String.Citation:
Lorsque j'arrive à la ligne :
Un menu "ouvrir" s'ouvre (ENFIN ce que je veux :bravo:), je sélectionne alors le fichier .docm souhaité et j'ai alors un message d'erreur :Code:Template = Application.GetOpenFilename("Documents Word prenant en charge les macros (*.docm), *.docm)")
Ca ne peut être considéré comme un document Word que lorsqu'on ouvre ce document avec GetObject.
Mais, de nouveau, j'ai déjà expliqué ça plusieurs fois.
Bonjour,
Tout d'abord j'ai coché "Microsoft Word 15.0 Object Library" dans Menu Outils > Références > d'EXCEL :
Ce n'est pas la version 16.0 mais la 15.0 (probablement du fait que je suis sous la version EXCEL 13.0) ?
Pièce jointe 537721
Ensuite, j'ai effectué quelques manips pour essayer de comprendre ce que faisaient certaines lignes de codes.
Notamment :
Visiblement cette ligne de code ne fait pas ce que j'ai écrit en commentaire, à savoir :Code:Set ExcelWS = Workbooks("BD.xlsm").Sheets("Feuil1")
Je souhaitait via cette ligne activer le fichier BD.xlsm et me mettre dans l'onglet Feuil1, c'est pour cela que j'avais mis au départ un "activate", qui semble t-il n'est pas judicieux ? J'ai comme l'impression que cette ligne ne sert à rien car la macro étant exécutée depuis l'onglet "Feuil1" il ne doit pas être nécessaire d'activer cet onglet ?Code:'Activation du fichier "BD.xlsm", on se place dans l'onglet "Feuil1"
Lorsque j'exécute la macro via la touche F8 (pas à pas), le texte Template situé dans la ligne de commande m'affiche (lorsque je survole le texte) Template = FAUX ??
Il ne s'agit donc pas de la valeur affichée via le msgbox plus haut (celui-ci me retourne bien le chemin et le nom du fichier qui vient d'être sélectionné :king:). Visiblement il s'agit d'autre chose.
J'avance (malheureusement) petit à petit ...:ptdr:
Code mis à jour (notamment les déclarations de variables) :
Merci.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 Option Explicit Sub publipostage() ' ' Déclaration des variables ' Dim WordApp As Object Dim WordDoc As Word.Document Dim pRange As Object Dim ExcelWS As Worksheet Dim Template As String Dim wrd As Object ' 'Activation du fichier "BD.xlsm", on se place dans l'onglet "Feuil1" ' Set ExcelWS = Workbooks("BD.xlsm").Sheets("Feuil1") ' ' 'Sélection du fichier via browse ' Template = Application.GetOpenFilename("Documents Word prenant en charge les macros (*.docm), *.docm)") MsgBox ("Template = ") & Template ' ' Ouverture du fichier sélectionné précédemment ?? ' Set wrd = GetObject(Template, "Word.Application") ' ' Modification des champs ' WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Title") = Range("B2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Origin") = Range("C2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Reference") = Range("D2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Issue") = Range("E2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Date") = Range("F2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_AC_Applicability") = Range("G2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Customer") = Range("H2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_ATA_Applicability") = Range("I2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Name1") = Range("J2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Function1") = Range("K2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Name1") = Range("L2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Function1") = Range("M2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Name1") = Range("N2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Function1") = Range("O2").Value WordApp.ActiveDocument.CustomDocumentProperties("Ref_RFF") = Range("P2").Value WordApp.ActiveDocument.CustomDocumentProperties("Ref_ID") = Range("AB2").Value ' ' Mise à jour champs dans feuilles et entêtes ' For Each pRange In WordApp.ActiveDocument.StoryRanges pRange.Fields.Update Next ' MsgBox ("Procedure completed !!") ' End Sub
Cdlt.
Jérôme.
C'est ma dernière intervention parce que ça devient lassant de répéter plusieurs fois les même choses sans que tu en tiennes compte.
Cette ligne met dans une variable la référence de la feuille de calcul où se trouvent tes données sources.
Ainsi, on évite de faire des Select ou des Activate qui ne font que ralentir et compliquer le code.
Mais elle n'est utile que si cette variable est utilisée comme parent des références de cellules placées par la suite, comme je l'ai fait dans le code de ma réponse #6 que tu n'as toujours pas intégré.
Ca signifie que tu as quitté la fenêtre de sélection de fichier par le bouton Annuler.Citation:
Lorsque j'exécute la macro via la touche F8 (pas à pas), le texte Template situé dans la ligne de commande m'affiche (lorsque je survole le texte) Template = FAUX ??
Set wrd = GetObject(Template)Citation:
Set wrd = GetObject(Template, "Word.Application")
Bonjour Menhir,
Après échanges avec des collègues de travail, voici la version modifiée qui m'est proposée et qui fonctionne mis à part le fait que la date insérée dans le document Word est inversée par rapport au fichier EXCEL (pb de format : inversion jour/mois). Pb entre anglais / français ? Pourtant lorsque je regarde le format de la cellule dans le fichier EXCEL celui-ci est correct --> JMA - paramètres régionaux français ?
Par exemple :
Dans le fichier EXCEL : date = 14/09/2018
Dans le fichier Word : date = 9/14/2018
Je souhaiterais avoir dans le fichier word le même format que la date du fichier EXCEL à savoir 14/09/2018 (format JMA).
Si je chipote, je souhaiterais que lorsque la macro est terminée s'affiche le fichier word (fichier EXCEL passe dessous le fichier Word).
Voici la macro modifiée, très certainement pas optimisée et j'en passe, cependant elle fonctionne, je n'en demande pas plus :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 Option Explicit Sub publipostage() ' ' Déclaration des variables ' Dim WordApp As Object Dim WordDoc As Word.Document Dim pRange As Object Dim ExcelWS As Worksheet Dim Template As String ' ' ' Sélection du fichier via un menu "Fichier / Ouvrir" ' On met en mémoire, dans la variable Template, le chemin et le nom du fichier avec l'extension DOCM ' Template = Application.GetOpenFilename("Documents Word prenant en charge les macros (*.docm), *.docm)") ' ' ' Ouverture et affichage de Word ' Set WordApp = CreateObject("Word.Application") WordApp.Visible = True ' ' ' Ouverture du fichier sélectionné précédemment ' WordApp.Documents.Open (Template) ' ' ' Modification des champs ' WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Title") = Range("B2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Origin") = Range("C2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Reference") = Range("D2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Issue") = Range("E2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Doc_Date") = Range("F2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_AC_Applicability") = Range("G2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Customer") = Range("H2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_ATA_Applicability") = Range("I2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Name1") = Range("J2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authoring_Function1") = Range("K2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Name1") = Range("L2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Approval_Function1") = Range("M2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Name1") = Range("N2").Value WordApp.ActiveDocument.CustomDocumentProperties("A_Authorization_Function1") = Range("O2").Value WordApp.ActiveDocument.CustomDocumentProperties("Ref_RFF") = Range("P2").Value WordApp.ActiveDocument.CustomDocumentProperties("Ref_ID") = Range("AB2").Value ' ' ' Mise à jour champs dans l'entête et le corps du document ' For Each pRange In WordApp.ActiveDocument.StoryRanges pRange.Fields.Update Next ' MsgBox ("Procedure completed !!") ' End Sub
Merci encore.
Cdlt.
Jérôme.
Code:Format(Range("F2").Value,"dd/mm/yyyy")