Difficile pour trouver un titre
Je cherche une piste afin de démarrer un code VBA dans un fichier Excel lorsque je l'ouvre
via une application tierce (Access, Word, autre Excel) mais pas lorsqu'il est ouvert manuellement.
Une idée ?
Philippe
Difficile pour trouver un titre
Je cherche une piste afin de démarrer un code VBA dans un fichier Excel lorsque je l'ouvre
via une application tierce (Access, Word, autre Excel) mais pas lorsqu'il est ouvert manuellement.
Une idée ?
Philippe
Bonjour.
J'ai fait cela en mettant en place une variable d'environnement.
Dans mon cas ce sont des VBS qui se chargent de créer la variable mais on peut le faire en VBA.
Ici le code que j'utilise :
ici du VBA pour crée la variable
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Option Explicit Option Compare Text 'Rend VBA insensible aux majuscules/Minuscules Option Private Module 'Rend les routines de ce module invisibles à l'utilisateur 'version 2019-07-11 12h50 Private Sub Test_IsAutoExec() Debug.Print IsAutoExec End Sub Public Function IsAutoExec() As Boolean 'Test si il existe une variable d'environnement portant le nom du fichier et qui vaut "Autoexec" ' Cette variable est normalement crée par le script qui appelle ce fichier Dim result As Boolean: result = False Dim wshshell As Object: Set wshshell = CreateObject("WScript.Shell") Dim wshSystemEnv As Object: Set wshSystemEnv = wshshell.Environment("USER") result = (wshSystemEnv("ParamExcel_" & ThisWorkbook.name) = "Autoexec") Set wshSystemEnv = Nothing Set wshshell = Nothing IsAutoExec = result End Function
ici du VBA pour supprimer la variable
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Private Sub AddAutoExcec() 'Crée la variable d'envirionnement ' Normalement c'est fait par le script qui appelle ce fichier Dim wshshell As Object: Set wshshell = CreateObject("WScript.Shell") Dim wshSystemEnv As Object: Set wshSystemEnv = wshshell.Environment("USER") wshSystemEnv("ParamExcel_" & ThisWorkbook.name) = "Autoexec" Set wshSystemEnv = Nothing Set wshshell = Nothing End Sub
A+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Private Sub RemoveAutoExcec() 'supprime la variable d'envirionnement ' Normalement c'est fait par le script qui appelle ce fichier Dim wshshell As Object: Set wshshell = CreateObject("WScript.Shell") Dim wshSystemEnv As Object: Set wshSystemEnv = wshshell.Environment("USER") Call wshSystemEnv.Remove("ParamExcel_" & ThisWorkbook.name) Set wshSystemEnv = Nothing Set wshshell = Nothing End Sub
Vous voulez une réponse rapide et efficace à vos questions téchniques ?
Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.
Bonsoir
Est-ce que tu as déjà regardé UserControl ? (https://docs.microsoft.com/en-us/off...on.usercontrol)
Je pense que si tu ouvres un fichier depuis une application tierce; il y a une probabilité que UserControl soit sur False sinon si tu ouvres le fichier avec du code VBA alors c'est simple; tu mets Application.UserControl sur False.
Du coup, lorsque tu ouvres ton fichier manuellement, Application.UserControl est initialisé à True.
Cela me semble un bon interrupteur ;-)
Bonne soirée.
Salut cavo789
Il faut noter que UserControl sera à False si Excel est invisible. Dans Access, j'utilise les deux fonctions suivantes pour ouvrir un Excel. TestExcel ouvre le classeur sans préciser l'instance Excel, et UserControl est False car le classeur est invisible. Il faut noter en plus que, Excel étant invisible, il faudra que le code le ferme, car Excel ne sera pas fermé automatiquement à la fermeture VBA du fichier. TestExcel2 préciser qu'Excel doit être visible, et UserControl sera alors True à l'ouverture du fichier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Sub TestExcel() Dim wb As Excel.Workbook Set wb = Excel.Workbooks.Open("e:\temp\essaiapptierce.xlsm") End Sub Sub TestExcel2() Dim App As New Excel.Application Dim wb As Excel.Workbook App.Visible = True Set wb = App.Workbooks.Open("e:\temp\essaiapptierce.xlsm") End Sub
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Bonsoir
Merci pour avoir pris le temps de tester car je n'ai, de mon côté, que fait appel à ma mémoire mais visiblement, elle contient quelques trous.
Dans ma petite case mémoire, j'avais conservé l'idée que UserControl était à True lorsque tu "ouvres" Excel de manière traditionnelle comme lorsqu'on double-clique sur un fichier Excel ou qu'on lance Excel nous-même.
Dans cette même case mémoire, j'avais en tête que UserControl était sur False lorsqu'on programmait un Set App = New Excel.Application mais, je le suppose, si l'application est visible (et que l'utilisateur a donc l'opportunité de faire une action), UserControl est probablement sur False.
Du coup, quand je lis ton explication ci-dessous, si on fait un Set App = New Excel.Application et qu'on garde l'application non visible, on peut donc détecter dans le code VBA d'un fichier Excel que l'application n'a pas été ouverte manuellement; ce qui répond au besoin évoqué par DphBxl. Non ?
(merci pour avoir clarifié et testé UserControl)
Bonne soirée.
Salut.
Peut-être une autre idée dans ce chapitre IX du tuto de Jean-Philippe André...
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
En fait, le premier paragraphe du lien que tu as donné résume bien comment les choses se passent
UserControl est True si (Application visible OU ouverte par l'utilisateur) et UserControl est False si (Application Non visible ET Ouverte par CreateObject ou GetObject). Dans la mesure où je pense que l'utilisateur ne sait pas ouvrir Excel ou un fichier Excel en invisible manuellement (il n'y a pas, à la lecture de cette page, de commutateur permettant de le faire), on peut résumer ces propositions logiques en disant que UserControl est à True si l'application est visible.True if the application is visible or if it was created or started by the user. False if you created or started the application programmatically by using the CreateObject or GetObject functions, and the application is hidden. Read/write Boolean.
Ce que le lien de Microsoft ne fait pas, c'est définir cette propriété UserControl. Je pense pouvoir la définir comme étant la propriété qui renseigne sur la capacité de l'utilisateur Excel d'avoir le contrôle de l'application via Excel ( => UserControl) à l'ouverture du fichier (et uniquement à l'ouverture). Dès lors, l'application doit être visible. UserControl est bien géré à l'ouverture, de sorte que l'état de visibilité de l'application ou du fichier après ouverture n'influence pas cette propriété.
Lorsqu'une application tierce, qui peut être Excel ^^, utilise un des deux codes suivants, l'instance Excel ouverte est invisible et UserControl sera donc False. Il sera possible de travailler dedans, mais on ne verra rien et il faudra que le code prévoit sa fermeture. Il y aura besoin d'une très solide gestion des erreurs, à mon avis ^^
Si on veut rendre l'application visible, on doit passer par une variable pour la création de la nouvelle instance et rendre cette instance visible, mais UserControl sera True.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Sub Test() Dim App As New Excel.Application ' Nouvelle instance invisible App.Workbooks.Open ("e:\temp\essaiapptierce.xlsm") End Sub Sub Test2() Dim wb As Excel.Workbook Set wb = Excel.Workbooks.Open("e:\temp\essaiapptierce.xlsm") ' Force l'ouverture d'une nouvelle instance invisible End Sub
J'ai essayé de passer cette propriété à False avant d'ouvrir le classeur car, bizarrement, elle est en lecture-écriture, mais Excel la repasse à True à l'ouverture du classeur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Sub Test() Dim App As New Excel.Application App.Visible = True App.Workbooks.Open ("e:\temp\essaiapptierce.xlsm") End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Sub Test() Dim App As New Excel.Application App.Visible = True App.UserControl = False ' Essai de forcer la valeur de UserControl App.Workbooks.Open ("e:\temp\essaiapptierce.xlsm") End Sub
Je pense donc pouvoir résumer en disant que UserControl peut donc être utilisé si le classeur ne doit pas être visible..., mais il ne permet pas, d'une manière générale, de déterminer comment le classeur a été ouvert.
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Partager