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 :

Macro événementielle après liste déroulante


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut Macro événementielle après liste déroulante
    Bonjour,
    Je voudrais qu'une macro se déclenche quand je modifie une cellule par un choix dans une liste déroulante.
    Pour l'instant, il faut qu'après avoir choisi ma valeur qui s'inscrit alors dans ma cellule, je tape sur entrer pour que la macro se déclenche et je voudrais ne plus avoir à taper entrer.

    Si quelqu'un y voit clair, merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    De quelle liste déroulante parles-tu? D'une liste de validation? D'une liste déroulante de formulaire liée à une cellule?

    Si tu as placé une liste déroulante via les contrôles de formulaire, tu peux y affecter une macro lors du changement de sélection dans la liste.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Liste de validation

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    L'évènement Worksheet_Change intercepte la fermeture de la liste de validation. Quel est le problème que tu rencontres?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Je travaille avec un événement SelectionChange, je vais tenter avec Change.
    SelectionChange ne doit donc pas voir la fermeture d'une liste de validation de données.

    Je viens d'essayer avec Change et il ne se passe plus rien après que j'aie sélectionnée ma donnée dans ma liste

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    C'est pourtant bien Worksheet_Change que tu dois utiliser. SelectionChange est levé lorsque tu changes de cellule. Change est levé s'il y a un changement dans la cellule, et la fermeture de la liste de validation, qui valide donc la modification dans la cellule, lève bien l'évènement Change.

    Pourrais-tu donner le code utilisé?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Avec:

    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
    25
    26
    27
    28
    Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = True
    If Not Intersect(Target, Range("J2:J4000")) Is Nothing Then
    If Range("J" & ActiveCell.Row - 1) = "X" Then
     
    Target.Offset(0, -1).Value = Target.Offset(-1, -1).Value
     
    Application.EnableEvents = False
     
    Range(Cells(Cells(Cells.Rows.Count, 1).End(xlUp).Row, 1), Cells(Cells(Cells.Rows.Count, 1).End(xlUp).Row, 6)).Select
    Selection.Copy
     
        Selection.End(xlToLeft).Select
        Selection.Offset(1, 0).Select
        Paste
        Application.EnableEvents = True
        Selection.End(xlToLeft).Select
     ActiveCell.Offset(0, 6).Activate
     
    ActiveCell.Offset(1, 0).Select
        Selection.End(xlToLeft).Select
     
    ActiveWorkbook.Save
     
     
    End If
    End If
    End Sub
    Rien ne se produit à la sélection dans la liste de validation de données

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Forcément.

    Ce sont tes Application.EnableEvents qui posent problème...

    Analyse ce qui se passe.

    Au premier appel de la procédure, tu passes à EnableEvents = False en fin de procédure => les évènements sont désactivés et tu ne lèveras donc plus jamais l'évènement, autrement dit, tu n'auras plus l'occasion de passer sur EnableEvents = true.

    Tu dois gérer les évènements autrement. Et tu dois toujours gérer les erreurs pour être certain de remettre EnableEvents à True en sortie de procédure. Attention, Après avoir modifié ton code, tu dois réactiver les évènements (par application.enableevents = true dans la fenêtre d'exécution) ou fermer Excel et l'ouvrir à nouveau.

    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
    25
    26
    Private Sub Worksheet_Change(ByVal Target As Range)
      on error goto EndHandler  
      If Not Intersect(Target, Range("J2:J4000")) Is Nothing Then
        If Range("J" & ActiveCell.Row - 1) = "X" Then
          Application.EnableEvents = false
          Target.Offset(0, -1).Value = Target.Offset(-1, -1).Value
          Range(Cells(Cells(Cells.Rows.Count, 1).End(xlUp).Row, 1), Cells(Cells(Cells.Rows.Count, 1).End(xlUp).Row, 6)).Select
          Selection.Copy
     
          Selection.End(xlToLeft).Select
          Selection.Offset(1, 0).Select
          Paste
          Application.EnableEvents = True
          Selection.End(xlToLeft).Select
          ActiveCell.Offset(0, 6).Activate
     
          ActiveCell.Offset(1, 0).Select
          Selection.End(xlToLeft).Select
     
          ActiveWorkbook.Save 
        End If
      End If
     
    EndHandler:
      Application.EnableEvents = True
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    En effet.
    Et de plus, avant, je validais avec entré, du coup je passais à la ligne suivante et rédigeais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("J" & ActiveCell.Row - 1) = "X" Then
    que j'ai du enlevé maintenant que je ne passe pas à la ligne suivante.

    Le bon code:

    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
    25
    26
    27
    Private Sub Worksheet_Change(ByVal Target As Range)
      On Error GoTo EndHandler
      If Not Intersect(Target, Range("J2:J4000")) Is Nothing Then
        'If Range("J" & ActiveCell.Row - 1) = "X" Then
     
          Target.Offset(0, -1).Value = Target.Offset(-1, -1).Value
          Application.EnableEvents = False
          Range(Cells(Cells(Cells.Rows.Count, 1).End(xlUp).Row, 1), Cells(Cells(Cells.Rows.Count, 1).End(xlUp).Row, 6)).Select
          Selection.Copy
     
          Selection.End(xlToLeft).Select
          Selection.Offset(1, 0).Select
          Paste
          Application.EnableEvents = True
          Selection.End(xlToLeft).Select
          ActiveCell.Offset(0, 6).Activate
     
          ActiveCell.Offset(1, 0).Select
          Selection.End(xlToLeft).Select
     
          ActiveWorkbook.Save
        End If
     
     
    EndHandler:
      Application.EnableEvents = True
    End Sub
    De même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Target.Offset(0, -1).Value = Target.Offset(-1, -1).Value
    doit devenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Target.Offset(1, -1).Value = Target.Offset(0, -1).Value
    Merci

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

Discussions similaires

  1. executer macro via une liste déroulante sur access
    Par RadioBerkane dans le forum VBA Access
    Réponses: 3
    Dernier message: 10/09/2012, 19h48
  2. Affichage d'après liste déroulante
    Par etudiant2290 dans le forum Général VBA
    Réponses: 0
    Dernier message: 07/09/2012, 09h00
  3. macro pour choix liste déroulante
    Par ericdev67 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/07/2009, 19h41
  4. résultat d'une macro dans une liste déroulante.
    Par Empty_body dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/01/2008, 15h58
  5. Pb d'affichage apres une liste déroulante
    Par loic.440 dans le forum ASP
    Réponses: 13
    Dernier message: 19/01/2005, 14h28

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