Passage variables entre procédure et évènement
Bonjour,
J'ai cherché (peut être mal :(), mais n'ai pas trouvé de réponse à mon pb malgré les formidables pages de developpez.com expliquant le VBA.
Je veux recréer le fonctionnement de la macro native "reproduire la mise en forme" mais modifié de la façon suivante :
1- on clique dans une cellule qui possède une couleur de remplissage donnée,
2- je lance ma macro et
3 - lorsqu'on clique dans une autre cellule :
la cellule de départ n'est plus colorée et
la cellule d'arrivée est mise en couleur avec celle
qu'avait la cellule de départ
Actuellement je ne suis pas arrivé à transmettre la couleur de départ, j'utilise donc une couleur fixée.
Ma procédure (dans un module) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| Public Sub CopieMizFormeCouleur()
'travaille avec Workbook_SheetSelectionChange dans ThisWorkBook, permet de ne pas écrire une Sub dans chaque feuille
Cell = ActiveCell.Address 'la cellule de départ
' ColorIndex toujours = à 36 (pour le moment)
'x = -4142 => incolore, x = 36 => jaune pâle
x = ActiveCell.Interior.ColorIndex 'on récupère donc l'index de la couleur de la cellule de départ,
'utile qd je saurai passer x à Workbook_SheetSelectionChange(si possible)
Application.EnableEvents = True 'on déverrouille Private Sub Workbook_SheetSelectionChange(ByVal Target As Range)
'est remis à "true" en fin de Sub Worksheet_SelectionChange
Range(Cell).Interior.ColorIndex = -4142 'la cellule de départ est mise incolore
'qd on clique dans une autre cellule le fond est mis en jaune pâle par Workbook_SheetSelectionChange
End Sub |
L'évènement dans ThisWorkbook:
Code:
1 2 3 4 5 6 7 8 9
| Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'permet de sortir de la procédure si plus d'une cellule est sélectionnée
'(sinon la suite de la macro renvoie un message d'erreur)
If Target.Count > 1 Then Exit Sub
' MsgBox "Vous avez sélectionné la cellule " & Target.Address & _
' " dans la feuille nommée " & Sh.Name
Target.Interior.ColorIndex = 36 ' jaune pâle
Application.EnableEvents = False 'on remet à False car la macro CopieMizFormeCouleur est terminée
End Sub |
C'est peut être trivial, mais je sèche ou je suis passé à coté d'une notion ?
Merci de me lire et de me guider si possible.
Cordialement.
--
Plouf69
Passage variables entre procédure et évènement
Bonjour et merci à tous les 3 de s'être penchés sur mon pb
@gFZT82
Pour que la modification avec votre code fonctionne il m'a fallu ajouter dans
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| Public coulRempl As Single 'Couleur de remplissage de la cellule
Public Copie As Boolean
'Marqueur pour indiquer que l'on souhaite copier la couleur de remplissage lors _
du changement de sélection
Sub CopieMizFormeCouleurEss()
'On mémorise la couleur de remplissage de la cellule active
coulRempl = ActiveCell.Interior.ColorIndex
'On enlève la couleur de remplissage de la cellule active
ActiveCell.Interior.ColorIndex = -4142
'On mémorise l'action
Copie = True
Application.EnableEvents = True
End Sub |
et dans :
Code:
1 2 3 4 5 6 7 8 9 10 11
| Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
'si une seule cellule est sélectionnée et si la modification de la couleur _
de remplissage est autorisée
If Target.Count = 1 And Copie = True Then
'on modifie la couleur de remplissage
Target.Interior.ColorIndex = coulRempl
'On réinitialise le marqueur
Copie = False
End If
Application.EnableEvents = False
End Sub |
Pourquoi
Citation:
Target As Excel.Range
par rapport à Target As Range simplement ?
J'ai enfin trouvé mon pb, mais ne sais pas le résoudre :(, en fait la procédure "Sub CopieMizFormeCouleurEss()" se trouve dans PERSO.XLS
et "Private Sub Workbook...." dans deux classeur différents ou j'utilise cette macro et les 2 variables Public coulRempl et Public Copie sont vides pour les "Sub Workbook", alors que l'ensemble du code fonctionne si les deux proc sont dans un seul classeur (Modules et ThisWorkbook).
@ZebreLoup : il y a qd même une solution dans cette voie...
@patricktoulon
Comment on utilise ton code dans la feuille, je n'ai obtenu qu'un gros b...l, il faut que le code ne fonctionne que lorsqu'on en a besoin => une macro actionnée par un bouton, car je dois garder le clique droit pour formater des cellules par ex. (j'ai certainement pas compris le fonctionnement !)
Cordialement
Passage variables entre procédure et évènement
@patricktoulon
une raison du bazard :
Code:
Range(cellule).Interior.Color = xlNone
enlève le quadrillage et laisse pour moi (Excel 2003) une cellule bleue clair, j'ai compris qu'il n'y a pas de couleur,
par contre :
Code:
Range("E6").Interior.ColorIndex = xlNone
par exemple
met bien le fond en blanc (la valeur -4142 m'a été donnée par l'enregistreur de macro)
C'est du détail, mais je veux comprendre.
Je continue à explorer les réponses.
PS : pourquoi est écrit en rouge dans ce msg ?
Passage variables entre procédure et évènement
Merci à tout ceux qui m'ont répondus et à developpez.com où j'ai pu trouver ce qui m'a fait avancer (et à Goo.. qui m'a simplifié les recherches).
Je travaille avec 2 classeurs dans lesquels j'utilise mon pinceau "Ploufé" ;) actionné par un bouton.
Dans chaque module de classe ThisWorkbook j'ai :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
'si une seule cellule est sélectionnée
If Target.Count = 1 Then '
'on active la cellule cible
Target.Activate
'voir Application.Run "'nomClasseur.xls'!Module1.nomMacro"
'sans nom du module ça fonctionne !
Application.Run ("PERSO.XLS!ColleCouleurRempl")
End If
'on désactive l'évènement
Application.EnableEvents = False
End Sub |
Dans un Module de PERSO.XLS j'ai la déclaration de la variable de la couleur de remplissage de la cellule de départ tout au début du module qui contient les deux sub (si je met cette déclaration juste au dessus de la première de ces deux sub, ça ne fonctionne pas ?, cad avec des sub au dessus de celles ci) :
Code:
1 2
| Public coulRempl As Single 'Couleur de remplissage de la cellule de départ
'utilisé par CopieMizFormeCouleur() et par ColleCouleurRempl() |
et plus bas (en dernier des Sub)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| Public Sub CopieMizFormeCouleur()
'c'est cette sub qui est lancé par le bouton
'On mémorise la couleur de remplissage de la cellule active
coulRempl = ActiveCell.Interior.ColorIndex
'On enlève la couleur de remplissage de la cellule active
ActiveCell.Interior.ColorIndex = -4142
'on autorise la prise en compte de l'évènement Workbook_SheetSelectionChange
Application.EnableEvents = True
End Sub
Public Sub ColleCouleurRempl() 'Sub appelée par ThisWorkbook qui a sélectionné l'ActiveCell
ActiveCell.Interior.ColorIndex = coulRempl
End Sub |
En résumé, je contourne le pb : je récupère la couleur et je remplace dans PERSO.XLS, d'où plus de pb de passage de variable :lol: