OVH Cloud OVH Cloud

exécution en auto d'une macro dès l'ouverture du fichier

10 réponses
Avatar
Yoyo
Bonjour,

On m'a conseill=E9 de poser ma question plut=F4t sur ce site :
Je d=E9sire ex=E9cuter une macro =E0 l'ouverture de chaque=20
fichier excel (=E0 la rigueur, =E0 l'ouverture d'excel). J'ai=20
tent=E9 de mettre cette macro (en l'enregistrant comme macro=20
compl=E9mentaire) dans le r=E9pertoire "C:\Program=20
Files\Microsoft Office\Office\XLOuvrir" (pour ex=E9cuter la=20
macro =E0 l'ouverture d'excel), mais =E7a ne fonctionne pas=20
dans mon cas : excel ex=E9cute apparemment les macros, avant=20
d'ouvrir les fichiers ; or, cette macro est cens=E9e=20
modifier les fichiers que l'on ouvre --> =E7a ne fait rien=20
du tout.

Est-ce r=E9alisable ?

Merci pour les futures r=E9ponses.

10 réponses

Avatar
RaMa
Bonsoir
Ta solution est plutot avec evenement open dans thisworkbook
Private sub workbook_Open
RaMa

"Yoyo" a écrit dans le message de news:
53eb01c3e4fb$838c9aa0$
Bonjour,

On m'a conseillé de poser ma question plutôt sur ce site :
Je désire exécuter une macro à l'ouverture de chaque
fichier excel (à la rigueur, à l'ouverture d'excel). J'ai
tenté de mettre cette macro (en l'enregistrant comme macro
complémentaire) dans le répertoire "C:Program
FilesMicrosoft OfficeOfficeXLOuvrir" (pour exécuter la
macro à l'ouverture d'excel), mais ça ne fonctionne pas
dans mon cas : excel exécute apparemment les macros, avant
d'ouvrir les fichiers ; or, cette macro est censée
modifier les fichiers que l'on ouvre --> ça ne fait rien
du tout.

Est-ce réalisable ?

Merci pour les futures réponses.
Avatar
Frédéric Sigonneau
Bonsoir,

Pour exécuter une macro à l'ouverture de n'importe quel classeur (à condition
qu'il ait été enregistré au moins une fois), il faut passer par la création d'un
'Excel perso' dans un module de classe, qui va intercepter les événements
standard d'Excel de ton choix (ici le Workbook_Open) pour exécuter le code de
ton choix.

Exemple de mise en place simple.
Dans ton perso.xls (classeur de macros personnelles) insère un module de classe
et renomme-le ExcelApplication. Puis recopie dans ce module le code ci-dessous :

'====================== Public WithEvents AppXl As Application

Private Sub AppXl_WorkbookOpen(ByVal Wb As Workbook)
If Not Wb.Name = ThisWorkbook.Name Then
MsgBox "coucou"
End If
End Sub
'======================
Ensuite, dans le module ThisWorkbook du perso.xls, recopie ce code qui va créer
une instance d'Excel et l'affecter à l'application Excel au moment de son
ouverture (le perso.xls est exécuté au lancement d'Excel) si les macros sont
activées :

'====================== Dim MonXL As New ExcelApplication

Private Sub Workbook_Open()
Set MonXL.AppXl = Application
End Sub
'======================
Voilà. Enregistre, ferme puis relance Excel. Ensuite, l'ouverture de chaque
classeur va provoquer l'affichage du message "coucou" (ou l'exécution du code
que tu mettras à sa place).

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Bonjour,

On m'a conseillé de poser ma question plutôt sur ce site :
Je désire exécuter une macro à l'ouverture de chaque
fichier excel (à la rigueur, à l'ouverture d'excel). J'ai
tenté de mettre cette macro (en l'enregistrant comme macro
complémentaire) dans le répertoire "C:Program
FilesMicrosoft OfficeOfficeXLOuvrir" (pour exécuter la
macro à l'ouverture d'excel), mais ça ne fonctionne pas
dans mon cas : excel exécute apparemment les macros, avant
d'ouvrir les fichiers ; or, cette macro est censée
modifier les fichiers que l'on ouvre --> ça ne fait rien
du tout.

