Forcer l'ouverture d'unclasseur dans une nouvelle instance...

white-spirit

XLDnaute Occasionnel
Bonjour Le Forum,

après avoir fouillé un bon moment, ici et ailleurs, je vous expose mon besoin, au cas ou qq'un saurais y remédier.

Voila: j'utilise un classeur contenant des macros, et en particulier des instructions agissant sur le mode de placement du curseur après la saisie, et sur la correction automatique.
Les instructions sont données à l'ouverture du classeur, et retirées à la fermeture, pour retrouver un Excel "standard".

Mon souci survint lorsque je dois ouvrir un autre classeur similaire (le nom est #), en simultané, pour consulter qq chose.
Si je laisse s'ouvrir dans la même instance Excel, lorsque je referme ce classeur, il enlève les instructions, alors que j'en ai encore besoin pour le précédent tjrs ouvert....

J'ai bien compris que mon seul salut est d'ouvrir une nouvelle instance Excel.

Je sais déja le faire avec une macro (dans celle qui est ouverte), mais c'est pour d'autres actions.
Le faire par macro pour la consultation que je veux faire ne m'intéresse pas, pas plus que le faire par le lancement Windows d'une nouvelle instance vide.

Donc, 2 pistes:
- soit je modifie Excel pour que l'ouverture de tout nouveau classeur se fasse dans une nouvelle instance
- soit je demande seulement à chacun des classeurs concernés (instructions vba) de s'ouvrir dans une instance indépendante...

Ce que j'ai trouvé à ce sujet concerne plutôt l'instruction pour Excel en entier, mais je n'ai pas réussi à le faire fonctionner... quant à l'autre cas, j'ai rien trouvé de probant.

Merci de me proposer vos idées, vous en remerciant par avance.

Cordialement

WS
 

job75

XLDnaute Barbatruc
Re : Forcer l'ouverture d'unclasseur dans une nouvelle instance...

Bonjour white-spirit,

Les instructions sont données à l'ouverture du classeur, et retirées à la fermeture, pour retrouver un Excel "standard".

(...) Si je laisse s'ouvrir dans la même instance Excel, lorsque je referme ce classeur, il enlève les instructions, alors que j'en ai encore besoin pour le précédent tjrs ouvert....

Dans la macro Workbook_BeforeClose il suffit de compter le nombre n de classeurs de ce type.

Et de remettre Excel en l'état standard seulement si n = 1.

A+
 

job75

XLDnaute Barbatruc
Re : Forcer l'ouverture d'unclasseur dans une nouvelle instance...

Re, hello Michel :)

Un code pour compter facilement les fichiers semblables :

Code:
Private Sub Workbook_Open()
Me.Names.Add "MonJoliFichier", 1, Visible:=False 'nom défini masqué
'suite du code
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim wb As Workbook, nom As Name, n%
For Each wb In Workbooks
  For Each nom In wb.Names
    If nom.Name = "MonJoliFichier" Then n = n + 1: Exit For
  Next
Next
If n = 1 Then
  'suite du code
End If
Me.Save 'enregistrement pour que le classeur soit toujours fermé
End Sub
@ Michel pour décrasser les neurones il faut régler le karsher à la bonne pression :rolleyes:

A+
 

job75

XLDnaute Barbatruc
Re : Forcer l'ouverture d'unclasseur dans une nouvelle instance...

Re,

Le code précédent va bien si l'on ferme les fichiers un par un.

Mais si l'on ferme plusieurs fichiers en même temps (fermeture d'Excel) on n'a jamais n = 1.

Je vais voir ça, peut-être faut-il en effet plusieurs instances.

Bonne nuit.
 

job75

XLDnaute Barbatruc
Re : Forcer l'ouverture d'unclasseur dans une nouvelle instance...

Bonjour white-spirit, le forum,

Pas besoin de plusieurs instances, voici la bonne solution :

