macro utilisable pour tous fichiers excel - résolu

sigma

XLDnaute Occasionnel
Bonjour à tous,
J'ai trouvé une partie des réponses à mes questions en cherchant dans les archives mais il me manque encore une information aussi, je vous sollicite.

je cherche à ce qu'une macro soit utilisable par défaut dans tous les classeurs ouverts, pour cela j'ai crée une macro (dans un module) dans un classeur personnel que j'appelle à partir d'un bouton sur mon ruban à partir de n'importe quel fichier excel; jusqu'ici pas de prb.
je souhaiterai désormais faire la même chose mais avec une macro qui fonctionnerai avec "Private Sub Worksheet_Change(ByVal Target As Range)" donc non enregistrée dans un module et que je n'arrive donc pas à appeler... quel est la solution pour que cette macro (réalisée par monsieur boisgontier que je remercie par ailleurs) puisse fonctionner par défaut sur tous les classeurs sans m'obliger à une action particulière d'appui sur un bouton ou de raccourci clavier ?

merci de votre aide.
cordialement,
 

Dranreb

XLDnaute Barbatruc
Re : macro utilisable pour tous fichiers excel

Bonjour.
Il vous faut une Private AppExc As Application dans un module objet (non standard) de votre classeur de macros perso. Son ThisWorkbook peut faire l'affaire (tant pis si c'est pour autre chose)
Initialisation pour le rendre actif: Set AppExc = Application. Pour le désactiver: Set AppExc = Nothing
Sélectionner AppExc dans la liste déroulantes de gauche qui surmonte la fenêtre de code pour implanter les modèles de procédures prenant en charge les évènements au niveau application, valables pour tous les classeurs. Ils sont très voisins de ceux de l'objet Workbook disponibles dans un module ThisWorkbook.
 
Dernière édition:

sigma

XLDnaute Occasionnel
Re : macro utilisable pour tous fichiers excel

merci Dranreb,

je pense que nous avons un certain écart de niveau ...
voici mes codes :
Private Sub Worksheet_Change(ByVal Target As Range)
Set champ = [A2:D16]
If Not Intersect(champ, Target) Is Nothing And Target.Count = 1 Then
Cells(Target.Row + 1, 1).Resize(1, champ.Columns.Count).Select
Target.Offset(1, 0).Activate
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set champ = [A2:D16]
If Not Intersect(champ, Target) Is Nothing And Target.Count = 1 Then
Cells(Target.Row, 1).Resize(1, champ.Columns.Count).Select
Target.Activate
End If
End Sub

est à dire qu'il faut que je rajoute avant le Set AppExc = application ?
la liste déroulante de gauche ne me donne comme choix uniquement " userform, module, module de classe et procédure...

merci
A+
 

Dranreb

XLDnaute Barbatruc
Re : macro utilisable pour tous fichiers excel

Dans un module de classe, ou plus généralement un module objet, pour figurer dans la liste de gauche une variable doit être impérativement déclarée en tête du module, avant toute procédure, de préférence derrière une Option Explicit, en Public ou Private avec le mot clé WithEvents.
Je m'aperçois que j'avais oublié de le préciser au #2
Donc c'est :
VB:
Private WithEvents AppExc As Application
Et effectivement avant que les dits évènements puisse être effectivement pris en charge elle doit avoir fait l'objet d'une initialisation par :
VB:
Set AppExc = Application
 
Dernière édition:

sigma

XLDnaute Occasionnel
Re : macro utilisable pour tous fichiers excel

re,
j'ai donc créé un module de lasse dans lequel j'ai copié ceci mais sans succès, une idée ?

Private WithEvents AppExc As Application
Private Sub Worksheet_Change(ByVal Target As Range)
Set AppExc = Application
Set champ = [A2:D16]
If Not Intersect(champ, Target) Is Nothing And Target.Count = 1 Then
Cells(Target.Row + 1, 1).Resize(1, champ.Columns.Count).Select
Target.Offset(1, 0).Activate
Set AppExc = Nothing
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set AppExc = Application
Set champ = [A2:D16]
If Not Intersect(champ, Target) Is Nothing And Target.Count = 1 Then
Cells(Target.Row, 1).Resize(1, champ.Columns.Count).Select
Target.Activate
Set AppExc = Nothing
End If
End Sub

merci
 

Dranreb

XLDnaute Barbatruc
Re : macro utilisable pour tous fichiers excel

Dans un module de classe de votre cru, il n'y a pas d'objet Worksheet dont vous pourrez mettre des procédures mais il y aura votre AppExc. Il prévoit des évènement SheetSelectionChange et SheetChange. Regardez dans la liste de droite cette fois.
Il y a par contre aussi un objet Class avec un évènement Initialize dans la procédure duquel vous pourrez initialiser votre AppExc pour le rendre opérationnel.
 
Dernière édition:

sigma

XLDnaute Occasionnel
Re : macro utilisable pour tous fichiers excel

