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 :

Ajout d'une ligne sous une autre ligne


Sujet :

Macros et VBA Excel

  1. #1
    Invité
    Invité(e)
    Ajout d'une ligne sous une autre ligne
    Bonjour,

    Selon l'illustration suivante:



    J'aimerais qu'à la cellule M si l'utilisateur choisi "Oui" dans la liste déroulante, une ligne s'ajoute en-dessous la ligne courante.

    Et c'est le même principe que pour les autres lignes.

    Est-ce que quelqu'un peut m'expliquer comment faire ?

    Merci de votre entière collaboration !

  2. #2
    Rédacteur

    Bonjour,
    Vous ne précisez pas si le tableau où se trouve la liste déroulante est une plage normale ou si c'est un tableau structuré.
    Dans les deux cas il faut utiliser la procédure événementielle Worksheet_Change pour intercepter le changement de valeur dans la cellule de la feuille en vérifiant si le changement a lieu dans la plage concernée

    Exemple pour un tableau dont on veux intercepter un changement dans la 5ème colonne d'un tableau (plage normale) débutant en cellule B4 à condition que la valeur modifiée est "Oui"
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_Change(ByVal Target As Range)
       Dim rng As Range
       Set rng = Me.Range("B4").CurrentRegion.Columns(5)
       With Target
         If Not Intersect(rng, Target) Is Nothing And .Count = 1 Then
            If .Value = "Oui" Then
               ' Code d'insertion
     
            End If
         End If
      End With
      Set rng = Nothing
    End Sub


    Exemple avec un tableau structuré (ListObject) unique dans la feuille et pour un changement de la colonne (Etiquette Statut)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_Change(ByVal Target As Range)
       Dim rng As Range
       Set rng = Me.ListObjects(1).ListColumns("Statut").DataBodyRange
       With Target
         If Not Intersect(rng, Target) Is Nothing And .Count = 1 Then
            If .Value = "Oui" Then
               ' Code
               '
            End If
         End If
      End With
      Set rng = Nothing
    End Sub


    Ensuite il y a lieu d'insérer la ligne
    Exemple
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Range("B6:F6").Insert Shift:=xlDown


    Si c'est un tableau structuré le code est un peu différent mais plus simple à gérer surtout s'il existe des formules, mise en forme conditionnelles, etc.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  3. #3
    Invité
    Invité(e)
    C'est un tableau normal.
    J'ai essayé ton code mais j'ai un erreur.

    La colonne "M" est la colonne avec la liste déroulante Oui/Non qui va de M21 à M171



    Il faut qu'à chaque fois que l'utilisateur choisisse Oui dans la colonne M, il faut qu'Excel ajoute une ligne en-dessous

  4. #4
    Rédacteur

    Bonjour,
    Au vu de l'image publiée et du message renvoyé par le VBA, cela me semble clair.
    On ne peut pas avoir de procédure portant le même nom et on peut constater deux procédures événementielles Worksheet_Change ce qui évidemment n'est pas possible.
    Il faut donc prévoir au sein de la procédure une structure décisionnelle soit Select Case soit un If...Then...Else pour traiter les différents cas.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  5. #5
    Invité
    Invité(e)
    J'ai sélectionné Oui dans la cellule M21 et une ligne en-dessous ne s'est pas ajouté



    J'ai ce 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
     
    Private Sub Worksheet_Change(ByVal Target As Range)
       Dim rng As Range
       Set rng = Me.Range("M21").CurrentRegion.Columns(5)
       With Target
         If Not Intersect(rng, Target) Is Nothing And .Count = 1 Then
            If .Value = "Oui" Then
               Range("D22:M22").Insert Shift:=xlDown
     
            End If
         End If
      End With
      Set rng = Nothing
    End Sub

  6. #6
    Rédacteur

    Bonjour,
    Les codes que je publie sont des exemples que vous devez adapter et non pas pas faire un simple Copier/Coller

    La ligne ci-dessous signifie que la plage de données commence à M21 et que l'on prends la cinquième colonne
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Set rng = Me.Range("M21").CurrentRegion.Columns(5)


    Faites un petit essai manuellement en vous plaçant sur la cellule M21 et faites la combinaison des touches Ctrl + "*" (C'est l'astérisque du pavé numérique) et vous allez voir une sélection de la plage courante. C'est cela que renvoie Me.Range("M21").CurrentRegion et .Columns(5) est la cinquième colonne de la plage ainsi sélectionnée


    Autrement dit, si j'ai un tableau qui commence en B3 comme illustré plus bas avec le code ci-dessous

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub t0()
      Dim rng As Range
      Set rng = ActiveSheet.Range("B3").CurrentRegion
      Debug.Print rng.Address
      Set rng = ActiveSheet.Range("B3").CurrentRegion.Columns(3)
      Debug.Print rng.Address
    End Sub


    L'instruction de la ligne 4, renverra l'adresse $B$3:$E$9 et celle de la ligne 6 $D$3:$D$9

    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  7. #7
    Invité
    Invité(e)
    Bonjour,

    Si j'ai le code suivant:

    Je fais CTRL+* et il me sélectionne le tableau au complet B19 à M171.

    Il ne me donne pas d'erreur mais il n'ajoute pas de ligne sous la liste que j'ai sélectionné Oui dans la liste déroulante.



    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private Sub Worksheet_Change(ByVal Target As Range)
       Dim rng As Range
       Set rng = Me.Range("D21").CurrentRegion.Columns(10)
       With Target
         If Not Intersect(rng, Target) Is Nothing And .Count = 1 Then
            If .Value = "Oui" Then
               Range("D22:M22").Insert Shift:=xlDown
             End If
         End If
      End With
      Set rng = Nothing
    End Sub

  8. #8
    Rédacteur

    Bonjour,
    Il ne me donne pas d'erreur mais il n'ajoute pas de ligne sous la liste que j'ai sélectionné Oui dans la liste déroulante.
    Je me demande si vous le faites exprès

    Avant d'insérer une ligne, il faut savoir
    1. Si la cellule où a lieu le changement est dans la bonne colonne
    2. Si la cellule modifiée contient "Oui"


    Le point 1, est la partie que j'essaye en vain de vous expliquer
    Le but de ce Forum n'est pas de vous donner un code tout "cuit" mais de vous aider à y arriver
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  9. #9
    Invité
    Invité(e)
    Voici mon fichier.


    Qu'est-ce qui manque au code pour que ça fonctionne ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub Ajout()
    For Each c In Range("M21:M171").Cells
     
    If (c.Value = "Oui") Then
       ActiveSheet.Rows(Row + 1).EntireRow.Insert Shift:=xlDown
    End If
    Next
     
    End Sub

  10. #10
    Rédacteur

    Bonjour,
    Cela fait près de vingt ans que j'apporte mon aide sur les forums et dix que j'apporte ma contribution sur celui-ci.
    Je le fais avec d'autant plus de plaisir que j'ai profité moi même de l'aide de plus forts que moi à l'époque où je savais juste faire une somme dans Excel

    Cependant aider quelqu'un qui change d'avis à tout bout de champs qui semble ne pas comprendre ou ne pas suivre ce qu'on lui dit, et ce n'est pas la première discussion initiée par vous où je le constate, c'est non seulement irritant mais non motivant.

    Le but de ce site est de s'entraider, cela signifie que vous devez faire également un minimum d'effort pour apprendre vous même, lire des tutoriels pour vous améliorer et évoluer.

    En début de discussion vous expliquez que vous voudriez insérer une ligne si dans une liste déroulante présente dans une colonne particulière, l'utilisateur choisi "Oui"

    Pour cela il faut donc d'abord utiliser une procédure événementielle Worksheet_Change qui va réagir à chaque changement de valeur dans n'importe quelle cellule de la feuille.
    Donc pour ne réagir qu'à la seule condition que la cellule où a lieu ce changement soit dans cette colonne particulière mais uniquement dans un tableau particulier, il y a lieu de le détecter. C'est ce que je vous ai montré dans ma réponse du Fil # 2
    Ensuite seulement on insère une ligne et je vous ai montré un code pour insérer une ligne.

    Au lieu de poser des questions, vous montrez un autre code , comme celui que vous venez de publier, qui lui, même s'il ne fonctionne pas, parcoure les cellules de la plage "M21:M171" et insère une ligne à chaque fois qu'il y a "oui".
    Est-ce une nouvelle orientation de votre projet ?

    Au lieu de rester dans la même discussion, vous en ouvrez une autre avec la même question, ce que vous avez déjà fait ) maintes reprises. Je crois que je vais en rester là
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  11. #11
    Invité
    Invité(e)
    Bonjour,

    Oui, c'est ma seule orientation dans mon projet.

    Je voulais être encore plus précise pour me faire comprendre.

    Merci de votre collaboration.

###raw>template_hook.ano_emploi###