Code:
Private Sub Workbook_Open()
Me.Names.Add "MonJoliFichier", 1, Visible:=False 'nom défini masqué
'ici le code modifiant l'état d'Excel
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim wb As Workbook, x As Variant, n%
For Each wb In Workbooks
  x = Evaluate("'" & wb.Name & "'!MonJoliFichier")
  If Val(CStr(x)) = 1 Then n = n + 1
Next
If n = 1 Then
  'ici le code remettant Excel à l'état "standard"
End If
Me.Names.Add "MonJoliFichier", 2 'le nom est redéfini
Me.Save 'enregistrement pour que le classeur soit toujours fermé
End Sub
En cas de fermeture d'Excel, l'état "standard" est appliqué par le dernier fichier fermé.

A+
 

job75

XLDnaute Barbatruc
Re : Forcer l'ouverture d'unclasseur dans une nouvelle instance...

Re,

Pour finir voici une variante où le classeur est enregistré seulement s'il a été modifié :

Code:
Private Sub Workbook_Open()
Me.Names.Add "MonJoliFichier", 1, Visible:=False 'nom défini masqué
'ici le code modifiant l'état d'Excel
Me.Saved = True
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim wb As Workbook, x As Variant, n%
For Each wb In Workbooks
  x = Evaluate("'" & wb.Name & "'!MonJoliFichier")
  If Val(CStr(x)) = 1 Then n = n + 1
Next
If n = 1 Then
  'ici le code remettant Excel à l'état "standard"
End If
If Not Me.Saved Then Me.Save 'si le classeur a été modifié
Me.Names.Add "MonJoliFichier", 2 'le nom est redéfini
Me.Saved = True 'le classeur est donc toujours fermé
End Sub
Bonne journée.
 

job75

XLDnaute Barbatruc
Re : Forcer l'ouverture d'unclasseur dans une nouvelle instance...

Hello Michel,

Oh, mais Gérard :), tu t'es pas un peu fatigué pour rien :eek:.

Ben si, j'ai eu les neurones un peu encombrés :rolleyes:

Au lieu de la macro Workbook_Open utiliser la macro Workbook_Activate :

Code:
Private Sub Workbook_Activate()
'ici le code modifiant l'état d'Excel
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'ici le code remettant Excel à l'état "standard"
If Not Me.Saved Then Me.Save 'si le classeur a été modifié
End Sub
A+
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Forcer l'ouverture d'unclasseur dans une nouvelle instance...

Re Gérard

Mercr Gérard, mais quand je lis cela, ça me fait un peu peur. En plus, je n'ai pas trouvé trace de cette célèbre macro :confused:.


Je sais déja le faire avec une macro (dans celle qui est ouverte), mais c'est pour d'autres actions.
Le faire par macro pour la consultation que je veux faire ne m'intéresse pas, pas plus que le faire par le lancement Windows d'une nouvelle instance vide.
.
 

job75

XLDnaute Barbatruc
Re : Forcer l'ouverture d'unclasseur dans une nouvelle instance...

Re,

Pour qu'Excel soit remis à l'état "standard" quand on ouvre ou active un classeur "normal" :

Code:
Private Sub Workbook_Activate()
'ici le code modifiant l'état d'Excel
End Sub

Private Sub Workbook_Deactivate()
'ici le code remettant Excel à l'état "standard"
End Sub
C'est tout bête.

A+
 

white-spirit

XLDnaute Occasionnel
Re : Forcer l'ouverture d'unclasseur dans une nouvelle instance...

Bonjour Job75, bonjour MJ13, bonjour le fil,

tout d'abord, merci Job75 de t'intéresser à ce sujet. Je tiens à m'excuser de ne pas avoir répondu plus tôt, mais je n'étais pas dispo.

je vais bien sur essayer tes suggesstions, et reviendrais donner le résultat obtenu dans le contexte de mon application.

MJ13, tu soulignes l'absence d'une macro que je n'ai pas publiée... je pense que ma phrase (ta citation) est un peu ambigue, parce qu'elle décrit un cas de figure, ou mon code me fait ouvrir des instances Excel indépendantes. Dans le sujet que j'ai exposé ici, il s'agit de classeurs ouverts manuellement, c'est pourquoi je demande leur avis aux autres.