Est-ce réalisable ?

Merci pour les futures réponses.


Avatar
Yoyo
Respect. ça marche du tonnerre...

Peux-tu stp me donner quelques explications, afin que je
comprenne son fonctionnement ?

Merci,

Yoyo

-----Message d'origine-----
Bonsoir,

Pour exécuter une macro à l'ouverture de n'importe quel
classeur (à condition

qu'il ait été enregistré au moins une fois), il faut
passer par la création d'un

'Excel perso' dans un module de classe, qui va
intercepter les événements

standard d'Excel de ton choix (ici le Workbook_Open) pour
exécuter le code de

ton choix.

Exemple de mise en place simple.
Dans ton perso.xls (classeur de macros personnelles)
insère un module de classe

et renomme-le ExcelApplication. Puis recopie dans ce
module le code ci-dessous :


'=======================
Public WithEvents AppXl As Application

Private Sub AppXl_WorkbookOpen(ByVal Wb As Workbook)
If Not Wb.Name = ThisWorkbook.Name Then
MsgBox "coucou"
End If
End Sub
'=======================

Ensuite, dans le module ThisWorkbook du perso.xls,
recopie ce code qui va créer

une instance d'Excel et l'affecter à l'application Excel
au moment de son

ouverture (le perso.xls est exécuté au lancement d'Excel)
si les macros sont

activées :

'=======================
Dim MonXL As New ExcelApplication

Private Sub Workbook_Open()
Set MonXL.AppXl = Application
End Sub
'=======================

Voilà. Enregistre, ferme puis relance Excel. Ensuite,
l'ouverture de chaque

classeur va provoquer l'affichage du message "coucou" (ou
l'exécution du code

que tu mettras à sa place).

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Bonjour,

On m'a conseillé de poser ma question plutôt sur ce
site :


Je désire exécuter une macro à l'ouverture de chaque
fichier excel (à la rigueur, à l'ouverture d'excel).
J'ai


tenté de mettre cette macro (en l'enregistrant comme
macro


complémentaire) dans le répertoire "C:Program
FilesMicrosoft OfficeOfficeXLOuvrir" (pour exécuter
la


macro à l'ouverture d'excel), mais ça ne fonctionne pas
dans mon cas : excel exécute apparemment les macros,
avant


d'ouvrir les fichiers ; or, cette macro est censée
modifier les fichiers que l'on ouvre --> ça ne fait rien
du tout.

Est-ce réalisable ?

Merci pour les futures réponses.


.




Avatar
Yoyo
Juste un dernier point : je souhaite en plus ne pas avoir
les alertes d'excel (voulez-vous activer les macros +
voulez-vous mettre à jour les liens avec d'autres
fichiers). J'ai voulu employer la
propriété "DisplayAlerts", en l'utilisant dès l'ouverture
d'Excel (en enregistrant comme macro complémentaire dans
XLouvrir) :
Private Sub Workbook_Open()
Application.DisplayAlerts = False
End Sub

Le problème est que cela ne marche pas. D'où vient le
problème ? (sachant que cette macro, si j'ai bien compris,
est exécutée avant l'ouverture du fichier -- on s'en
aperçoit en ajoutant par exemple MsgBox "coucou" à cette
macro)
Avatar
Frédéric Sigonneau
Bonsoir,

Pour éviter le message d'alerte sur la sécurité des macros, une technique
possible est de signer tes macros en créant un certificat avec l'utilitaire
selfcert.exe (il est normalement quelque part sur ton disque dur depuis Excel
2000 je crois). Une recherche dans les archives de ce groupe sur Google te
donnera des détails sur son utilisation, si besoin.
Pour ta deuxième alerte, je pense qu'en décochant l'option 'Confirmation de la
mise à jour des liens' dans l'onglet Modification de la boite de dialogue des
Options (OutilsOptions), les liaisons sont mises à jour à l'ouverture du
classeur sans message de demande de confirmation.

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Juste un dernier point : je souhaite en plus ne pas avoir
les alertes d'excel (voulez-vous activer les macros +
voulez-vous mettre à jour les liens avec d'autres
fichiers). J'ai voulu employer la
propriété "DisplayAlerts", en l'utilisant dès l'ouverture
d'Excel (en enregistrant comme macro complémentaire dans
XLouvrir) :
Private Sub Workbook_Open()
Application.DisplayAlerts = False
End Sub

