Lancement d'une marco appartenant à un autre fichier (Word VBA) [Résolu]

Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 22 mars 2006 à 15:35 - Dernière réponse : Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention
- 11 mai 2006 à 09:53
Voila mon problème :

J'ai développer une macro qui ouvre un doc Word copy et met en forme du texte et des tableau (ca ça roule
)
J'ai également besoin de récupérer des information contenue dans un fichier Excel (ca ça roule aussi , il copy les données dans un nouveau doc Word)

Je veut crée un bouton (dans une nouvelle barre d'outils) qui exécute la seconde macro. Bouton qui est crée à la fin de la premierre macro (et ca ça roule aussi)

Problème elle est contenu (la macro) dans un fichier (Word) différant du fichier du bouton du coup lorsque je click sur mon bouton Word m'affiche un message d'erreur : "La marco est introuvable ou a été désactivée à cause de vos paramètres de sécurité des macros.". En fouillan l'aide j'ai découver que seul les marco du doc actif peuve être executer?????? Ca ça c'est pas cool !

Ca fait deux heure que je fait des test et "rien y veut"

J'ai tenter de faire par exemple :
-> CommandBars("Barre").Controls(1).OnAction = "Documents(Documents.Count).Application.Run ""test""" (Le doc qui contien la macro est toujours le dernier de la liste)
-> CommandBars("Barre").Controls(1).OnAction = "Documents(Documents.Count).Activate: Documents.Application.Run ""test"""
-> CommandBars("Barre").Controls(1).OnAction = "Application.Run """!Fichier.doc!Project.Traitement.Test""" (avec ou sans Project.)

Rien y marche

Au secours!!! J'en ais mare!
Afficher la suite 

22 réponses

rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 23 mars 2006 à 11:55
+3
Utile
Pfiou,
j'avais une misère, scuse.

Public WithEvents wdApplication As Word.Application
Public cbPerso As Office.CommandBar
Public WithEvents docHote As Word.Document


Sub testAction()
MsgBox "ok"
End Sub


Sub OuvrirDoc()
Set docHote = wdApplication.Documents.Open("Doc2.doc", , , , , , , , , , True)
ThisDocument.Activate
End Sub


Private Sub NettoyerBarresPersos()
Dim cbTemp As Office.CommandBar
For Each cbTemp In Application.CommandBars
If cbTemp.Name = "Nouvelle1" Then
cbTemp.Delete
End If
Next cbTemp
End Sub


Private Sub Document_Open()
Dim cbcTemp As Office.CommandBarControl
'référence application
Set wdApplication = Application
'nettoyage
NettoyerBarresPersos
'installe la barre perso
Set cbPerso = wdApplication.CommandBars.Add("Nouvelle1", msoBarFloating, , True)
cbPerso.Visible = True
'ajoute le bouton ouvrir 2ème doc
Set cbcTemp = cbPerso.Controls.Add(msoControlButton, , , , True)
cbcTemp.FaceId = 23
cbcTemp.OnAction = "OuvrirDoc"
cbcTemp.DescriptionText = "Ouvrir le 2ème document"
cbcTemp.Enabled = True
End Sub


Private Sub wdApplication_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)
Dim cbcTemp As Office.CommandBarControl
'supprime le bouton du 2ème doc
If cbPerso.Controls.Count > 1 Then
Set cbcTemp = cbPerso.Controls(2)
cbcTemp.Delete
End If
'dégrise le bouton du 1er doc
Set cbcTemp = cbPerso.Controls(1)
cbcTemp.Enabled = True
End Sub


Private Sub wdApplication_DocumentOpen(ByVal Doc As Document)
Dim cbcTemp As Office.CommandBarControl
If Doc.Name <> ThisDocument.Name Then
'grise le bouton du 1er doc
Set cbcTemp = cbPerso.Controls(1)
cbcTemp.Enabled = False
'ajoute le bouton du 2ème doc
Set cbcTemp = cbPerso.Controls.Add(msoControlButton, , , , True)
cbcTemp.FaceId = 2
cbcTemp.OnAction = "testAction"
cbcTemp.DescriptionText = "Tester le 2ème document"
End If


End Sub


Private Sub wdApplication_WindowActivate(ByVal Doc As Document, ByVal Wn As Window)
If Doc.Name = ThisDocument.Name Then
If cbPerso.Controls.Count > 1 Then
cbPerso.Controls(2).Enabled = True
End If
End If
End Sub


Private Sub wdApplication_WindowDeactivate(ByVal Doc As Document, ByVal Wn As Window)
If Doc.Name = ThisDocument.Name Then
cbPerso.Controls(1).Enabled = False
If cbPerso.Controls.Count > 1 Then
cbPerso.Controls(2).Enabled = False
End If
End If
End Sub

Evidemment, ce code correspond au fonctionnement que je te décrivait, c'est à dire que je n'exécute pas une macro qui se trouve dans le 2ème document, mais dans le 1er, par contre, quand le 2ème document est actif, il ne peut pas exécuter la macro.

à+,
bon appétit.


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
Cette réponse vous a-t-elle aidé ?  
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 10 mai 2006 à 17:43
+3
Utile
on ne s'est pas compris!

la procédure "Private Sub Document_Open()" est exécutée automatiquement, par Excel, au démarrage du classeur. Donc, tout ce code (confirmes STP) doit être placé dans la classe par défaut ThisDocument.
si tu confirmes, alors que veux tu dire par :
"Alors je le met dans un module de classe, je défini une variable avec "public test as " dans un module (variable global) fait un "set test = new classe1 "

à+

rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
Cette réponse vous a-t-elle aidé ?  
cs_jordinette 134 Messages postés mercredi 2 mars 2005Date d'inscription 5 avril 2007 Dernière intervention - 22 mars 2006 à 16:02
0
Utile
bonjour, si je comprends bien tu à 1 .doc sur lequel tu as le bouton1 qui déclenche ta macro, un .xls sur lequel tu récupère des données que tu colles sur ton .doc dans celui ci apparai un bouton2 dans la barre d'outil qui te permet de lancer une 2ème macro se trouvant dans un autre fichier Word qui n'est jamais ouvert au cour du déroulement du programme?
Si c'est bien ça:
1- je comprends pas l'intéret d'un bouton apparaissant dans la barre d'outil...
2- le message d'erreur, viens selon moi que dans tes paramètres de sécurités le niveau est haut donc il blque l'exécusion de toutes macros... (pour le changer, dans word Outils/macro/sécurité)

Après j'ai peut etre mal compris
Jordinette
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 22 mars 2006 à 16:48
0
Utile
Pardon je n'ai pas été tres claire dans cette partie :
"Problème elle est contenu (la macro) dans un fichier (Word) différant du fichier du bouton du coup lorsque je click sur mon bouton Word m'affiche un message d'erreur : "La marco est introuvable ou a été désactivée à cause de vos paramètres de sécurité des macros.". En fouillan l'aide j'ai découver que seul les marco du doc actif peuve être executer?????? Ca ça c'est pas cool !"

La seconde macro est dans le même fichier que la 1ér (donc le fichier est ouvert dé le début de l'execution, mais ce n'est pas le fichier ou se trouve le bouton) fichier sur le quel aucune modif ne se passe.

Toute les donnée sont mit sur un nouveau doc (crée avec "Documents.Add DocumentType:=wdNewBlankDocument")

Une solution serait de crée une macro (en code) qui m'active le documents ou se trouve les macros (les macro dont je parlais au début) et lance l'execution de la seconde macro. Probléme je n'ai pas le droit de modifier les fichier .dot ("normal.dot") ni d'en crée d'autre! Donc je devrais crée en code une macro dans un nouveau document.

Le fait que je souaite ce bouton sur le nouveau fichier est simplement dù à un probléme de présentation.

Faut pas s'enerver
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 22 mars 2006 à 16:54
0
Utile
En résumer mon code :

-> Ouvre un fichier .doc
-> Selectione tout, le copie
-> Crée un nouveau document à partir de normal.dot "Documents.Add DocumentType:=wdNewBlankDocument"
-> Cole les donées dans ce document
-> Ferme sans sauvgarde le fichier d'origine
-> Met en forme les données
-> Crée un bouton sur ce document

Sur click bouton :
-> Ouvre un fichier excel
-> Copie les donnée de tout les onglet et les cole dans encor un nouveau document Word "Documents.Add DocumentType:=wdNewBlankDocument"
-> Met en forme

Par la suite je place les fenaitre en mosaique vertical pour faire de copier coller manuel

Mon seul probléme est de faire executer le deusieme code à partir d'un bouton

Le fichier contenant les macro n'est jamais fermer!

Faut pas s'enerver
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 22 mars 2006 à 17:19
0
Utile
Ha oui j'oubliais les option de sécurité son bien configurer! (En moyen comme ne bas ça ne marche pas! )




Faut pas s'enerver
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 22 mars 2006 à 21:48
0
Utile
Salut Polack, salut jordinette,

Polack, qu'est-ce qui t'empêche de créer le nouveau bouton, dans la barre d'outil existante, puisqu'elle est dépendante du classeur des macros, qui reste toujours ouvert?
Ce bouton aurait ainsi accès à l'exécution d'une macro, qui se trouverait, dans le classeur des macros (oui, mais faudrait encore piloter un autre document, eh..., pas de mais, trouves une boone raison pour ne pas le faire, ou fais-le :) ).


Ensuite, pour faire "classe", tu apprens même à la barre d'outil à se rendre compte que le classeur final (données doc et données xl) vient de se fermer, et à griser (ou enlever) le bouton (dont on ne connait pas la fonction).

t'es sur la bonne voie,
à+


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 23 mars 2006 à 09:32
0
Utile
Hee, les macro sont sur Word (donc pas dans un classeur, je ne pense pas que cela change grand chose, mais on sait jamais)

Je vient de tenter de mettre mon bouton sur un barre d'outils existante (Standard) mais toujours le même message d'erreur! (Je vais quand même faire des testes dans ce sens)

Rvblog, tu dis que "la barre d'outil est dépendante du classeur des macros" ? C'est vrais dans tout les cas ou faut t'il le forcer (les barre d'outils ne sont pas sauvegarder dans "Normal.dot", a vrais dire je n'en sais rien peut être que je dit des inepties)?
Et peut tu me dire qu'elle code je doit mettre dans mon bouton (ou barre d'outils, je n'en sait rien ) pour qu'il réagisse à l'énervement (fermeture de "documents(NumDoc)")

Si non es ce que qu'un sait comment crée une macro dans un autre fichier (et ça en code) !

Si non je vais peut être négocié avec ma hiérarchie pour mètre des macro dans un model (".dot").

En tout cas je suis toujours bloquer (et ça c'est vraiment pas agréable), mais bon, une nouvelle journée commence (pour une fois à Paris on à du soleil , et ça c'est cool)


En tout les cas merci à tousse d'essayer de m’aidé (vraiment sympa)

Faut pas s'enerver
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 23 mars 2006 à 10:38
0
Utile
Salut Polack,

bien dormi?
bon, ça vaut mieux :)

au temps pour moi, c'est bien évidemment pas dans un classeur, mais bien dans un doc!
j'ai jeté un oeil, et pour l'instant, ça marche.
Questions :
ton 2ème document à le focus une fois ouvert, non?
version de Word?

si tu réponds, dans les 5 minutes, je t'envoie le code, sinon...
bonjour aux parisiennes!


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 23 mars 2006 à 10:40
0
Utile
Salut alor c'est la version office 2003


Oui le 2eme doc à le focus (et c'est là mon probléme)

Faut pas s'enerver
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 23 mars 2006 à 12:17
0
Utile
Je vais manger et je test ça dans l'après midi. Dans tout les cas merci d'avance.

Faut pas s'enerver
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 23 mars 2006 à 14:21
0
Utile
Ce n'est pas ce que j'avais en tête au début mais c'est vraiment pas mal du tout!
De toute façon je commance à penser qu'executer une macro qui n'appartient pas au doc actif ce n'est pas possible. Ton code est vraiment tres bien (en plus ca me donne des idées).
De plus si je crée une macro dans le model sur le quel je base mon nouveau document implique que mon fichier mis en page aura cette macro aussi (et ça y faut pas si non moi ). Je pense que je vais faire comme ça (activer désactiver les bouton).

En résumer merci, merci et merci.

Tu à fait du bien rvblogn (même si ce n'est pas vraiment ce que tu veut semble t'il )

Faut pas s'enerver
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 23 mars 2006 à 14:46
0
Utile
Ravi de t'avoir aidé,
à+


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 10 mai 2006 à 17:05
0
Utile
Heeeeeeeeeeee, je sais que tu à déja répondu à cette question rvblog mais si tu pouvais me re-filer un coup de main.
Je n'arrive plus à faire fonctionner ce code.
???????????????????????????
Alors je le met dans un module de classe, je défini une variable avec "public test as classe1" dans un module (variable global) fait un "set test = new classe1" et apprés ba je sais pas???? Quand je change de fichier rien????????? Ha comprend pas????? Il me semble pourtant que c'est ce que j'avias fait??????? HELPPPPPPPPPPPPPPP!!!! merci

D'oh! Nuts!
Mmmmm...
DONUTS
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 10 mai 2006 à 17:22
0
Utile
Salut Polack77,

pteu, ouh lala (avec l'accent Omerien)

que mets-tu exactement dans le module de classe (quelles fonctions, et quelles déclarations)?
tu auras sûrement noté que, par exemple, "Private Sub Document_Open()", tu ne peux pas le déplacer! du coup, le membre "Public WithEvents wdApplication As Word.Application", n'est pas déplacable tel quel.

à+


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 10 mai 2006 à 17:26
0
Utile
heeeeeeeeee, ba ja met tout!

D'oh! Nuts!
Mmmmm...
DONUTS
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 10 mai 2006 à 17:30
0
Utile
Voila mon module de classe si tu préfaire.
'----------------------
Public WithEvents wdApplication As Word.Application
Public cbPerso As Office.CommandBar
Public WithEvents docHote As Word.Document Sub testAction()
MsgBox "ok"
End Sub

Sub OuvrirDoc()
Set docHote = wdApplication.Documents.Open("Doc2.doc", , , , , , , , , , True)
ThisDocument.Activate
End Sub

Private Sub NettoyerBarresPersos()
Dim cbTemp As Office.CommandBar
For Each cbTemp In Application.CommandBars
If cbTemp.Name = "Nouvelle1" Then
cbTemp.Delete
End If
Next cbTemp
End Sub

Private Sub Document_Open()
Dim cbcTemp As Office.CommandBarControl
'référence application
Set wdApplication = Application
'nettoyage
NettoyerBarresPersos
'installe la barre perso
Set cbPerso = wdApplication.CommandBars.Add("Nouvelle1", msoBarFloating, , True)
cbPerso.Visible = True
'ajoute le bouton ouvrir 2ème doc
Set cbcTemp = cbPerso.Controls.Add(msoControlButton, , , , True)
cbcTemp.FaceId = 23
cbcTemp.OnAction = "OuvrirDoc"
cbcTemp.DescriptionText = "Ouvrir le 2ème document"
cbcTemp.Enabled = True
End Sub

Private Sub wdApplication_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)
Dim cbcTemp As Office.CommandBarControl
'supprime le bouton du 2ème doc
If cbPerso.Controls.Count > 1 Then
Set cbcTemp = cbPerso.Controls(2)
cbcTemp.Delete
End If
'dégrise le bouton du 1er doc
Set cbcTemp = cbPerso.Controls(1)
cbcTemp.Enabled = True
End Sub

Private Sub wdApplication_DocumentOpen(ByVal Doc As Document)
Dim cbcTemp As Office.CommandBarControl
If Doc.Name <> ThisDocument.Name Then
'grise le bouton du 1er doc
Set cbcTemp = cbPerso.Controls(1)
cbcTemp.Enabled = False
'ajoute le bouton du 2ème doc
Set cbcTemp = cbPerso.Controls.Add(msoControlButton, , , , True)
cbcTemp.FaceId = 2
cbcTemp.OnAction = "testAction"
cbcTemp.DescriptionText = "Tester le 2ème document"
End If

End Sub

Private Sub wdApplication_WindowActivate(ByVal Doc As Document, ByVal Wn As Window)
If Doc.Name = ThisDocument.Name Then
If cbPerso.Controls.Count > 1 Then
cbPerso.Controls(2).Enabled = True
End If
End If
End Sub

Private Sub wdApplication_WindowDeactivate(ByVal Doc As Document, ByVal Wn As Window)
If Doc.Name = ThisDocument.Name Then
cbPerso.Controls(1).Enabled = False
If cbPerso.Controls.Count > 1 Then
cbPerso.Controls(2).Enabled = False
End If
End If
End Sub
'-----------------------
Soi le code que tu à mit plus haut

D'oh! Nuts!
Mmmmm...
DONUTS
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 11 mai 2006 à 08:57
0
Utile
Ce que j'entant par :
"Alors je le met dans un module de classe, je défini une variable avec "public test as " dans un module (variable global) fait un "set test = new classe1 "
C'est que le code que tu m'a donnée est dans un module de classe (nom du module de classe : "Classe1")
Dans un module (nom du module : "DelarVarGlob") je déclar en variable global "public test sa Classe1"
Dans "Microsof word object", "ThisDocument", "Document_Open", je fait "set test = new Classe1"

Voila je crois que je ne peut pas être plus précis.
Bonne journée (désol de ne pas avoir répondu plus tôt)

D'oh! Nuts!
Mmmmm...
DONUTS
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 11 mai 2006 à 09:07
0
Utile
OK je n'avais pas compris qu'il falait tout métre dans "Microsof word object", "ThisDocument", "Document_Open", je vien de faire le test et ça marche! Donc plus de module de classe "Classe1" plus de déclaration d'objet "public test as Classe1" ni même de "set test = new Classe1".
Encor désol d'avoir oublier un "truc" si simple!
Merci

D'oh! Nuts!
Mmmmm...
DONUTS
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 11 mai 2006 à 09:10
0
Utile
Heee non (erreur de copier coller) il faut mettre ton code dans "Microsof word object", "ThisDocument" (et pas dans "Document_Open").

D'oh! Nuts!
Mmmmm...
DONUTS

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Lancement d'une marco appartenant à un autre fichier (Word VBA) - page 2