Pour résumer, je crois, malgré tout, que la voie royale sera que lorsqu'un classeur "équipé du code de modification" doit etre ouvert, il faut:
- soit lancer manuellement une autre instance, et ouvrir ce que l'on veut,
- soit équiper ce classeur des "instructions" détectant que, (si un Excel est déja ouvert) , un classeur (quelconque) est déja ouvert, et que donc il faut lancer une autre instance (par le code, cette fois) pour que ce classeur s'y ouvre... on est sur ici que les modifs liées à l'ouverture, comme à la fermeture, n'affecteront que cette instance.

A plus tard, pour la suite du sujet.

Cordialement

WS
 

job75

XLDnaute Barbatruc
Re : Forcer l'ouverture d'unclasseur dans une nouvelle instance...

Re,

- soit équiper ce classeur des "instructions" détectant que, (si un Excel est déja ouvert) , un classeur (quelconque) est déja ouvert, et que donc il faut lancer une autre instance (par le code, cette fois) pour que ce classeur s'y ouvre...

Je n'ai trouvé aucun code sur le web à ce sujet.

La plupart des solutions reposent sur la modification manuelle de la base de registre !!!

A+
 

white-spirit

XLDnaute Occasionnel
Re : Forcer l'ouverture d'unclasseur dans une nouvelle instance...

Bonjour Job75, bonjour tt le monde,

Le sujet est résolu... j'ai trouvé une solution pour ouvrir un classeur dans une autre instance, uniquement si qq chose est déja ouvert, et si ce classeur à ouvrir contient des instructions "perturbatrices".

Je m'explique:

Excel est ouvert sur un classeur A.
Je souhaite ouvrir le classeur B, qui contient des instructions (à l'ouverture) qui pertuberaient le classeur A, si l'on est dans la même instance.

Pour y arriver, le classeur A contient ce code:

-au début de Thisworkbook_Open(): If Workbooks.Count > 1 Then
ThisWorkbook.Close
Exit Sub
End If


ensuite je mets normalement le code de modification d'Excel que j'utilise habituellement..

- au début de Thisworkbook_BeforeClose(): If Workbooks.Count > 1 Then
Call OuvrirDansNouvelleInstance
Else:


ensuite je mets le code qui enlève les modifications d'Excel (retour état "standard"), suivi bien sur de End if

et juste à la fin de cette macro, je mets If Workbooks.Count > 1 Then
ActiveWorkbook.Saved = True
End If
Application.DisplayAlerts = False
End Sub


- dans un module je mets la macro: Sub OuvrirDansNouvelleInstance()

Dim appExcel As Excel.Application
Set appExcel = CreateObject("Excel.Application")
Dim Titre
Dim Repertoire
Titre = ActiveWorkbook.Name
Repertoire = ThisWorkbook.Path
'lancement d'une autre occurence
With appExcel
.Workbooks.Open Repertoire & "\" & Titre
.Visible = True
.ActiveWorkbook.RunAutoMacros xlAutoOpen
.DisplayAlerts = False
End With
End Sub


ça fonctionne bien, si je ne travaille pas avec des classeurs contenant les modifs --> RAS, sinon le classeur "modifiant" commence à s'ouvrir, se lance en double ds une autre instance, se ferme sans alertes, et rien n'est modifié dans le classeur qui était ouvert initialement. Celui qui vient de se lancer dans l'autre instance a bien sur installé les modifs qu'il demande, mais c'est une autre instance..... donc pas de pb.

Je dois avouer une simple conséquence : le lancement ds la 2nde instance m'affiche la boite de sélection "Lecture-écriture / Lecture seule", mais ce n'est pas très gênant.

Si mes explications ne sont pas claires, dites-le moi ... et n'hésitez pas non plus à donner votre avis.

Merci encore de votre intérêt,

Cordialement

WS
 

Discussions similaires

Statistiques des forums

Discussions
312 286
Messages
2 086 796
Membres
103 392
dernier inscrit
doc_banane