Le problème est que cela ne marche pas. D'où vient le
problème ? (sachant que cette macro, si j'ai bien compris,
est exécutée avant l'ouverture du fichier -- on s'en
aperçoit en ajoutant par exemple MsgBox "coucou" à cette
macro)


Avatar
Frédéric Sigonneau
Bonsoir (bis),

Dans ce cas, un module de classe te permet de créer un objet Application (ie
Excel) dont tu personnalises des "clones" des événements standard (ici
WorkbookOpen, clone de Workbook_Open). Je ne sais pas si "clone" est le terme
consacré, je veux dire que les événements de ton application Excel sont des
copies conformes de ceux d'Excel, mais ils ne les remplacent pas, ils
s'exécutent en plus de ceux d'Excel. Si tu as par exemple un classeur qui a du
code dans son Workbook_Open, ce code va s'exécuter à l'ouverture du classeur,
puis le code de ton WorkbookOpen.
Cette technique a des applications intéressantes, là aussi, fais une recherche
avec Google dans les archives du forum pour en récupérer des exemples.

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Respect. ça marche du tonnerre...

Peux-tu stp me donner quelques explications, afin que je
comprenne son fonctionnement ?

Merci,

Yoyo

-----Message d'origine-----
Bonsoir,

Pour exécuter une macro à l'ouverture de n'importe quel
classeur (à condition

qu'il ait été enregistré au moins une fois), il faut
passer par la création d'un

'Excel perso' dans un module de classe, qui va
intercepter les événements

standard d'Excel de ton choix (ici le Workbook_Open) pour
exécuter le code de

ton choix.

Exemple de mise en place simple.
Dans ton perso.xls (classeur de macros personnelles)
insère un module de classe

et renomme-le ExcelApplication. Puis recopie dans ce
module le code ci-dessous :


'====================== > >Public WithEvents AppXl As Application

Private Sub AppXl_WorkbookOpen(ByVal Wb As Workbook)
If Not Wb.Name = ThisWorkbook.Name Then
MsgBox "coucou"
End If
End Sub
'====================== > >
Ensuite, dans le module ThisWorkbook du perso.xls,
recopie ce code qui va créer

une instance d'Excel et l'affecter à l'application Excel
au moment de son

ouverture (le perso.xls est exécuté au lancement d'Excel)
si les macros sont

activées :

'====================== > >Dim MonXL As New ExcelApplication

Private Sub Workbook_Open()
Set MonXL.AppXl = Application
End Sub
'====================== > >
Voilà. Enregistre, ferme puis relance Excel. Ensuite,
l'ouverture de chaque

classeur va provoquer l'affichage du message "coucou" (ou
l'exécution du code

que tu mettras à sa place).

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Bonjour,

On m'a conseillé de poser ma question plutôt sur ce
site :


Je désire exécuter une macro à l'ouverture de chaque
fichier excel (à la rigueur, à l'ouverture d'excel).
J'ai


tenté de mettre cette macro (en l'enregistrant comme
macro


complémentaire) dans le répertoire "C:Program
FilesMicrosoft OfficeOfficeXLOuvrir" (pour exécuter
la


macro à l'ouverture d'excel), mais ça ne fonctionne pas
dans mon cas : excel exécute apparemment les macros,
avant


d'ouvrir les fichiers ; or, cette macro est censée
modifier les fichiers que l'on ouvre --> ça ne fait rien
du tout.

Est-ce réalisable ?

Merci pour les futures réponses.


.






Avatar
Yoyo
Frédéric,

Une précision : ce que je cherche, c'est d'éviter de
mettre à jour les liens + éviter d'activer les macros
éventuelles en ouvrant un fichier, le tout
automatiquement : c'est pour cela que j'espérait y arriver
grâce à la propriété "DisplayAlerts". Certes, je viens de
me rendre compte que ceci ne résolvait pas mon problème :
au mieux, les messages auraient été désactivées, mais je
suppose que dans ce cas, Excel aurait par défaut (c'est ce
que je ne veux pas) mis à jour les liens avec d'autres
fichiers, ainsi que lancer les macros éventuelles...


