Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Désactiver une macro après son exécution

9 réponses
Avatar
ymer.hyseni
Bonjour,

j'ai une macro dans un fichier Word, la voici :

Private Sub Document_Open()
UpdateChamps
UnlinkChamps
End Sub
Private Sub UnlinkChamps()
Dim afield As Field
For Each afield In ActiveDocument.Fields
afield.Unlink
Next afield
End Sub
Private Sub UpdateChamps()
Application.ScreenUpdating =3D False
Dim sec As Section
ActiveDocument.Fields.Update
End Sub

Elle fonctionne tr=E8s bien cette macro.

Je veux juste apr=E8s que cette macro soit execut=E9e, un script qui
puisse aller soit mettre tout le code en commentaire ou bien supprime
toutes les lignes de la macro... est-il possible, et comment faire si
c'est possible.

merci de votre aide et =E0 bient=F4t.

9 réponses

Avatar
Geo

[...]
Je veux juste après que cette macro soit executée, un script qui
puisse aller soit mettre tout le code en commentaire ou bien supprime
toutes les lignes de la macro... est-il possible, et comment faire si
c'est possible.


Oui c'est possible mais casse-gu... heu : casse-cou, il vaut mieux donc
essayer de trouver une autre solution.
La macro dont vous parlez est le Document_Open ?
Elle ne s'exécute qu'un fois à chaque ouverture du document.
Pouvez-vous préciser le problème rencontré ?

Sinon pour accéder aux lignes d'une macro, il faut utiliser
la collection VBComponents.

--
A+

Avatar
ymer.hyseni
On 22 nov, 11:20, Geo wrote:

[...]

Je veux juste après que cette macro soit executée, un script qui
puisse aller soit mettre tout le code en commentaire ou bien supprime
toutes les lignes de la macro... est-il possible, et comment faire si
c'est possible.


Oui c'est possible mais casse-gu... heu : casse-cou, il vaut mieux donc
essayer de trouver une autre solution.
La macro dont vous parlez est le Document_Open ?
Elle ne s'exécute qu'un fois à chaque ouverture du document.
Pouvez-vous préciser le problème rencontré ?

Sinon pour accéder aux lignes d'une macro, il faut utiliser
la collection VBComponents.

--
A+


Bonjour,

je comprends bien votre remarque, mais j'ai absolument besoin
d'utiliser une fonction qui supprime la macro après qu'elle soit
exécutée... je sais qu'elle s'exécute en autoopen.

le but est d'éviter lorsque le document est imprimé en PDF, la macro
ne soit pas déclanchée par la fonction du PDF.

merci à vous et à bientôt.


Avatar
Geo

le but est d'éviter lorsque le document est imprimé en PDF, la macro
ne soit pas déclanchée par la fonction du PDF.


Lors de l'impression en PDF la macro n'est pas recopiée dans le PDF,
elle est strictement interne à Word.
Une fois en PDF votre fichier n'évoluera plus, si c'est bien ça votre
souci.

--
A+

Avatar
ymer.hyseni
On 22 nov, 12:52, Geo wrote:

le but est d'éviter lorsque le document est imprimé en PDF, la macro
ne soit pas déclanchée par la fonction du PDF.


Lors de l'impression en PDF la macro n'est pas recopiée dans le PDF,
elle est strictement interne à Word.
Une fois en PDF votre fichier n'évoluera plus, si c'est bien ça votre
souci.

--
A+


mais non,

je sais bien que la macro reste dans word, aucun problème, mais par
contre pourque le fichier soit en pdf, l'outil doit bien l'ouvrir afin
de l'imprimer, et donc dès l'ouverture la macro s'enclenche
également... et c'est ce qui fait l'erreur...

est-ce que vous comprenez ce que je veux?


Avatar
Geo

je sais bien que la macro reste dans word, aucun problème, mais par
contre pourque le fichier soit en pdf, l'outil doit bien l'ouvrir afin
de l'imprimer, et donc dès l'ouverture la macro s'enclenche
également... et c'est ce qui fait l'erreur...

est-ce que vous comprenez ce que je veux?


Ok j'ai compris.
Mais comme il y a tous les niveaux dans les intervenants, on ne peut
pas le savoir avant.

Mais comme je suis têtu et que les solutions simples sont toujours
préférables : L'outil pourrait ouvrir le document sans activer les
macros, ça dépend comment il est fait.

Sinon, pour supprimer le texte de la macro, il faut, comme je vous l'ai
indiqué, utiliser la collection vbComponents, voici un exemple :
Sub EffaceMacro()
' référencer Microsoft Visual Basic for application Extensibility 5.3
Dim MonModule As VBComponent
Dim nbLignes As Integer
Set MonModule = ActiveDocument.VBProject.VBComponents(1)
With MonModule.CodeModule
nbLignes = .CountOfLines
.DeleteLines StartLine:=1, Count:=nbLignes
End With
End Sub

