Problème excel insertion de ligne décalée

Bonjour, je suis débutant en vba excel et j'ai un souci qui pourrait vous paraitre simple. En fait, j'ai un fichier avec trois tableaux placés sur la même verticale. Il y a pour chacun de ces tableaux un bouton qui doit permettre à l'aide de macro de rajouter une ligne au tableau. Le souci ne se pose pas pour le premier tableau mais en revanche pour les deux d'en dessous j'ai un problème.
Puisqu'aux boutons j'ai associé un ajout de ligne, si j'utilise le premier bouton en premier (celui d'en haut donc) cela décale le numéro des lignes et du coup me décale mon ajout de ligne des tableaux d'en bas (ajout qui devrait se faire en bas des tableaux en copiant les choix que proposaient ceux-ci). Je ne sais pas si je me suis bien exprimé ou pas. En tt cas, si quelqu'un sait comment faire cela pourrait beaucoup m'aider! merci beaucoup

7 réponses

  1. Merci beaucoup je vais essayer ça!
    0
    1. En considérant un bouton a coté de chaque tableau comme tu as dis au début

      CommandButton1 pour le tableau 1
      CommandButton2 pour le tableau 2
      CommandButton3 pour le tableau 3

      Voici ce que je te propose, dis moi si cela te convient ou si tu souhaites des améliorations. Je ne savais pas ce qu'il y avait exactement dans tes colonnes donc j'ai simplement fait un copier coller de la ligne du dessus histoire que tu es tes listes déroulantes qui soit copié. Du coup si qui est dans les autres colonnes sera copier aussi mais il te suffit juste de rajouter quelque ligne si tu souhaite rendre certaine cellule vierge.

      Voici le code : (LaLigne est une variable globale)

      Dim LaLigne As Integer
      
      Private Sub Initialisation()
          LaLigne = 6
          
      End Sub
      
      Private Sub CommandButton1_Click()
          Dim i As Integer
          Dim Validate As Boolean
          
          Initialisation
          
          Validate = False
          Sheets(1).UsedRange
          For i = LaLigne To Cells.SpecialCells(xlLastCell).Row + 1
              If Cells(i, 2) = "" And Validate = False Then
                  LaLigne = i
                  Validate = True
              End If
              
          Next i
      
          Rows(LaLigne).Insert Shift:=xlDown
          Rows(LaLigne - 1).Copy
          Rows(LaLigne).Select
          ActiveSheet.Paste
      
      End Sub
      
      Private Sub CommandButton2_Click()
          Dim i As Integer
          Dim Validate As Integer
          
          Initialisation
          
          Validate = 0
          Sheets(1).UsedRange
          For i = LaLigne To Cells.SpecialCells(xlLastCell).Row + 1
              If Cells(i, 2) = "" And Validate < 2 Then
                  LaLigne = i
                  Validate = Validate + 1
              End If
              
          Next i
      
      0
      1. oui c'est exactement ça!
        Alors en fait mon premier tableau commence en B6 et va jusqu'a K16

        Ce tableau est composé de la sorte :

        Ligne 6 ==> titres de catégories
        Ligne 7 et 8==> choix de la couche de roulement
        Ligne 9 et 10==> choix de la couche de base
        Ligne 11 et 12 ==> Choix de la couche de fondation
        Ligne 13 et 14 ==> choix de la couche de forme
        Ligne 15 ==> Ici on a le choix avec une liste déroulante qui renvoie sur une autre liste déroulante ect
        Ligne 16 ==> Identique à 15

        Du coup mes lignes 6 à 14 n'ont pas besoin d'avoir de possibilité d'ajout de choix supplémentaire. En revanche, je dois pouvoir insérer en dessous de la ligne 16, une ligne identique à la ligne 16 (ou 15) dans laquelle je pourrais faire des choix différents.

        Mes autres tableaux fonctionnent de la même façon !

        Tableau 2 ==> B18 à K28
        Tableau 3 ==> B30 à K40

        Merci beaucoup pour votre aide!!
        0
        1. Bonjour,

          Désolé hiers j'ai du m'absenter et du coup je m'oiccupe de ça aujourd'hui, j'espère qu'il n'est pas trop tard
          0
      2. Si c'est possible il te faut juste une variable qui mémorise a quelle ligne commence le tableau en question...

        Exemple...

        Imaginons que tous tes tableaux font 5 lignes au départ et que tu as une cellule qui départage chaque tableau

        Tableau 1 : ligne 1 à 5
        Tableau 2 : ligne 7 à 11
        Tableau 3 : ligne 13 à 17

        A chaque fois que tu va cliqué sur un bouton ( a coté de chaque tableau) il faut tu recalcule ce nombre.

        Si tu es dans le premier tableau, pas de problème c'est 1

        Second tableau, tu scrutes la premiere colonne jusqu'a la premiere cellule vide et ensuite tu vérifie que la cellule suivant est bien non vide (il s'agira de la ligne ou démarre ton second tableau)

        Pour le troisième tableau tu fait la meme chause que le second tableau sauf que tu cherche la deuxième colonne non vide.

        Dis moi si j'ai bien compris ton problème et si tu valide j'essai de codé un petit truc...
        Dis moi quelle colonne tu utilises, a partir de la ligne combien? et le nombre de cellule qui sépare chaque tableau
        0
        1. Merci pour vos réponses même si elles ne résolvent pas mon problème. Je fais les insertions en bas des tableaux. J'ai essayé avec Rows("X:X").Insert Shift:=xlDown.
          Le souci c'est que imaginons que le bas de mon premier tableau soit à la ligne 6, mon second à la ligne 12 et mon dernier à la ligne 18.
          Si j'applique Rows("18:18")... par exemple et bien si j'insère en premier lieu une dizaine de lignes dans le premier tableau, mon second et mon troisième s'en retrouvant décalé vers le bas, la macro Rows("18:18") m'ajoutera une ligne là où je ne le souhaite pas. Bref je sais pas si ce que je cherche à faire est possible en fait.
          0
          1. Bonjour,
            Pour le premier tableau, faites vous une insertion par le haut du tableau?
            Pour les autres vous voulez faires de meme?
            0
            1. Utilises :

              Rows("X:X").Insert Shift:=xlDown

              X:X corespondant a la ligne au dessus de celle que tu veux rajouter, sinon mets xlup à la fin

              Exemple :

              Rajouts d'une ligne au dessus de la ligne 5 :
              Rows("5:5").Insert Shift:=xlDown
              0