Si tu connais une solution pour cette problématique...

Yoyo
Avatar
Désolé, mais c'est encore moi : je ne vois pas du tout à
quoi sert ton code "If Not Wb.Name = ThisWorkbook.Name Then
" dans le module de classe que tu me conseillais de créer.

Yoyo (toujours subjugué par le fonctionnement de cette
macro)


-----Message d'origine-----
Bonsoir (bis),

Dans ce cas, un module de classe te permet de créer un
objet Application (ie

Excel) dont tu personnalises des "clones" des événements
standard (ici

WorkbookOpen, clone de Workbook_Open). Je ne sais pas
si "clone" est le terme

consacré, je veux dire que les événements de ton
application Excel sont des

copies conformes de ceux d'Excel, mais ils ne les
remplacent pas, ils

s'exécutent en plus de ceux d'Excel. Si tu as par exemple
un classeur qui a du

code dans son Workbook_Open, ce code va s'exécuter à
l'ouverture du classeur,

puis le code de ton WorkbookOpen.
Cette technique a des applications intéressantes, là
aussi, fais une recherche

avec Google dans les archives du forum pour en récupérer
des exemples.


FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Respect. ça marche du tonnerre...

Peux-tu stp me donner quelques explications, afin que je
comprenne son fonctionnement ?

Merci,

Yoyo

-----Message d'origine-----
Bonsoir,

Pour exécuter une macro à l'ouverture de n'importe quel
classeur (à condition

qu'il ait été enregistré au moins une fois), il faut
passer par la création d'un

'Excel perso' dans un module de classe, qui va
intercepter les événements

standard d'Excel de ton choix (ici le Workbook_Open)
pour



exécuter le code de
ton choix.

Exemple de mise en place simple.
Dans ton perso.xls (classeur de macros personnelles)
insère un module de classe

et renomme-le ExcelApplication. Puis recopie dans ce
module le code ci-dessous :


'=======================
Public WithEvents AppXl As Application

Private Sub AppXl_WorkbookOpen(ByVal Wb As Workbook)
If Not Wb.Name = ThisWorkbook.Name Then
MsgBox "coucou"
End If
End Sub
'=======================

Ensuite, dans le module ThisWorkbook du perso.xls,
recopie ce code qui va créer

une instance d'Excel et l'affecter à l'application
Excel



au moment de son
ouverture (le perso.xls est exécuté au lancement
d'Excel)



si les macros sont
activées :

'=======================
Dim MonXL As New ExcelApplication

Private Sub Workbook_Open()
Set MonXL.AppXl = Application
End Sub
'=======================

Voilà. Enregistre, ferme puis relance Excel. Ensuite,
l'ouverture de chaque

classeur va provoquer l'affichage du message "coucou"
(ou



l'exécution du code
que tu mettras à sa place).

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma
bal !





Bonjour,

On m'a conseillé de poser ma question plutôt sur ce
site :


Je désire exécuter une macro à l'ouverture de chaque
fichier excel (à la rigueur, à l'ouverture d'excel).
J'ai


tenté de mettre cette macro (en l'enregistrant comme
macro


complémentaire) dans le répertoire "C:Program
FilesMicrosoft OfficeOfficeXLOuvrir" (pour
exécuter




la
macro à l'ouverture d'excel), mais ça ne fonctionne
pas




dans mon cas : excel exécute apparemment les macros,
avant


d'ouvrir les fichiers ; or, cette macro est censée
modifier les fichiers que l'on ouvre --> ça ne fait
rien




du tout.

Est-ce réalisable ?

Merci pour les futures réponses.


.





.






Avatar
Yoyo
Pfff...

J'essaie d'appliquer ta belle astuce pour exécuter une
macro juste avant l'enregistrement de tous les fichiers
excel, en mettant dans ThisWorkbook de mon
fichier "perso.xls" la procédure suivante :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean,
Cancel As Boolean)
Au lieu de :
Private Sub Workbook_Open()

