VBA Dupliquer ligne si condition + suppression déplacement

Bonjour,

Je débute dans les macros VBA, je n'arrive pas à trouver le code permettant de faire la manipulation souhaité.

J'ai une base de données ("data_A") avec un nombre de ligne non déterminé (peut augmenter ou diminuer)

Dans cette base de donnée, on retrouve dans la colonne D des caractères où celui-ci font doivent faire 10 caractères ou 11 (si le premier caractère est un chiffre)

Quelques cellules sont supérieurs à 10 ou 11 caractères.

Mon objectif est d'insérer une ligne en dessous de chaque ligne où la colonne D contient plus de 10 ou 11 caractères

Y recopier les colonnes A,B,C, E,F,G et H  et insérer les caractères supérieur à 10 ou 11 dans la nouvelle ligne et supprimer tous les caractères supérieur à 10 ou 11 de la ligne d'origine

Exemple grossier (fait à la mano):

En haut, un exemple du tableau que j'ai actuellement et en bas, ce que j'aimerais avoir avec une macro.

A savoir que la colonne D peut avoir jusqu'à 140 caractères, donc l'ajout de 14 lignes d'affilé avec le même principe.

Avez-vous une idée de comment m'y prendre ?

En vous remerciant par avance,


Windows / Firefox 91.0

11 réponses

  1. Merci pour ce retour super rapide !

    J'ai retranscris selon mon besoin.

    Après plusieurs essais, j'ai l'erreur 91 qui apparait , soit Variable d'objet non défini mais je ne vois pas où est le soucis dans le code... sur la 1ère ligne

    Cela arrive lorsque je double la ligne : Sheets("Feuil2").Range("A" & x) = Sheets("Feuil1").Range("A" & n)

    J'ai plusieurs colonne a recopier.

    Par contre, cela fonctionne lorsque je fais uniquement le remplacement sur la colonne D et la colonne B par exemple

    Faut-il créer un "autre n" pour recopier les autres colonnes ?

    0
  2. Postes ton fichier avec sa macro qu'on puisse voir ce qui provoque l'erreur


    0
    1. J'ai tout fermé et recommencé au calme et maintenant cela fonctionne... Je ne sais pas ce qu'il s'est passé.

      J'ai refait des essais, la macro fonctionne et le problème n'est pas ré-apparu.

      Dites-moi s'il y a une erreur quand même, sait-on jamais !

      merci à vous !

      For n = 1 To Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
      lon = Len(Sheets("dataA").Range("D" & n))
      texte = Sheets("dataA").Range("D" & n)
      nf = lon / 10
      For t = 1 To nf
      nbc = 10
      If Val(Left(Sheets("dataA").Range("D" & n), 1)) > 0 And t = 9 Then nbc = 11
      a = Left(texte, nbc)
      texte = Right(texte, Len(texte) - nbc)
      x = x + 1
      Sheets("dataB").Range("A" & x) = Sheets("dataA").Range("A" & n)
      Sheets("dataB").Range("B" & x) = Sheets("dataA").Range("B" & n)
      Sheets("dataB").Range("C" & x) = Sheets("dataA").Range("C" & n)
      Sheets("dataB").Range("D" & x) = a
      
      Next t
      Next n
      0
      1. Bonjour,

        Je me retrouve à devoir dupliquer également sur la colonne C où si on retrouve un "+" dans la cellule il faut ajouter une ligne. il peut y avoir plusieurs + dans la même cellule.

        Exemple :

        Ligne 1 : A+B+C

        Résultat souhaité

        Ligne 1 : A
        Ligne 2 : B
        Ligne 3 : C

        J'aimerais l'ajouter au code actuel cité plus haut.

        Merci pour votre aide.

        0
        1. Bonjour,

          Merci pour la partie du code ! Celui-ci ne recopie pas le reste de la ligne d'où le faite que je souhaitais l'ajouter au code précédent.

          Je n'arrive pas très bien à comprendre comment le code fonctionne d'ailleurs pour essayer de l'adapter au précédent ou de refaire la même action de duplication sur les nouvelles lignes.

          0
          1. Je te remets ici le code avec des commentaires

            Sub decomposer()
            'Boucle sur les lignes remplies de la feuille
            For n = 1 To Columns(3).Find("*", , , , xlByColumns, xlPrevious).Row + 1000
            'Compte le nombre de + (on fait la différence entre la longueur de la chaîne complète et la longueur de la chaîne dont on remplace le s+ par du vie)
            a = Len(Range("C" & n)) - Len(WorksheetFunction.Substitute(Range("C" & n), "+", ""))
            'si a est un nombre positif
                If a > 0 Then
                ' boucle le nombre de fois qu'il y a de +
                For t = 1 To a
                'sélectionne la ligne en dessous
                Range("C" & n + 1).Select
                'insere une ligne
                Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
                Next
                ' découpe la chaîne de caractères en fonction des + et place les items dans un tableau
                    tablo = Split(Range("C" & n), "+")
                    'boucle sur les items découpés
                    For g = 0 To UBound(tablo)
                    'inscrit l'item dans la bonne cellule
                    Range("C" & n + g) = tablo(g)
                    Next
                
                End If
            Next
            End Sub

            0
            1. Bonjour,

              Merci pour ces explications.

              J'ai essayé de réaliser ce code, celui-ci rajoute bien une ligne avec la valeur séparant + mais ne reporte pas le reste des données des autres colonnes de la ligne au-dessus de celle-ci.

              Quelle est mon erreur ?

              Sheets("dataA").Select
              For n = 1 To Columns(8).Find("*", , , , xlByColumns, xlPrevious).Row + 1000
              a = Len(Sheets("dataA").Range("G" & n)) - Len(WorksheetFunction.Substitute(Range("G" & n), "+", ""))
                  If a > 0 Then
                  For t = 1 To a
                  Range("G" & n + 1).Select
                  Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
                  Next
                      tablo = Split(Range("G" & n), "+")
                      For g = 0 To UBound(tablo)
                      Range("G" & n + g) = tablo(g)
                      x = x + 1
                      Sheets("dataB").Range("A" & x) = Sheets("dataA").Range("A" & n)
                      Sheets("dataB").Range("B" & x) = Sheets("dataA").Range("B" & n)
                      Sheets("dataB").Range("C" & x) = Sheets("dataA").Range("C" & n)
                      Sheets("dataB").Range("D" & x) = a
                      Sheets("dataB").Range("E" & x) = Sheets("dataA").Range("E" & n)
                      Sheets("dataB").Range("F" & x) = Sheets("dataA").Range("F" & n)
                      Sheets("dataB").Range("G" & x) = Sheets("dataA").Range("G" & n)
                      Sheets("dataB").Range("H" & x) = Sheets("dataA").Range("H" & n)
                      Next
                  End If
              Next
              
              End Sub
              0
              1. Contributeur

                L'indentation de ton code n'est pas conforme, cela n'aide pas à le comprendre.

                Connais-tu la technique qui permet d'exécuter le code pas à pas, afin de suivre ce qu'il fait?

                0
            2. Bonjour

              Envoie moi le fichier dans lequel tu as inséré cette macro que je regarde et puisse faire des essais


              0