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 :

Procédure pour vider une colonne en fonction d'un choix liste. [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Points : 16
    Points
    16
    Par défaut Procédure pour vider une colonne en fonction d'un choix liste.
    Bonjour, bonjour !

    Ma problématique est dans mon titre mais je vais essayer de résumer ça très simplement:

    J'ai un tableau de 3 collines sur x lignes. Ma 3e colonne est en fait une liste alimentée dans une autre page. J'aimerais que lorsque que je sélectionne dans cette liste la valeur "vide" mes deux premières colonnes de ma liste se vide. Sachant que mon tableau peut monter jusqu'à 48 entrées, et que du coup, je peux avoir autant de vide que nécessaire.

    Je pense qu'il faut que j'utilise Worksheets("Sheet1").Range("MaRange").ClearContents mais je ne vois pas comment sélectionner dans le code uniquement mon entrée et lui appliquer une procédure qui lui est propre.

    Il existe peut etre un MaListe.MonEntrée ? Tout en sachant que MaRange dependra de la ligne sur laquelle mon entrée sera "vide"

    En tout cas merci pour votre aide future !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Le fichier joint modélise la description faite dans votre message.

    Si ce que j'ai compris est bon, vous souhaitez effacer les cellules des colonnes A et B si une cellule de la colonne C est effacée au coup par coup.

    Le fichier joint contient deux macros événementielles pour réaliser cela, dans le module de l'onglet Feuil1 :

    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
     
    Private Sub Worksheet_BeforeRightClick(ByVal CelluleCible As Range, Cancel As Boolean)
     
       If CelluleCible.Count > 1 Then Exit Sub
     
       If Not Application.Intersect(CelluleCible, Range("C2", "C" & Rows.Count)) Is Nothing Then
              Range(CelluleCible.Offset(0, -2), CelluleCible).ClearContents
              Cancel = True
       End If
     
    End Sub
     
    Private Sub Worksheet_Change(ByVal CelluleCible As Range)
     
       If (CelluleCible.Count > 1 Or Not IsEmpty(CelluleCible)) Then Exit Sub
     
       If Not Application.Intersect(CelluleCible, Range("C2", "C" & Rows.Count)) Is Nothing Then
              Range(CelluleCible.Offset(0, -2), CelluleCible).ClearContents
       End If
     
    End Sub

    Pièce jointe 176110


    - De mon point de vue, il est inutile d'avoir une cellule vide dans votre liste de validation.
    - L'événement Worksheet_BeforeRightClick est sans doute le plus confortable à utiliser.

    Nb : Pour neutraliser ces événements, ne pas oublier d'ajouter les lignes dans les macros qui pourraient travailler également sur ces zones :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        Application.EnableEvents = False 'Au début du code
        Application.EnableEvents = True  'A la fin du code


    Cordialement.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    Bonjour Eric,

    Merci d'avoir pris le temps de me répondre. Ma description n'était peut erre pas assez précise puisque je me rend compte qu'il manque quelque chose.
    Ma colonne 3 est en fait une liste avec des types d'interfaces, et les deux précédentes servent à renseigner le type de le nom de l'interface.
    Lorsque celle ci est à Shutdown, je souhaiterais que les 2 premières se vident automatiquement (sans avoir à clic, ou à le supprimer manuellement, aucun intérêt :p)

    Je vais essayer d'adapter ce que vous venez de me fournir.

    Bonne journée !

  4. #4
    Membre habitué
    Homme Profil pro
    Programmeur en temps libre
    Inscrit en
    Février 2015
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Programmeur en temps libre
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 68
    Points : 139
    Points
    139
    Par défaut
    Bonjour,

    Si je reprend le code de Eric et que je l'adapte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_Change(ByVal CelluleCible As Range)
     
       If (CelluleCible.Count > 1 Or Not IsEmpty(CelluleCible)) Then Exit Sub
     
       If Not Application.Intersect(CelluleCible, Range("C2", "C" & Rows.Count)) Is Nothing _
               and CelluleCible.value="Shutdown" Then
              Range(CelluleCible.Offset(0, -2), CelluleCible.Offset(0, -1)).ClearContents
       End If
     
    End Sub
    Le "nettoyage" sera fait dès que l'on insère "Shutdown" dans la colonne C

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Ton code fonctionne effectivement avec l'adaptation. Malheureusement, j'avais deja quelque chose dans la procédure WSchange (je vais poser le code ci dessous)
    Mon bout de code me permet de choisir un nombre (qui correspond à un vlan ici) et de l'ajouter ou de le retirer en recliquant dessus. Sauf que lorsque je place le code, ma liste est completement bug.

    Jai essayer de le placer à different endroit, mais annule toujours ma "liste" en ne mettant plus que le vlan choisis et en effaçant toujours ce qu'il reste.

    Si vous avez une idée ...

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rngDV As Range
    Dim oldVal As String
    Dim newVal As String
    Dim lUsed As Long
     
     
    If Target.Count > 1 Then GoTo exitHandler
     
        On Error Resume Next
        Set rngDV = Cells.SpecialCells(xlCellTypeAllValidation)
        On Error GoTo exitHandler
     
        If (Target.Count > 1 Or Not IsEmpty(Target)) Then Exit Sub
     
        If Not Application.Intersect(Target, Range("D34", "D" & Rows.Count)) Is Nothing _
            And Target.Value = "Shutdown" Then
               Range(Target.offset(0, -2), Target.offset(0, -1)).ClearContents
        End If
     
     
       If rngDV Is Nothing Then GoTo exitHandler
     
            If Intersect(Target, rngDV) Is Nothing Then
               'do nothing
            Else
                Application.EnableEvents = False
                newVal = Target.Value
                Application.Undo
                oldVal = Target.Value
                Target.Value = newVal
                If Target.Row = 32 Then
                    If oldVal = "" Then
                      'do nothing
                    Else
                        If newVal = "" Then
                            'do nothing
                        Else
                            lUsed = InStr(1, oldVal, newVal)
                            If lUsed > 0 Then
                                If Right(oldVal, Len(newVal)) = newVal Then
                                    Target.Value = Left(oldVal, Len(oldVal) - Len(newVal) - 2)
                                Else
                                    Target.Value = Replace(oldVal, newVal & ", ", "")
                                End If
                            Else
                                Target.Value = oldVal _
                                  & ", " & newVal
                    End If
                End If
            End If
        End If
    End If
     
     
    exitHandler:
      Application.EnableEvents = True
    End Sub

  6. #6
    Membre habitué
    Homme Profil pro
    Programmeur en temps libre
    Inscrit en
    Février 2015
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Programmeur en temps libre
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 68
    Points : 139
    Points
    139
    Par défaut
    Bonjour,

    Pour commencer il faut que tu déplace ton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.EnableEvents = False
    juste après tes déclarations de variables.

    Essaies cette modif et reviens nous voir après

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    J'ai essayer de le déplacer un peu partout, mais ça ne change rien. Ma liste ne s'update pas correctement malgré les ajouts de vlans

  8. #8
    Membre habitué
    Homme Profil pro
    Programmeur en temps libre
    Inscrit en
    Février 2015
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Programmeur en temps libre
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 68
    Points : 139
    Points
    139
    Par défaut
    Pour résumer,

    Sans la partie du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If Not Application.Intersect(Target, Range("D34", "D" & Rows.Count)) Is Nothing _
            And Target.Value = "Shutdown" Then
               Range(Target.offset(0, -2), Target.offset(0, -1)).ClearContents
        End If
    ta macro fonctionne correctement, et dès que tu rajoute le nettoyage il y a un problème.

    Pour voir précisément quelle partie du code pose problème, met un point d'arret, Nom : Point d'arret.png
Affichages : 260
Taille : 132,0 Ko

    exécute en mode pas à pas (F8) et regarde à chaque fois le résultat sur ton classeur.




    Je ne comprend pas comment la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
               Range(Target.offset(0, -2), Target.offset(0, -1)).ClearContents
    peut avoir une influence sur le classeur si la valeur de la cellule modifiée n'est pas dans la colonne D et est différente de "Shutdown"

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    C'est un bon résumé !

    Je ne comprend pas non plus comment la macro pour nettoyer arrive à influencer ma liste de Vlan, qui n'est pas dans la même colonne en plus :p

    Je regarde avec le pas à pas (mais je m'en sert deja )

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (Target.Count > 1 Or Not IsEmpty(Target)) Then Exit Sub
    Voila la ligne en faute ! Ma procedure sortait automatiquement et du coup ne mettais jamais ma liste à jour. Merci beaucoup à tous les deux !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/03/2011, 21h45
  2. Fonction Javascript pour cacher une colonne d'un tableau HTML : bug Firefox
    Par lightstring4 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 29/07/2010, 19h17
  3. Réponses: 2
    Dernier message: 13/11/2009, 13h14
  4. Contraite NULL sur une colonne en fonction d'une autre colon
    Par speedy1496 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2004, 19h29

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