Les autres points étant identiques (cf. ton message
d'avant).

Cela ne fonctionne que si je clique sur "quitter excel",
sans sauvegarder auparavent, et non lorsque je quitte
simplement le fichier modifié, ou lorsque je sauvegarde ce
fichier modifié. La macro ne doit pas être appelée au bon
endroit, mais je ne vois pas dans ce cas où la mettre...

La procédure à suivre serait-elle si différente ???

Yoyo (qui se bloque tout seul avec ses questions)
Avatar
Frédéric Sigonneau
Bonjour,

Cette ligne sert à éviter que le code de l'événement 'personnalisé' ne
s'applique au classeur où il est écrit (cad, par exemple, le perso.xls).

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Désolé, mais c'est encore moi : je ne vois pas du tout à
quoi sert ton code "If Not Wb.Name = ThisWorkbook.Name Then
" dans le module de classe que tu me conseillais de créer.

Yoyo (toujours subjugué par le fonctionnement de cette
macro)

-----Message d'origine-----
Bonsoir (bis),

Dans ce cas, un module de classe te permet de créer un
objet Application (ie

Excel) dont tu personnalises des "clones" des événements
standard (ici

WorkbookOpen, clone de Workbook_Open). Je ne sais pas
si "clone" est le terme

consacré, je veux dire que les événements de ton
application Excel sont des

copies conformes de ceux d'Excel, mais ils ne les
remplacent pas, ils

s'exécutent en plus de ceux d'Excel. Si tu as par exemple
un classeur qui a du

code dans son Workbook_Open, ce code va s'exécuter à
l'ouverture du classeur,

puis le code de ton WorkbookOpen.
Cette technique a des applications intéressantes, là
aussi, fais une recherche

avec Google dans les archives du forum pour en récupérer
des exemples.


FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Respect. ça marche du tonnerre...

Peux-tu stp me donner quelques explications, afin que je
comprenne son fonctionnement ?

Merci,

Yoyo

-----Message d'origine-----
Bonsoir,

Pour exécuter une macro à l'ouverture de n'importe quel
classeur (à condition

qu'il ait été enregistré au moins une fois), il faut
passer par la création d'un

'Excel perso' dans un module de classe, qui va
intercepter les événements

standard d'Excel de ton choix (ici le Workbook_Open)
pour



exécuter le code de
ton choix.

Exemple de mise en place simple.
Dans ton perso.xls (classeur de macros personnelles)
insère un module de classe

et renomme-le ExcelApplication. Puis recopie dans ce
module le code ci-dessous :


'====================== > >> >Public WithEvents AppXl As Application

Private Sub AppXl_WorkbookOpen(ByVal Wb As Workbook)
If Not Wb.Name = ThisWorkbook.Name Then
MsgBox "coucou"
End If
End Sub
'====================== > >> >
Ensuite, dans le module ThisWorkbook du perso.xls,
recopie ce code qui va créer

une instance d'Excel et l'affecter à l'application
Excel



au moment de son
ouverture (le perso.xls est exécuté au lancement
d'Excel)



si les macros sont
activées :

'====================== > >> >Dim MonXL As New ExcelApplication

Private Sub Workbook_Open()
Set MonXL.AppXl = Application
End Sub
'====================== > >> >
Voilà. Enregistre, ferme puis relance Excel. Ensuite,
l'ouverture de chaque

classeur va provoquer l'affichage du message "coucou"
(ou



l'exécution du code
que tu mettras à sa place).

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma
bal !





Bonjour,

On m'a conseillé de poser ma question plutôt sur ce
site :


Je désire exécuter une macro à l'ouverture de chaque
fichier excel (à la rigueur, à l'ouverture d'excel).
J'ai


tenté de mettre cette macro (en l'enregistrant comme
macro


complémentaire) dans le répertoire "C:Program
FilesMicrosoft OfficeOfficeXLOuvrir" (pour
exécuter




la
macro à l'ouverture d'excel), mais ça ne fonctionne
pas




dans mon cas : excel exécute apparemment les macros,
avant


d'ouvrir les fichiers ; or, cette macro est censée
modifier les fichiers que l'on ouvre --> ça ne fait
rien




du tout.

Est-ce réalisable ?

Merci pour les futures réponses.


.





.