PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Insérer une macro sous Word
Insérer une macro sous Word
Débuté par guest, 18 nov. 2005 12:02 - 11 réponses
Posté le 18 novembre 2005 - 12:02
Bonjour,

J'ai un fichier .bas qui est en fait une exportation d'une macro Word 2003 et qui contient donc ce code.

Comment faire avec Windev 9 pour inclure et lancer cette macro dans un document donné? Ou bien lancer cette macro à partir d'un fichier externe

Merci!
Posté le 18 novembre 2005 - 15:30
Jerome a écrit :
Bonjour,

J'ai un fichier .bas qui est en fait une exportation d'une macro Word 2003 et qui contient donc ce code.

Comment faire avec Windev 9 pour inclure et lancer cette macro dans un document donné? Ou bien lancer cette macro à partir d'un fichier externe

Merci!

Bonjour,
La classe cVBAExterne est faite pour cela :
http://www.wdforge.org/modules/icontent/index.php…

[R&B] WDForge.org
Posté le 21 novembre 2005 - 16:04
Cette classe fonctionne-t-elle aussi avec Word? Car je vois qu'elle hérite de CExcel et dans les doc on ne parle que d'Excel.
Posté le 21 novembre 2005 - 16:32
J'oubliais dans mon précédent message. J'ai vu sinon comment faire en replaçant les "." par des ">>", mais j'ai deux conditions dans a macro, et je ne sais pas comment les faire passer.

Voici la macro en question, qui n'est pas bien compliquée:

Attribute VB_Name = "Module1"
Sub AfficheCadre()
If ActiveDocument.Tables(1).Columns(1).Cells(1).Range.Text = Chr(13) & Chr(7) Then
ActiveDocument.Tables(1).Columns(1).Cells(1).Select
Selection.Borders(wdBorderLeft).LineStyle = wdLineStyleNone
Selection.Borders(wdBorderBottom).LineStyle = wdLineStyleNone
End If
If ActiveDocument.Tables(1).Columns(2).Cells(1).Range.Text = Chr(13) & Chr(7) Then
ActiveDocument.Tables(1).Columns(2).Cells(1).Select
Selection.Borders(wdBorderBottom).LineStyle = wdLineStyleNone
Selection.Borders(wdBorderRight).LineStyle = wdLineStyleNone
End If
ActiveDocument.SaveAs
End Sub
Posté le 22 novembre 2005 - 10:11
Jerome a écrit :
Cette classe fonctionne-t-elle aussi avec Word? Car je vois qu'elle hérite de CExcel et dans les doc on ne parle que d'Excel.

Cette classe pourrait aussi fonctionner, avec des adaptations, avec un
héritage d'un cWord... à produire.

++ R&B
Posté le 22 novembre 2005 - 11:39
Jerome a écrit :
Bonjour,

J'ai un fichier .bas qui est en fait une exportation d'une macro Word 2003 et qui contient donc ce code.

Comment faire avec Windev 9 pour inclure et lancer cette macro dans un document donné? Ou bien lancer cette macro à partir d'un fichier externe

Merci!

Bonjour

J'importe le script Vba puis je l'exécute :

l_vbComposant est objet Automation dynamique
NomProjet est une chaîne = "Document1.doc"

// importation du script dans le document actif en cours
l_vbComposant = :cWord>>VBE>>VBProjects(NomProjet)>>vbComponents>>Import(NomScript.bas)

l_vbComposant>>Name = "NomComposant"

// vbext_vm_Run 0 Project is in Run mode
// vbext_vm_Break 1 Project is in Break mode
// vbext_vm_Design 2 Project is in Creation mode.

SI :cWord>>VBE>>ActiveVBProject>>Mode = 2 ALORS
// execution de la procedure Vb : SubMachin
:cWord>>Run(NomProjet + ".NomComposant.SubMachin")
// suppression du composant
:cWord>>VBE>>VBProjects(NomProjet)>>VBComponents>>Remove(l_vbComposant)
FIN


Thierry
Posté le 24 novembre 2005 - 10:18
Voilà qui purrait m'être très utile.

Par contre (oui, je suis débutant...), àa quoi correspond le ":cWord"?
J'ai importer la classe "cWord" présente dans un exemple de Windev, mais j'ai toujours cette erreur:

"Les opérateurs : et :: permettent d'accéder aux éléments des classes et ne peuvent être utilisés que dans les méthodes de classes."

Merci!
Posté le 24 novembre 2005 - 15:06
J'ai déjà testé en enlevant les deux points en fait (oublié de le préciser...), dans ce cas-là il est bien reconnu (mis en bleu), mais j'ai ceci comme message d'erreur:

