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 :

Problème sur événement Change


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2020
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 83
    Points : 28
    Points
    28
    Par défaut Problème sur événement Change
    Bonjour,

    Je travaille sur un fichier Excel et je suis allé faire un tour sur ChatGPT, pour voir comment il s'en sortirait. Eh bien... Il m'a fait 152 propositions, dont les 3/4 avec une erreur 13. Passons...

    Il s'agit d'un fichier avec macros événementielles, et j'ai un problème avec l'événement Change. Je vais essayer d'être le plus clair possible. Il s'agit d'un fichier qui listera des suivis, avec différentes infos sur le client (nom, date de naissance, etc). Deux colonnes m'intéressent particulièrement: la colonne D (depuis D9 et suivantes) et M (M9 et suivantes). La colonne D contiendra le nombre de séances (que des chiffres, à saisir directement) et la colonne M propose un menu déroulant, avec quatre valeurs uniquement: "A venir", "En cours", "Suspendu", "Terminé". Lors de la création d'un suivi, une ligne est ajoutée. Par défaut, elle n'a pas (encore) de valeur en D et sa valeur en M, par défaut, est "A venir". Premier contrôle à effectuer par l'événement Change: dès qu'une valeur sera saisie en D (un nombre, donc), il doit automatiquement passer, en M, de "A venir" à "En cours". Mais il doit laisser le menu déroulant accessible, car l'utilisateur pourra par la suite changer, à tout moment, entre "En cours", "Suspendu", "Terminé". Il ne remettra jamais "A venir", cette valeur-là n'étant sélectionnée qu'au début, avant que celui-ci commence.

    La deuxième partie de la macro doit colorer la ligne en question, en fonction de la valeur en M: Si M = "A venir", Excel doit choisir certaines couleurs, d'autres couleurs pour les 3 autres valeurs. Sur cette partie-là, je devrais men sortir. C'est plus la structure de la première partie qui est délicate.

    Et à tous ceux qui auront la gentillesse de me suggérer des pistes ou des bouts de code, merci d'éviter l'erreur 13. Je ne sais pas pourquoi, je l'ai depuis peu en horreur...

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonjour Cahlang

    Tu peux mettre cette procédure dans le module de la feuille qui va être traitée.
    Il faut également ouvrir un module pour insérer la variable publique.

    Quand tu vas cliquer sur une cellule la variable publique Cell_Val récupère la valeur de la cellule.
    Si la valeur dans cette variable est vide à l'insertion d'une valeur numérique dans la colonne D avec des lignes supérieures à 8 et que la donnée soit bien numérique on fait écrire "A venir" dans la colonne M à la même hauteur de ligne


    Module feuille ********************************

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Adr As String
    Dim Spl
    Application.EnableEvents = False

    Adr = Target.Address
    If VBA.InStr(Adr, ":") <> 0 Then Application.EnableEvents = True: Exit Sub ' Non traité car c'est une plage et non une cellule
    Spl = Split(Adr, "$")
    If Spl(1) = "D" And VBA.CInt(Spl(2)) > 8 Then
    If Not IsNumeric(Target.Value) Then MsgBox ("La valeur n'est pas numérique."): Application.EnableEvents = True: Exit Sub
    If Cell_Val = "" Then Range("M" & Target.Row) = "A venir"
    End If
    Application.EnableEvents = True
    End Sub

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Cell_Val = Target.Value
    End Sub





    Module ********************************

    Public Cell_Val ' Mémorise les données de la colonne D

    Cordialement Patrice

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 202
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 202
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut,
    Citation Envoyé par patrice67 Voir le message
    Module ********************************

    Public Cell_Val ' Mémorise les données de la colonne D
    Inutile que cette variable soit publique, la déclarer privée à la feuille suffit amplement.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonjour deedolith,

    Je suis d'accord avec toi que j'aurais pu déclarer cette variable comme Private dans le module de la feuille.

    Cldt

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2020
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 83
    Points : 28
    Points
    28
    Par défaut
    patrice67, deedolith,

    Merci pour vos propositions! Avant d'avoir reçu vos réponses, j'ai trouvé une macro qui semble fonctionner correctement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_Change(ByVal Target As Excel.Range) 
        If Target.Column = 4 Then 
            ThisRow = Target.Row 
            If Target.Value <> "" Then 
                Range("M" & ThisRow).Value = "En cours" 
            End If 
        End If 
    End Sub
    Elle a un avantage sur celle proposée par patrice67: comme elle est plus simple, je la comprends mieux! Elle ne tient pas compte du fait qu'il faut démarrer à partir de D9, mais ce n'est pas problématique: il n'y aura pas de valeur entre D1 et D8. Celle de patrice67 est-elle plus fiable ou fonctionnelle par rapport à la demande de ce que devrait faire la macro?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2020
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 83
    Points : 28
    Points
    28
    Par défaut
    Ah non, je me rends tout de même compte d'une erreur! Comme la macro est libellée, lorsque l'utilisateur notera "Suspendu" ou "Terminé", au prochain changement de valeur saisi en D, la macro reviendra à "En cours"...
    Cela devrait être plus juste ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_Change(ByVal Target As Excel.Range) 
        If Target.Column = 4 Then 
            ThisRow = Target.Row 
            If Target.Value <> "" And Range("M" & ThisRow).Value = "A venir" Then 
                Range("M" & ThisRow).Value = "En cours" 
            End If 
        End If 
    End Sub
    Le cas de figure où il n'y a pas de valeur en D (Target.Value = ""), lorsqu'un nouveau suivi est créé, fait que la valeur "En cours" restera inchangée.
    Dès qu'une valeur est saisie, Excel notera "En cours". Mais si ensuite, l'utilisateur sélectionne "Suspendu" ou "Terminé", la valeur ne changera plus puisque la première partie de la condition est réalisée (Target.Value <>""), mais pas la seconde. Cela me semble correct ainsi.

Discussions similaires

  1. RC=4 sur un change en macro edit
    Par sam01 dans le forum z/OS
    Réponses: 2
    Dernier message: 28/10/2010, 12h44
  2. Réponses: 2
    Dernier message: 20/10/2010, 11h16
  3. [XL-2003] code repetitif sur combobox change
    Par bosk1000 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/12/2009, 20h12
  4. info sur evenement change
    Par maverick91 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/09/2008, 16h19
  5. click sur image, change image
    Par aurore22 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/06/2008, 16h50

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