Résolu Création d'un document Word à partir d'Excel VBA

BasileD

Membre confirmé
4 Décembre 2019
12
0
27
Bonjour à tous,

je débute en VBA et je me heurte à un problème de taille .. Je voudrais à partir d'un bouton sur mon fichier Excel créer un nouveau document Word qui s'enregistrait sur mon bureau. Cela semble assez simple à faire sous PC et beaucoup de forums en parlent mais impossible de le faire sur mon Mac.

Je voudrais qu'un texte se génère automatiquement sur mon Word en mettant le texte des cellules [A1] , [A2], [A3] , [A4] et [A5]. Pour l'instant je le fais grâce à un collage spécial mais les liaisons ne tiennent pas bien ce n'est pas propre et c'est compliqué pour le partager..

Savez vous comment on peut faire ?

PS : le problème vient peut être de mon chemin qui est le suivant : "/Users/NomduPC/Desktop/doc1.docs"
PS2 : je suis sur la dernière version d'Excel
PS3 : je travaille sur un macbook pro
merci d'avance pour votre réponse qui m'aiderait beaucoup !

Basile
 
Dernière édition par un modérateur:
Dans ces nombreux (?) forums qui en parlent, est-ce qu'il est bien question de versions pour Mac ?

Merci de préciser ce qu'il faut entendre par "la dernière version d'Excel" (s'agit-il bien d'Excel 2019 en version 16.31 ?) ainsi que la version de macOS concernée (ça peut avoir son importance). Ton chemin d'accès n'a, en soi, rien d'inhabituel, mais macOS ne permet pas l'accès à ce dossier directement via une commande automatisée...

Du fait des restrictions apportées avec les dernières versions de macOS, le plus simple est probablement de faire appel à une instruction AppleScript dans ta macro VBA. A priori, la référence la plus complète concernant les manips en VBA avec les versions actuelles d'Excel (les version 2016 et 2019), c'est le site de Ron de Bruin, plus précisément la section traitant des versions pour Mac.

Si j'ai un peu de temps, je regarderai ce que je peux te donner comme éléments complémentaires...
 
Dans ces nombreux (?) forums qui en parlent, est-ce qu'il est bien question de versions pour Mac ?

Merci de préciser ce qu'il faut entendre par "la dernière version d'Excel" (s'agit-il bien d'Excel 2019 en version 16.31 ?) ainsi que la version de macOS concernée (ça peut avoir son importance). Ton chemin d'accès n'a, en soi, rien d'inhabituel, mais macOS ne permet pas l'accès à ce dossier directement via une commande automatisée...

Du fait des restrictions apportées avec les dernières versions de macOS, le plus simple est probablement de faire appel à une instruction AppleScript dans ta macro VBA. A priori, la référence la plus complète concernant les manips en VBA avec les versions actuelles d'Excel (les version 2016 et 2019), c'est le site de Ron de Bruin, plus précisément la section traitant des versions pour Mac.

Si j'ai un peu de temps, je regarderai ce que je peux te donner comme éléments complémentaires...

Bonjour Aliboron,

Merci beaucoup pour ton aide !

