VBA Dupliquer ligne si condition + suppression déplacement

ChristelleMaug Messages postés 11 Statut Membre -  
via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   -

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. ChristelleMaug Messages postés 11 Statut Membre
     

    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. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

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


    0
  3. ChristelleMaug Messages postés 11 Statut Membre
     

    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
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    Non tout est correct

    Bonne suite


    0
  6. ChristelleMaug Messages postés 11 Statut Membre
     

    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
  7. ChristelleMaug Messages postés 11 Statut Membre
     

    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
  8. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    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
  9. ChristelleMaug Messages postés 11 Statut Membre
     

    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      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
  10. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    Bonjour

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


    0