"Opérateur '>>' interdit" ...

J'en profite pour te remercier de cette aide que tu m'apportes.
Posté le 24 novembre 2005 - 15:13
J'ai créé un "cWord est un objet Automation dynamique" dans les variable globales de la fenêtre, je n'ai plus d'erreur, mais je me retrouve avec ceci quand je lance le projet, ou tout du moins quand je clique sur le bouton qui lance le code en question:

"L'objet sur lequel on accède au membre VBE n'est pas un objet Automation"

Il s'agit de cette ligne:

l_vbComposant = cWord>>VBE>>VBProjects(NomProjet)>>vbComponents>>Import("Cadre.bas")
Posté le 24 novembre 2005 - 15:26
Bonjour

Le code vient d'une classe ou
cWord est un objet Automation dynamique

Enleve les deux points si ton objet n'est pas un attibut de classe

Thierry

Jerome a écrit :
Voilà qui purrait m'être très utile.

Par contre (oui, je suis débutant...), àa quoi correspond le ":cWord"?
J'ai importer la classe "cWord" présente dans un exemple de Windev, mais j'ai toujours cette erreur:

"Les opérateurs : et :: permettent d'accéder aux éléments des classes et ne peuvent être utilisés que dans les méthodes de classes."

Merci!
Posté le 25 novembre 2005 - 10:51
Voici ce que j'ai pour le moment:

*******************************************
DECLARATIONS GLOBALES DE LA FENETRE:

l_vbComposant est un objet Automation dynamique
cWord est un objet Automation dynamique
NomProjet est une chaîne = "C:\Mes Projets\Macro Word\Exe\test.doc"
*******************************************


*******************************************
CLIC SUR LE BOUTON
cWord = ObjetActif("Word.Application")

SI cWord = Null ALORS
cWord = allouer un objet Automation "Word.Application"
SI cWord = Null ALORS
Erreur("Impossible de lancer Word")
RETOUR
FIN
FIN

SI cWord <> Null ALORS
cWord>>Application>>Visible = True
// importation du script dans le document actif en cours
l_vbComposant = cWord>>VBE>>VBProjects(NomProjet)>>vbComponents>>Import("Cadre.bas")

l_vbComposant>>Name = "NomComposant"

SI cWord>>VBE>>ActiveVBProject>>Mode = 2 ALORS
// execution de la procedure Vb : SubMachin
cWord>>Run(NomProjet + ".NomComposant.SubMachin")
// suppression du composant
cWord>>VBE>>VBProjects(NomProjet)>>VBComponents>>Remove(l_vbComposant)
FIN
libérer cWord
FIN
*******************************************


L'erreur qui m'est renvoyée est la suivante:

"En tentant d'invoquer la méthode <VBE> ou de lire la propriété <VBE>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
'Erreur 800A17B4 : L'accès programmatique à Visual Basic Project n'est pas approuvé.'
En tentant de lire la propriété <VBE>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
'Erreur 800A17B4 : L'accès programmatique à Visual Basic Project n'est pas approuvé.'

En tentant d'invoquer la méthode <VBE>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
'Erreur 800A16E7 : 'VBE' n'est pas une méthode."

Dans Word, je suis allé dans la gestion de la sécurité des macro (Outils, Macro, Sécurité). J'ai mis le niveau à "Faible" et sur le second onglet, j'ai coché les deux case en bas faisant confiance à tous les modèles et compléments installés, ainsi qu'au projet Visual basic...
J'ai désactivé mon anti-virus et j'ai eu droit à l'erreur "Le membre n'existe pas", mais je suis depuis retourné à l'erreur précédente.
Posté le 25 novembre 2005 - 10:55
Jerome a écrit :
> J'ai créé un "cWord est un objet Automation dynamique" dans les variable globales de la fenêtre, je n'ai plus d'erreur, mais je me retrouve

avec ceci quand je lance le projet, ou tout du moins quand je clique sur le bouton qui lance le code en question:

"L'objet sur lequel on accède au membre VBE n'est pas un objet Automation"

Il s'agit de cette ligne:

l_vbComposant = cWord>>VBE>>VBProjects(NomProjet)>>vbComponents>>Import("Cadre.bas")


La declaration n'est pas suffisante, il faut que tu precises
a ton objet quelle est l'application qu'il pilote

// on regarde si Word est deja actif
cWord = ObjetActif("Word.Application")

// Word n'est pas actif
SI cWord = Null ALORS
// lancement de Word
cWord = allouer un objet Automation "Word.Application"
// lancement impossible
SI cWord = Null ALORS
Erreur("Impossible de lancer Word")
RENVOYER Faux
FIN
FIN

RENVOYER Vrai