IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Passage variables entre procédure et évènement


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Utilisateur d'informatique
    Inscrit en
    Juillet 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Utilisateur d'informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 11
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    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)

  3. #3
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

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

    Dans un module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu...!!!
    bonjour sinon tu a le intersect entre deux range

    essaie ceci:
    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
    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:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre averti
    Homme Profil pro
    Utilisateur d'informatique
    Inscrit en
    Juillet 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Utilisateur d'informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 11
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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

  6. #6
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage de variable de type array entre procédures événementielles
    Par Harry Covair dans le forum Général VBA
    Réponses: 1
    Dernier message: 16/07/2010, 13h43
  2. [XL-2003] problème passage paramètre entre procédure
    Par angetec dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/11/2009, 11h01
  3. Passage variables entres pages
    Par badind dans le forum Langage
    Réponses: 4
    Dernier message: 23/01/2009, 12h44
  4. passage variables entre form
    Par Mihalis dans le forum Delphi
    Réponses: 5
    Dernier message: 13/01/2007, 20h03
  5. [langage] Probleme passage de variables entre modules
    Par Ludo167 dans le forum Langage
    Réponses: 4
    Dernier message: 13/08/2004, 12h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo