XL 2019 Boucle For Each

Pieerre69

XLDnaute Junior
Bonjour,

Je cherche à éclater et dupliquer des lignes à l'aide d'une boucle For Each.
En français voilà ce que devrait faire le code:

Pour chaque numéro._OF différent faire
----Pour chaque numéro_PF différent faire
-------- écrire X fois la ligne contenant y un numéro_PF
-------- pour chaque ligne, concaténer numéro._OF ; numéro_PF ; incrément

Les numéros OF, PF et la quantité X sont extraites d'un logiciel et sont revenus sous la forme :

[numOF] / [numPF] / [qté d'un PF dans un OF]

Donc on a par exemple :

006042 / 007108 / 5
006042 / 002601 / 10

J'aurais voulu, via des boucles For Each, avoir une transformation des données sous la forme :

006042 / 007108 / 006042-007108-001
006042 / 007108 / 006042-007108-002
[..]
006042 / 002601 / 006042-002601-009
006042 / 002601 / 006042-002601-010

Là où je bloque, c'est pour arriver à faire différencier les différents numéros d'OF à la boucle ForEach..
Je n'ai jamais utilisé ces boucles, donc je ne sais même pas comment elles fonctionnent vraiment. Peut-on récupérer des coordonnées pour chaque tour de boucle ? Est-ce qu'au moins la fonction ForEach est capable de différencier les différentes valeurs entres elles ?

Merci d'avance pour vos conseils
 
Solution
Re,
En PJ un essai avec :
VB:
Sub Worksheet_Activate()
Application.ScreenUpdating = False
Dim Sh, DL%, X%, L%, N%
[A2:C1000].ClearContents                ' Effacement matrice sortie
Set Sh = Sheets("data avant traitement")
DL = Sh.Range("A65500").End(xlUp).Row   ' Calcul nb lignes matrice entrée
X = 2                                   ' Index écriture
For L = 2 To DL                         ' Pour chaque ligne matrice entrée
    For N = 1 To Sh.Cells(L, "C")       ' Nombre de fois à répéter
        numOF = Sh.Cells(L, "A"): numPF = Sh.Cells(L, "B")
        Cells(X, "A") = numOF            ' Copie NumOF
        Cells(X, "B") = numPF            ' Copie NumPF
        Cells(X, "C") = numOF & numPF & Format(N, "000")    ' Concaténation + N°...

Pieerre69

XLDnaute Junior
Bonjour

Oups pardon, le voilà.
Il n'y a aucun code pour le moment, j'essayais déjà de le mettre sur papier avant de commencer à le taper, mais je suis déjà bloqué ^^

J'ai mis en revanche les données d'entrées et ce que je souhaite en sortie
 

Pièces jointes

  • Classeur1.xlsx
    10 KB · Affichages: 8

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
En PJ un essai avec :
VB:
Sub Worksheet_Activate()
Application.ScreenUpdating = False
Dim Sh, DL%, X%, L%, N%
[A2:C1000].ClearContents                ' Effacement matrice sortie
Set Sh = Sheets("data avant traitement")
DL = Sh.Range("A65500").End(xlUp).Row   ' Calcul nb lignes matrice entrée
X = 2                                   ' Index écriture
For L = 2 To DL                         ' Pour chaque ligne matrice entrée
    For N = 1 To Sh.Cells(L, "C")       ' Nombre de fois à répéter
        numOF = Sh.Cells(L, "A"): numPF = Sh.Cells(L, "B")
        Cells(X, "A") = numOF            ' Copie NumOF
        Cells(X, "B") = numPF            ' Copie NumPF
        Cells(X, "C") = numOF & numPF & Format(N, "000")    ' Concaténation + N°
        X = X + 1
    Next N
Next L
End Sub
La macro est automatique et s'exécute lorsque la feuille résultat souhaité est sélectionnée.
 

Pièces jointes

  • Classeur1 (28).xlsm
    16.4 KB · Affichages: 5

Pieerre69

XLDnaute Junior
Modifiez une valeur dans la feuille "data avant traitement", par ex 20 en C2, et vérifiez le résultat;
Car je ne vois pas comment la macro pourrait ne pas s'exécuter.
Mais si vous ne modifiez rien alors ça va trop vite pour voir une différence.

Effectivement ça marche, j'avais pourtant fait la même manip sans résultat.
Bon le plus important c'est que ça corresponde à ce que je voulais, merci pour l'aide !
 

Discussions similaires

Réponses
3
Affichages
446

Statistiques des forums

Discussions
315 093
Messages
2 116 126
Membres
112 666
dernier inscrit
Coco0505