Selon le contexte ce n'est peut-être pas le module n°1 qu'il faut
supprimer, il vaudrait mieux faire une boucle sur tous les modules et
tester sur le nom pour s'assurer qu'on est sur le bon.



--
A+

Avatar
Anacoluthe
Bonjour !

'' nous a écrit ...
je sais bien que la macro reste dans word, aucun problème, mais par
contre pourque le fichier soit en pdf, l'outil doit bien l'ouvrir afin
de l'imprimer, et donc dès l'ouverture la macro s'enclenche
également... et c'est ce qui fait l'erreur...


Vous avez plusieurs solutions :
1) Supprimer l'erreur. Il n'y a pas de raison que la réouverture
d'un document contenant une macro automatique d'ouverture émette
une erreur à son exécution. Revoyez votre code.
Votre macro déchampe le document : donc il n'y a plus de champs.

2) Mettre cette macro automatique ailleurs. Le mieux est dans le
modèle attaché au document, ou dans un modèle global (éventuellement
Normal.dot). Le document n'aura aucune macro. Cette technique est
largement utilisée pour des documents qui doivent être utilisés
ensuite par des tiers.

Votre solution consistant à autodétruire la macro dans chaque
document est certes possible - voir la réponse de Geo -
mais la plus tarabiscotée...

Anacoluthe
« Le plus compliqué c’est de faire simple. »
- Léonard de VINCI

Avatar
ymer.hyseni
On 22 nov, 14:11, Anacoluthe wrote:
Bonjour !

'' nous a écrit ...

je sais bien que la macro reste dans word, aucun problème, mais par
contre pourque le fichier soit en pdf, l'outil doit bien l'ouvrir afin
de l'imprimer, et donc dès l'ouverture la macro s'enclenche
également... et c'est ce qui fait l'erreur...


Vous avez plusieurs solutions :
1) Supprimer l'erreur. Il n'y a pas de raison que la réouverture
d'un document contenant une macro automatique d'ouverture émette
une erreur à son exécution. Revoyez votre code.
Votre macro déchampe le document : donc il n'y a plus de champs.

2) Mettre cette macro automatique ailleurs. Le mieux est dans le
modèle attaché au document, ou dans un modèle global (éventuelleme nt
Normal.dot). Le document n'aura aucune macro. Cette technique est
largement utilisée pour des documents qui doivent être utilisés
ensuite par des tiers.

Votre solution consistant à autodétruire la macro dans chaque
document est certes possible - voir la réponse de Geo -
mais la plus tarabiscotée...

Anacoluthe
<< Le plus compliqué c'est de faire simple. >>
- Léonard de VINCI


bonjour, j'ai coché donc dans la référence Microsoft Visual Basic for
application Extensibility 5.3, mais ca ne fonctionne toujours pas, il
me dit :

erreur de compilation, projet ou bibliothèque introuvable...

je vois pas quoi faire là...

merci de votre aide.


Avatar
Geo
Re

bonjour, j'ai coché donc dans la référence Microsoft Visual Basic for
application Extensibility 5.3, mais ca ne fonctionne toujours pas, il
me dit :

erreur de compilation, projet ou bibliothèque introuvable...

je vois pas quoi faire là...


Sur quelle ligne ?

Il vaut mieux mettre cette macro dans un autre module que les autres,
sinon c'est de l'auto-destruction, ça marche mais avec le risque
maximal.

--
A+

Avatar
ymer.hyseni
On 22 nov, 16:57, Geo wrote:
Re

bonjour, j'ai coché donc dans la référence Microsoft Visual Basic for
application Extensibility 5.3, mais ca ne fonctionne toujours pas, il
me dit :

erreur de compilation, projet ou bibliothèque introuvable...

je vois pas quoi faire là...


Sur quelle ligne ?

Il vaut mieux mettre cette macro dans un autre module que les autres,
sinon c'est de l'auto-destruction, ça marche mais avec le risque
maximal.

--
A+


salut,

voici la réponse, j'ai trouvé ceci, ca marche super bien :

Private Sub Document_Open()

Application.ScreenUpdating = False
Dim sec As Section
ActiveDocument.Fields.Update

Dim afield As Field
For Each afield In ActiveDocument.Fields
afield.Unlink
Next afield

Dim awi
Dim awcl As Integer
On Error Resume Next
Set awi = ActiveDocument.VBProject.VBComponents.Item(1)
awcl = awi.CodeModule.CountOfLines
awi.CodeModule.DeleteLines 1, awcl
Set awi = Nothing ' Release the object

End Sub

ciao