Dupliquez & incrémenter valeur suite à la dupplication

Bonjour à tous,

Je ne suis pas un expert en VBA, mais j'avoue que c'est un outils vraiment puissant et que j'aimerais le maîtriser !

Je travail sur un fichier au boulot pour automatiser une tâche,

Mais là, je bloque ! Voici mon code :(Fichier en PJ)

6test.xlsx (92.55 Ko)
Sub duplique()
Dim lig As Long, dup As Integer, dec As Integer, pos As Integer, cel
For lig = Cells(Rows.Count, "B").End(xlUp).Row To 1 Step -1
    dup = Cells(lig, "A").Value
    If dup > 1 Then
        Rows(lig + 1).Resize(dup - 1).Insert
        Rows(lig).Resize(dup).FillDown
        cel = Cells(lig, "I").Value
        pos = InStr(cel, " ")
        For dec = 1 To dup - 1
            Cells(lig + dec, "I").Value = Left(cel, pos - 1) & Chr(64 + dec) & Mid(cel, pos)
        Next dec
    End If
Next lig
End Sub

Voilà mon code actuel :  

La colonne A est celle de du nbr de lignes à insérer.  

La colonne B est celle des noms des n° de dossier pour identifier les doublons  

La colonne I correspond au numéro du colis à incrémenter par A,B, C 

Merci de votre aide,

Simon

Bonjour,

Est-il possible de fournir un exemple de ce que vous avez et de ce que vous cherchez à obtenir ?

Par ailleurs, êtes-vous sûr de l'incrémentation des lettres ? C'est pas très pratique et il vaut mieux ne pas dépasser 26...

Cdlt,

Bonjour,

Merci pour votre réponse.

En colonne I c'est un nombre à 6 chiffres qui doit être incrémenter de la manière suivante : 16300A, 16300B, 16300C.

Il ne peut y avoir plus de 10 duplications pour une même ligne donc l'incrémentation ne peut pas dépasser 26.

Aujourd'hui, dans mon fichier, lorsque qu'en A il y a par exemple "2" en valeur, alors mon code duplique cette ligne.

Ce que je souhaite : On a donc 2 lignes, et dans la colonne I, I1 = 16300A et I2 = 16300B

Si vous avez une autre suggestion d'incrémentation, pourquoi pas ! Le problème c'est qu'ave des chiffres, ca peut mener à confusion avec le nombre initial.

Est-ce que je suis clair ?

Bonjour,

Si tu ne souhaites pas dépasser 10 duplications de lignes, pourquoi alors ne pas rester sur 5 chiffres et incrémenter le 6ème entre 0 et 9 ? .. Ca évite l'alphanumérique et tu sais directement si la ligne a été dupliquée ?

Il va falloir renseigner ton fichier test avec quelques données pour avoir quelque chose sous la dent.

Bonne soirée.