Pour répondre à tes questions :
- Les forums que j'ai lu parlaient de version pour PC..
- Il s'agit-il bien d'Excel 2019 en version 16.31
- Je suis sous macOS Sierra (je ne pensais pas que c'était important au temps pour moi)

Merci pour tes conseils, ça fait 3 jours que je galère.. :') Je vais me renseigner sur AppleScript et sur le site que tu m'as conseillé, en espérant que cette fois ci ça marche. Merci encore !
 
Sauf erreur (ou cas très particulier), les Mac qui acceptent Sierra peuvent passer à High Sierra. Je te recommande de le faire, car Office 2019 se comporte parfois bizarrement dans Sierra.
 
Bon j'ai essayé de faire ce que je voulais avec AppleScript, je vois le principe et ca pourrait marcher mais il va me falloir un peu de temps pour voir comment ca fonctionne et comment je peux faire appel a Word et Excel dans mon script puis executer le script depuis une macro.. Je vais persévérer et j'espère ne pas perdre mon temps ahah
En attendant si quelqu'un l'a déjà fait je suis preneur !
 
Bonjour,

J'ai déjà lancé un applescipt depuis une macro excel dans excel 2019, je pourrai te donner la marche à suivre.

Mais en lisant ton 1er post il semblerai que tu veuilles partager le fichier, or, le script applescript s'installe dans la bibliothèque users, donc le partage ne sera pas simple, il faudra installer le script dans tous les ordinateurs et les comptes utilisateurs qui devrons s'en servir .
Dis -moi si tu es interressé quand même?
 
Salut Zeltron54 !

Merci pour ta réponse, je ne dois partager le fichier qu'avec 4 de mes collègues je pourrai donc facilement installer le script sur leurs Mac (qui sont les mêmes que moi).

Je suis donc très intéressé si tu peux m'aider !

Merci d'avance !
 
Sur le principe, c'est assez simple. Pour illustrer, l'AppleScript suivant :

Capture d’écran.png
Se convertit et se lance sous cette forme :

Capture d’écran 1.png

Mais ça, c'est le principe de base. Après... ça se complique ! Raison pour laquelle je te recommande à nouveau fortement de jeter un oeil (attentif) aux pages de Ron de Bruin dont j'ai donné le lien plus haut. En effet, les contraintes liées au fonctionnement en "bac à sable" des versions récentes de macOS rendent les choses "un peu" plus compliquées : on ne doit plus utiliser l'instruction MacScript mais AppleScriptTask, par exemple, et, du coup, enregistrer la macro dans une section spécifique de la Bibliothèque du compte utilisateur.

Et puis les indications que te donnera zeltron54 seront certainement précieuses également.
 
Dernière édition:
@ Aliboron :coucou:

@BasileD

Alors il faut d'abord créer le script j, je t'en mets un en exemple qui ouvre word, crée un nouveau document et écrit sur ce document (il te faudra récupérer le contenu de tes cellules excel dans une variable pour les écrire dans le doc word).

Ce script doit être enregistrer dans la bibliothèque utilisateurs --> Application Scripts --> com.microsoft.Excel-->
Si ces dossiers n'existe pas il faut les créer avec le nom exact. Il peut être enregistré sous un nom quelconque (le mien s'appelle "mes scripts").
Dans excel (exemple d'appel du script)

Sub CreerDocWord()
repertoire = AppleScriptTask("mes scripts.scpt", "CreerDocWord", "")
End Sub

le script exemple:
Bloc de code:
on CreerDocWord()
    
    tell application "Microsoft Word"
        
        create new document
        
        set myRange to create range active document start 0 end 0
        
        set content of myRange to "Bonjour," & return
        set myRange to change end of range myRange by a story item --se positionne à la fin du dernier texte écrit
        
        set content of myRange to "Première ligne de texte." & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to "je suis la 2ieme ligne" & return
        
        set myRange to change end of range myRange by a story item extend type by selecting --va formater le dernier texte ecrit avec font times et italic
        set name of font object of myRange to "Times"
        
        set italic of font object of myRange to true
        -- il suffira d'enregistrer sue ton bureau
    end tell
end CreerDocWord
 
  • J’aime
Réactions: BasileD et Aliboron
Merci beaucoup pour vos message et Zeltron54 pour ton script !

A première vue je n'ai pas tout compris mais je vais regarderai à tête reposée ca sera formateur !

Je devrais y arriver maintenant ahah dès que c'est fait je posterai ici afin que tous ceux qui se posent la même question que moi galèrent moins longtemps !
 
@zeltron54
Je me suis penché sur ton Script (que j'ai compris yess) !
J'ai bien trouvé le répertoire utilisateur et mon script est bien enregistré dans "com.microsoft.Excel".

Deux questions :
- Comment j'enregistre le document Word créé sur mon bureau ?
- Dans mon Sub() lorsque j'écris "repertoire" comme toi, VBA considère que c'est une variable non déclarée.. dois-je faire quelque chose en particulier ? (c'est peut-être évident mais je suis débutant ahah)

Merci pour votre accompagnement !
 
Je regarderai dès que possible la je suis sur tel. pas de Mac sous la main ...
 
  • J’aime
Réactions: BasileD
Pour la macro dans le Sub() il faut déclarer la variable:

Sub creerDocWord()
Dim repertoire As String
repertoire = AppleScriptTask("mes scripts.scpt", "CreerDocWord", "")
End Sub

Pour enregistrer le doc word dans le script tu ajoutes, en remplacant NomUtilisateur par le tien(le nom de la petite maison).
Bloc de code:
save front document in "macintosh HD:NomUtilisateur:desktop:mondoc.docx"

Pour récupérer les valeurs des cellules excel
dans le script tu peux faire: en adaptant le nom de la feuille excel
Tu auras 4 variables avec la contenu des cellules A1 à A5 que tu pourras écrire dans le doc word
Bloc de code:
tell application "Microsoft Excel"
    activate
    select sheet "Feuil1" -- sélectionne la feuille contenant les cellules à copier
    set lavaleur1 to value of range "A1" --cellule à copier
    set lavaleur2 to value of range "A2" 
    set lavaleur3 to value of range "A3"
    set lavaleur4 to value of range "A4"
    set lavaleur5 to value of range "A5" 
    
end tell
 
  • J’aime
Réactions: BasileD
Autant pour moi declarer repertoire as string est ce qu'il fallait faire je suis très content du premier résultat car word s'ouvre et ecrit du texte !! Merci infiniment on touche au but !
il ne me reste plus qu'a trouver comment on peut enregistrer le doc automatiquement sur le bureau et comment on fait appel à la valeur de cellules excel dans l'apple script ! quel bonheur ahah
 
Alors le script devrait être : (N'oublies pas de changer le nom Utilisateur) et le nom de la feuille excel.

Bloc de code:
on CreerDocWord()
tell application "Microsoft Excel"
    activate
    select sheet "Feuil1" -- sélectionne la feuille contenant les cellules à copier
    set lavaleur1 to value of range "A1" --cellule à copier
    set lavaleur2 to value of range "A2"
    set lavaleur3 to value of range "A3"
    set lavaleur4 to value of range "A4"
    set lavaleur5 to value of range "A5"
  
end tell
  
    tell application "Microsoft Word"
      
        create new document
      
        set myRange to create range active document start 0 end 0
      
        set content of myRange to lavaleur1 & return & lavaleur2 & return & lavaleur3 & return & lavaleur4 & return & lavaleur5
      
        save front document in "macintosh HD:users:NomUtilisateur:desktop:mondoc.docx"
    end tell
end CreerDocWord
 
Dernière édition:
Ca fonctionne enfin !! merci beaucoup ! je vous mets mon code apple Script (très long) exécuté dans la macro suivante :

Sub CreerDocWord()
Dim repertoire As String

repertoire = AppleScriptTask("ScriptWord.scpt", "CreerDocWord", "")

End Sub

Bloc de code:
on CreerDocWord()
    tell application "Microsoft Excel"
        activate
        select sheet "RECO" -- sélectionne la feuille contenant les cellules à copier
        set V1 to value of range "C2" --cellule à copier
        set V2 to value of range "E2"
        set V3 to value of range "D2"
        set T1 to value of range "D3"
        set E1 to value of range "C3"
        set T2 to value of range "D4"
        set E2 to value of range "C4"
        set T3 to value of range "D5"
        set E3 to value of range "C5"
        set T4 to value of range "D6"
        set E4 to value of range "C6"
        set T5 to value of range "D7"
        set E5 to value of range "C7"
        set T6 to value of range "D8"
        set E6 to value of range "C8"
        set T7 to value of range "D9"
        set E7 to value of range "C9"
        set T8 to value of range "D10"
        set E8 to value of range "C10"
        set T9 to value of range "D11"
        set E9 to value of range "C11"
        set T10 to value of range "D12"
        set E10 to value of range "C12"
        set T11 to value of range "D13"
        set E11 to value of range "C13"
        set T12 to value of range "D14"
        set E12 to value of range "C14"
        set T13 to value of range "D15"
        set E13 to value of range "C15"
        set T14 to value of range "D16"
        set E14 to value of range "C17"
        set T15 to value of range "D17"
        set E15 to value of range "C17"
        set T16 to value of range "D18"
        set E16 to value of range "C18"
        set T17 to value of range "D19"
        set E17 to value of range "C19"
        set T18 to value of range "D20"
        set E18 to value of range "C20"
        set T19 to value of range "D21"
        set E19 to value of range "C21"
        set T20 to value of range "D22"
        set E20 to value of range "C22"
        set T21 to value of range "D23"
        set E21 to value of range "C23"
        set T22 to value of range "D24"
        set E22 to value of range "C24"
        set T23 to value of range "D25"
        set E23 to value of range "C25"
        set T24 to value of range "D26"
        set E24 to value of range "C26"
        set T25 to value of range "D27"
        set E25 to value of range "C27"
        
        
    end tell
    tell application "Microsoft Word"
        
        create new document
        
        set myRange to create range active document start 0 end 0
        
        set content of myRange to V1 & return
        set myRange to change end of range myRange by a story item --se positionne à la fin du dernier texte écrit
        
        set content of myRange to V2 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to V3 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T1 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E1 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T2 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E2 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T3 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E3 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T4 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E4 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T5 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E5 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T6 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E6 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T7 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E7 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T8 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E8 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T9 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E9 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T10 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E10 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T11 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E11 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T12 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E12 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T12 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E12 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T13 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E13 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T14 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E14 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T15 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E15 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T16 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E16 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T17 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E17 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T18 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E18 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T19 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E19 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T20 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E20 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T21 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E21 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T22 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E22 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T23 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E23 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T24 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E24 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to T25 & return
        set myRange to change end of range myRange by a story item
        
        set content of myRange to E25 & return
        set myRange to change end of range myRange by a story item
        
        
    end tell
    
end CreerDocWord

Il me manque plus qu'à mettre en forme certaines variable de texte (@zeltron54 m'a parfaitement expliqué comment faire) et le résultat sera parfait !

Merci mille fois @zeltron54 et @Aliboron !
 
Regarde le dernier script que je t'ai mis ...

Tu éviteras le repositionnement en fin de texte en écrivant plusieurs variables en une seule fois chaque variable suivie d'un return pour aller à la ligne.
et tu trouveras en fin de script la ligne pour enregistrer.
Tu pourras même ajouter après cette ligne une ligne pour fermer le document après enregistrement, c'est :

close front document

Bonne programmation et n'hésites pas à nous dire si ça fonctionne et si tu as besoin d'aide...
 
Oui ça fonctionne parfaitement ! Je me demande simplement s'il n'est pas possible de faire une boucle de type While ou For en Apple Script pour simplifier tout cela.. Savez-vous comment je peux mettre les variables commençant par "T" (qui correspondent à des titres) en gras ?

J'ai bien vu comment enregistrer le document ou le fermer mais j'ai finalement décidé qu'il était plus simple, considérant l'usage que j'aurai à faire de ce fichier, de simplement ouvrir un word et écrire dedans sans l'enregistrer ! Ce qui est sur c'est que tout ca me resservira !

Merci !
 
Dernière édition:
Bonjour,
L'instruction de boucle en applescript est: repeat .... end repeat
avec les variantes: repeat until (test) , repeat while (test), repeat x [times], Repeat with variable in liste , repeat with variable from (valeur depart) to (valeurarrêt) by (incrément).

Tu trouveras des exemples sur google ....

Pour mettre en gras , après chaque écriture d'une variable Txxx tu mets les lignes de mise en forme de mon script exemple (italic) pour le gras 'Bold):

set myRange to change end of range myRange by a story item extend type by selecting
set Bold of font object of myRange to true

bonne journée
 
  • J’aime
Réactions: BasileD