Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/11/2011, 09h05   #1
Invité de passage
 
Inscription : juillet 2008
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 7
Points : 4
Points : 4
Par défaut 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
Plouf69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 10h07   #2
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Il faut bien comprendre qu'une macro est une procédure. Une fois lancée, elle s'execute sans attendre que tu cliques quelque part ou autre (sauf userForm, msgbox...). C'est donc uniquement ton évènement qui va déclencher une action, même si tu peux appeler une macro dans cette évènement.

Pour faire simple, c'est facile de passer un paramètre d'un évènement à une procédure, dans l'autre sens, ce n'est pas logique.

Ce que je te préconise :
- L'équivalent de "lancer ta macro" sera de changer un paramètre, sur une feuille ou dans une variable globale, indiquant que tu es en mode "changement de couleur".
- Dans ce mode chaque, changement de selection enregistre également dans une variable global ou sur une feuille le code couleur de la cellule pour que ce soit celui-là qui soit copier à la prochaine selection (Il faut l'initialiser pour la première fois bien sûr)

Maintenant, si tu ne veux faire qu'une fois cette action, oublie les évènements . Tu dois pouvoir exploiter ce qui est dans le presse papier (Ctrl+C sur la cellule d'origine et clique sur ton bouton pour le collage spécial)
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 11h11   #3
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 696
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 696
Points : 1 448
Points : 1 448
Bonjour,

Voici une solution qui doit s’approcher du résultat attendu.

Dans un module standard :
Code :
1
2
3
4
5
6
7
8
9
10
Public Couleur 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 CopieMizFormeCouleur()
    'On mémorise la couleur de remplissage de la cellule active
    Couleur = 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
End Sub
Dans le module ThisWorkbook
Code :
1
2
3
4
5
6
7
8
9
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 = Couleur
        'On réinitialise le marqueur
        Copie = False
   End If
End Sub
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/11/2011, 18h29   #4
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
Par défaut heu...!!!

bonjour sinon tu a le intersect entre deux range

essaie ceci:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
Dim cellule As String
Dim couleur As Long
 
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
' on a recupérerla couleur mais on veut annuler alors clicdroitsur la cellule que tu vien de cliquer
'on remet la variable cellule a vide pour pouvoir recuperer la couleur car c'est elle qui nous sert de condition
    cellule = ""
End Sub
 
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If cellule = "" Then    ' pour avoir une premiere address
        cellule = Target.Address
    End If
    'si la target ne correspond pas a la derniere cellule visitée alors on y met la couleur de la derniere cellule visitée
    If Application.Intersect(Range(cellule), Target) Is Nothing Then
        'on repique la couleur
        Target.Interior.Color = Range(cellule).Interior.Color
        'on enleve la couleur de l'ancienne cellule
        Range(cellule).Interior.Color = xlNone
        'on remet la variable cellule a vide pour pouvoir recuperer la couleur car c'est elle qui nous sert de condition
        cellule = ""
    End If
End Sub
au plaisir
__________________
mes fichiers dans les contributions:
mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA
mon nouveau mouse in out pour les boutons dans un userform
mon addin pour prendre un cliché de selection de cellules

si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres
et n'oublie pas de voter
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 11h17   #5
Invité de passage
 
Inscription : juillet 2008
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 7
Points : 4
Points : 4
Par défaut 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
Plouf69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 11h21   #6
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Tes variables publiques ne seront accessibles que dans ton classeur. Si tu veux mettre ta macro dans le Perso.xls, il faut mettre les variables dans le classeur qui appelle cette macro et faire un passage par référence.
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/12/2011, 15h46   #7
Invité de passage
 
Inscription : juillet 2008
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 7
Points : 4
Points : 4
Par défaut 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
Citation:
"E6"
est écrit en rouge dans ce msg ?
Plouf69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2011, 19h15   #8
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 675
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 675
Points : 7 665
Points : 7 665
Citation:
Envoyé par Plouf69 Voir le message
PS : pourquoi "E6"' est écrit en rouge dans ce msg ?
Parce que c'est une valeur littérale (entre guillemets).
La coloration syntaxique du forum utilise le rouge pour les valeurs littérales.
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/12/2011, 16h56   #9
Invité de passage
 
Inscription : juillet 2008
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 7
Points : 4
Points : 4
Par défaut 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
Plouf69 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h38.


 
 
 
 
Partenaires

Hébergement Web