Re, Bonjour Ergotamine (tu as bonne mine aujourd'hui ),

@Sicoswag : Par "exemple", j'entendais "fichier exemple". Pourriez-vous juste mettre votre fichier avec les cas possibles et les résultats attendus, en laissant les formules du fichier ?

Cdlt,

Bonjour,

Voici un essai avec un tableau structuré, la colonne A supprimée (car dépendant de la colonne AA) et en considérant qu'il n'y aura pas de formules. Ca semble bien fonctionner mais le code ne gère pas, pour l'instant, les potentiels cas de doublons...

Sub duplique()

Dim tdup()

With ActiveSheet
    t = .Range("Base")
    For i = LBound(t) To UBound(t)
        If t(i, 8) Like "#####?" And t(i, 26) > 1 Then lim = t(i, 26) Else lim = 1
        n = n + lim
        ReDim Preserve tdup(1 To UBound(t, 2), 1 To n)
        L = 0
        For k = LBound(t, 2) To UBound(t, 2)
            For j = n - lim + 1 To n
                tdup(k, j) = t(i, k)
                If k = 8 And t(i, 8) <> "" And t(i, 26) > 0 Then
                    lettre = Chr(Asc(Right(t(i, 8), 1)) + L)
                    Mid(tdup(k, j), 6, 1) = lettre
                    L = L + 1
                ElseIf k = 26 Then
                    If t(i, 8) <> "" And t(i, 26) > 0 Then tdup(k, j) = 1 Else tdup(k, j) = ""
                End If
            Next j
        Next k
    Next i
    .Range("Base").Resize(n, UBound(tdup)) = Application.Transpose(tdup)
End With

End Sub
2duplication.xlsm (79.64 Ko)

Cdlt,

Bonjour et merci à tous pour vos réponses,

Je joins mon fichier en PJ, avec les données du 25 janviers.

Pour répondre dans l'ordre :

@ERGOTAMINE : En colonne "I", c'est une reference numérique comprise entre 6 et 8 chiffres.

Chaque jour, j'extrait de notre plateforme WEB des dossiers avec leurs réfs, et je la croise avec les données de la production (qui sont remplis sur un google sheet - Onglet "DIMENSIONS" dans mon fichier).

J'ai peur, de ne pas réussir à les recroiser si on les incrémentes avec des chiffres, mais je n'ai peut être pas poussé ma réflexion assez loin ?

Par exemple, pour 16000, cela ferait 16001 si 2lignes, mais si jamais j'ai un autre dossier avec pour ref 16001 alors ca prête à confusion ? La probabilité est minime mais.. Elle existe.

Pour le fichier joint, si vous cliquez sur "dupliquer les lignes MULTI-COLIS", vous passez de 6 à 8lignes de données, ca marche bien. Et c'est à ce moment que je souhaiterais que en I6 la valeur soit "35581A" et en I10, il y a l'incrémentation.. Je ne comprends pas trop.

L'idée de cette incrémentation, et de derriere pouvoir appeler les valeurs de l'onglet "DIMENSIONS" car au moment de la duplication, le fichier ne prend que les valeurs via recherche V de la référence de base non incrémenté.

@3GB, merci pour le code ! J'avais insérer la colonne A qui rappeler les valeurs de AA, c'était car en AA la valeur était issu d'une RECHERCHEV.

J'essaye ce code et je reviens vers vous, merci à tous,

Simon

@G3B, je ne comprend pas, le debugage indique "Sub duplique" en surbrillance et indique :

"Erreur de compilation : Variable non définie"

Je suis vraiment perdu, ca fait des jours que je cherches et je n'arrive pas à intégrer la logique de ce VBA, pourtant pas si difficile que ça je pense.

Bonjour,

C'est parce que vous êtes en Option Explicit. Soit vous supprimez la ligne Option Explicit apparaissant en tête de module, soit vous déclarez toutes les variables :

Sub duplique()

Dim tdup(), t, i&, lim&, n&, L&, k&, j&, lettre$

'code...

End Sub

Je crois que je n'en ai pas oublié.

Edit : Attention, ce code nécessite un tableau structuré nommé Base sur la feuille avec le bouton et considère que les codes à incrémenter sont en colonne 8 (H) et les indices d'incrémentation en colonne 26 (Z) ! Faites déjà des essais avec mon fichier.

Cdlt,

Super, merci pour ces explications précises !

Je commence à comprendre, j'ai bien adapté le code : Mais je ne comprend pas cette ligne :

Mid(tdup(k, j), 6, 1) = lettre

Le 6 & le 1 correspondent à quoi ?

Mid(texte, début (caractère de départ), n (longueur)) est une fonction qui renvoie les n caractères d'une chaine texte à partir du caractère début.

Cette fonction est l'équivalent VBA de STXT sur Excel.

Sur VBA, elle fonctionne également en écriture, c'est-à-dire qu'il est possible non seulement d'obtenir une partie de chaine mais également de la modifier directement.

Et ici, lettre est la lettre incrémentée, celle qui va remplacer celle pré-existante.

Sinon, j'ai regardé votre fichier et j'ai l'impression qu'on est quand même loin du compte finalement. Il peut y avoir des codes à moins de 6 caractères. J'ai l'impression qu'on pourrait faire tout le travail en amont sur la feuille 2...

Cdlt,

Merci pour l'explication de Mid

Vous avez totalement raison, mais je m'en suis rendu compte un peu tard..

Je pense en effet que cela serait plus simple directement sur l'ONGLET " Dimensions" :

Cette onglet est rempli par un "copier/coller" journalier, à partir d'un google sheet rempli par l'espace prod.

En cas de Multi-Colis, il pourrait directement incrémenter le n° ref par A, B, C etc manuellement si nécessaire.

Le seul problème c'est que du coup, il n'y aura plus pour excel de répétitions et donc le nombre de duplication de la ligne a effectuer sauf si ce dernier isole les 6 premiers caractères et les compares (sans la lettre).

Je suis preneur afin d'évaluer toute option. Le fichier joint précédemment est celui suite au copier coller, ou aucune macro n'a encore été activé.

Si on récapitule, si on a 2 fois la même ref dans l'onglet "DIMENSIONS", alors il s'agit de 2 colis pour le même destinataire. Sur chaque ligne, il y a les dimensions du colis respectif. C'est valeur doivent être reporté onglet "Extraction" suite à la duplication afin d'être compatible avec mon logiciel d'impression d'étiquettes (1ligne par étiquette).

Je souhaite donc automatiser cela, mais je pense que c'est trop ambitieux avec mes compétences.

J'ai déjà gagner pas mal de temps avec la construction de ce fichier, peut être est-il plus sage de traiter la chose manuellement ?

Merci de votre aide,

Simon

Non, automatiser c'est toujours mieux et en général, ça limite le risque d'erreur humaine.

Mais j'ai du mal à comprendre. Sur l'onglet "DIMENSIONS", les colis étaient déjà dupliqués (il manquait juste la lettre). Ensuite, ce sont par des formules qu'on a obtenu des lignes non dupliquées... C'est ça que je ne comprends pas.

Tout ça parait super complexe pour un problème qui pourrait se régler assez bien sans trop de manipulations dans tous les sens...

Et franchement, oubliez la lettre, il vaut mieux rajouter -1, -2, c'est beaucoup plus simple à comprendre et à coder.

Je suis bien d'accord, vive les machines !

Alors quand la prod rempli ce tableau, ils écrivent plusieurs ligne avec la même REF si il y a plusieurs colis, la "duplication" sur cet onglet est donc "manuelle".

Ex : Dupont à 2 colis, ref 35000. Le tableau sera rempli de la sorte : B1 = 35000 B2 = 35000 . C'est moi qui ai donné ce fonctionnement pour que ce soit compatible avec le fonctionnement du excel, mais c'est peut être une erreur.

C'est dans l'onglet extraction, qui vient dupliquer les données de la plateforme Web en fonction du nombre de colis par destinataire.

Je pense aussi que j'ai mal tourné le problème. Je suis d'avis également de l'énumérer numériquement si le préfixe "-" peut être ajouté à la ref avant l'énumération.

Comment dois-je m'y prendre ?

Donc is je comprends bien, la saisie initiale vient de la prod ? Il faut de toute façon qu'ils saisissent tous les "produits/colis" un par un pour y mettre les dimensions.

Pour moi, ça ne doit pas bouger à moins que vous ayez un outil qui permette de l'automatiser...

Ensuite, on peut tout simplement récupérer ces infos, qui sont donc sur l'onglet "DIMENSIONS", incrémenter seulement le numéro de "colis" et copier le tout dans l'onglet 1, par macro. Il faut la référence avant l'indice pour permettre un tri facile. Si besoin, il est possible d'uniformiser les références, notamment en utilisant la date du jour.

Oui exactement (pour l'onglet dimensions).

Cela ne doit pas bouger, ca fonctionne bien comme cela.

Le truc c'est que dans l'onglet "extraction", j'importe directement les données de notre plateforme dont cette "REF" qui n'est bien sur pas incrémenté et qui ne sait pas combien de colis vont lui être attribué.

Le lien entre ces 2 bases de données se fait actuellement par la REF, mais je ne vois pas comment uniformiser les références sans que cela vienne perturber l'appel des données de l'extraction.

Mais j'y vois plus clair, je ne sais juste pas comment le mettre en place. Je vais prendre la nuit pour y réfléchir et essayer d'organiser ca dans ma tête !

Pour moi, il y a des étapes importantes dans cet ordre chronologique :

- Identifier dans le tableau dimensions les doublons de "REF" afin de déterminer le nombre de colis par REF.

- Dupliquer les lignes dans l'onglet "EXTRACTION" en fonction de ce nombre de colis et en croisant les données par la valeur "REF".

- Attribuer les bonnes dimensions au bon colis (grâce à l'incrémentation). Pour cela, il faut que dans les 2 onglets, cela soit incrémenter de la même manière - Sauf que la REF de l'onglet "Extraction" vient d'une extraction, et donc doit subir également une modification.

Je pense que c'est assez clair, dîtes moi si vous avez encore des zones d'ombres!

J'envoie une nouvelle version du fichier toujours avec ds tableaux structurés et un peu "réorganisé" (je sais que ça peut faire peur mais j'essaie d'enlever tout ce qui me parait superflux pour clarifier les choses de mon point de vue - il faut parfois savoir "détruire" pour mieux reconstruire).

Donc, ce que je comprends, c'est que des données sont importées d'une plateforme. Je me dis qu'il faudrait peut-être un onglet "PLATEFORME" sur lesquelles iront ces données.

On part de l'onglet "DIMENSIONS" en collant les valeurs avec notamment les références indexées. On appelle les valeurs de l'onglet "PLATEFORME" grâce à des formules de type INDEX EQUIV de manière à compléter les cellules de nos lignes avec les références. J'ai l'impression que c'est ce qu'il faut faire ?

Sub Extraction()

t = Range("DIM")

For i = LBound(t) To UBound(t) 'pour chaque ligne
    If t(i, 1) <> "" Then 'si non vide
        n = n + 1 'incrémentation : pour gérer lignes vides et cas tableau vide
        cpt = Application.CountIf(Range("DIM").Resize(i, 1), t(i, 1)) 'compte occurrences de la ref en cours depuis début de la boucle
        num = cpt + Application.CountIf(Range("Base").Columns(24), t(i, 1) & "*") 'num = nb occurrences en cours + nb ref dans Base
        t(n, 1) = t(i, 1) & "-" & num 'ref n vaut ref i avec numero
        For k = 2 To UBound(t, 2) 'pour les autres, on reprend les infos
            t(n, k) = t(i, k)
        Next k
    End If
Next i

If n > 0 Then 'si n > 0
    With Range("Base")
        .Cells(.Rows.Count + 1, 24).Resize(n, UBound(t, 2)) = t 'on colle les données en colonne 24
    End With
    'Range("DIM").ClearContents '<<< on efface les valeurs du tableau DIM
End If

End Sub

Il y a encore le cas des doubles références...

Cdlt,

Bonjour,

Oui, de nouvelles fondations plus clair c'est peut être une bonne chose !

Le fichier travaille bien, le seul soucis c'est que lors de l'incrémentation et de l'insertion de ligne, il ne duplique pas les données des autres colonnes. Je pense qu'un onglet "Importation Plateforme" est très pertinent. Je vais essayer de reconstruire cela.

Il y a t-il un moyen d'appeler les valeurs en fonction de la colonne incrémenté sans tenir compte de l'incrémentation ?

Le cas des doubles références à l'air d'être bien géré par la macro.

Je vais m'y penchais, et je reviens ver vous !

Merci pour tout

Bonjour,

Il ne duplique pas les données des autres colonnes ?

Au cas où, sur la feuille DIMENSIONS, on part des de chaque élément d'un colis donc il n'y a plus de duplication, seulement une incrémentation. On reprend bien les dimensions propres à chaque élément d'un colis.

Oui, je pense qu'il est tout à fait possible de le faire mais il vaut mieux que je vois la présentation avant de l'assurer.

A bientôt,

Cdlt,

Alors j'ai remarqué 2/3 dysfonctionnement avant d'aller plus loin :

Quand on supprime les valeurs du tableau, et qu'on met en marche la macro, les valeurs n'apparaissent pas à la première ligne vide, mais à la suite des précédentes (même si elles ont été supprimées).

Je pense que la solution serait de pouvoir, dans les 2 onglets "EXTRACTION" & "DIMENSIONS", créé une colonne qui comporterait le numéro de REF incrémenter. Ainsi on conserve la REF initiales pour les valeurs autres, et on à l'incrémentation pour les dimensions, qu'en pensez-vous ? Et est-ce possible ?

Rechercher des sujets similaires à "dupliquez incrementer valeur suite dupplication"