merci à vous 2 mais beaucoup trop compliqué pour moi.
je refais toutefois une seconde tentative (toujours infructueuse) en mettant dans mon module de classe le code :

Private WithEvents AppExc As Application

Private Sub AppExc_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Set AppExc = Application
Set champ = [A2:D16]
If Not Intersect(champ, Target) Is Nothing And Target.Count = 1 Then
Cells(Target.Row, 1).Resize(1, champ.Columns.Count).Select
Target.Activate
Set AppExc = Nothing
End If
End Sub

un dernier coup de pouce... merci
bonne soirée.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : macro utilisable pour tous fichiers excel

Il vous faut créer quelque part un exemplaire d'objet défini par votre module de classe.
C'est pour ça que, même si ça n'a pas de rapport direct avec, je préfère mettre ce genre de code dans un module d'objet existant tel que ThisWorkbook, voire un UserForm … Comme ça au moins, il existe déjà !

Sinon avec un module de classe il faut en déclarer un, dans un module standard, là ça va : Dim Toto As Class1
Et trouver une occasion, là aussi, de l'initialiser: Set Toto = New Class1
Il est possible de le faire à l'initialisation du projet VBA en le mettant dans la déclaration: Dim Toto As New Class1
Class1 étant supposé être le nom de type d'objet, c'est à dire le nom de son module de classe.

N'oubliez pas l'initialisation de AppExc lors de l'initialisation de la classe, sans laquelle ça ne peut pas marcher non plus.

Edit: Je vois que vous avez mis ça, Set AppExc = Application, à un endroit où ça ne peut pas marcher: AppExc doit être initialisé avant que ses évènements puissent être pris en charge. Donc pendant c'est trop tard: l'évènement ne sera pas détecté puisque AppExc n'est pas opérationnel vu qu'il est juste décrit, et a même déjà son pointeur encore vide (Nothing) prévu, mais n'existe pas encore en mémoire vers quoi pointer !
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : macro utilisable pour tous fichiers excel

Bonjour.

Je me suis trompé sur un point: l'utilisation du mot clé New dans une déclaration d'objet ne crée pas d'exemplaire de cet objet avant qu'on ne tente de l'utiliser. À fortiori donc pas non plus à l'initialisation du projet VBA. Il va falloir une procédure pour lancer le truc.
C'est peut être une bonne chose d'ailleurs, surtout si vous affectez cette procédure à une commande personnalisée du ruban et si elle permet aussi de l'arrêter si elle est déjà lancée.

Module1, standard :
VB:
Option Explicit
Private X As Classe1

Sub LancerStopperX()
If X Is Nothing Then
   Set X = New Classe1
Else
   Set X = Nothing
   End If
End Sub
Classe1, classe :
VB:
Option Explicit
Private WithEvents AppExc As Application

Private Sub Class_Initialize()
Set AppExc = Application
End Sub

Private Sub AppExc_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim Champ As Range
Set Champ = Sh.[A2:D16]
If Intersect(Champ, Target) Is Nothing Then Exit Sub
If Target.Rows.Count <> 1 Then Exit Sub
If Target.Columns.Count <> 1 Then Exit Sub
Application.EnableEvents = False
Intersect(Champ, Target.EntireRow).Select
Target.Activate
Application.EnableEvents = True
End Sub
 

Dranreb

XLDnaute Barbatruc
Re : macro utilisable pour tous fichiers excel

Bonjour.
Joins ce que tu a fait, là je ne vois pas ce qui cloche.
Chez moi ça marche avec juste ces deux modules, un standard et celui de classe.
En exécutant LancerStopperX ça met en service le dispositif qui réagit lorsqu'on sélectionne une seule cellule de la plage A2:D16 de n'importe quelle feuille de n'importe quel classeur, ou ça le désactive s'il est déjà en service.
 

sigma

XLDnaute Occasionnel
Re : macro utilisable pour tous fichiers excel

Bonjour.
Joins ce que tu a fait, là je ne vois pas ce qui cloche.
Chez moi ça marche avec juste ces deux modules, un standard et celui de classe.
En exécutant LancerStopperX ça met en service le dispositif qui réagit lorsqu'on sélectionne une seule cellule de la plage A2:D16 de n'importe quelle feuille de n'importe quel classeur, ou ça le désactive s'il est déjà en service.[/QUO
 

sigma

XLDnaute Occasionnel
merci Dranreb,
j'ai eu quelques soucis qui m'ont empêché de te remercier jusqu'àlors. voici qui est réparé.
une autre question cependant. ok pour appeler une macro à partir du classeur perso si l'on passe par un module mais quid si j'ai besoin de faire fonctionner une macro à partir du classeur perso mais par un évènement "selection change" dans une feuille ?

A+
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Il faut exécuter LancerStopperX pour lancer ou stopper la détection automatique de la sélection d'une cellule dans n'importe quel classeur, laquelle une fois lancée exécutera, à chaque sélection, le code dans AppExc_SheetSelectionChange
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 330
Membres
103 187
dernier inscrit
ebenhamel