Copier et répéter une donnée en fonction de valeurs

Résolu
EnSabahNur79 Messages postés 3 Statut Membre -  
EnSabahNur79 Messages postés 3 Statut Membre -
Bonjour à tous,

Je suis débutant sur la création de macro excel.
j'aurais besoin de vos lumières car là je sais pas du tout comment faire et je suis bloqué en essayant avec des formules (pas assez flexible et pas assez facile à maintenir).

Dans le fichier joint, j'aimerai travailler sur deux onglets:
- Users rollout : source des données
- GroupConsolidated.csv : cible où copier les données

Il faudrait que la valeur de la colonne B du premier onglet (ex: ARB12345) soit recopiée et répétée dans la colonne A du dernier onglet en fonction des 'X' dans la plage de valeur (S3:AH3) du premier onglet. Si 3 'x', répéter 3 fois la valeur. Si 2 'x", répéter 2 fois la valeur, etc...
En plus de ça, les en-têtes de colonne de cette plage (S3:AH3) où des 'x' sont présents doivent être aussi copiés, mais dans la colonne C du dernier onglet.

Informations additionnelles:
Il faudrait que la macro lise toute la colonne B du premier onglet et s'arrête quand il n'y a plus de valeur (mais bon j'imagine que vous vous en doutiez déjà).
La plage (S3:AH3) pourrait varier. Elle commencera toujours à la colonne S mais pourrait se terminer avant ou après la colonne AH.

Je vous joins le fichier en question avec deux exemples.

https://www.cjoint.com/c/FAok5qmHGvh

J'espère avoir été suffisamment clair.

Merci d'avance pour votre aide.

Antoine
A voir également:

2 réponses

via55 Messages postés 14730 Statut Membre 2 749
 
Bonjour

Voilà la macro à mettre dans un module (ALT+F11 pour ouvrir Editeur VBA puis Insertion - Module - copier coller-coller la macro dans la page et fermer éditeur)
Sub transfert()
a = "Users Rollout"
b = "GroupConsolidated.csv"
With Sheets(a)
Dim Ligne As Long
'dernière ligne remplie 1ere feuille
Ligne = .Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row
Dim DernCol As Integer
' derniere colonne remplie 1ere feuille
DernCol = .Cells(2, .Cells.Columns.Count).End(xlToLeft).Column
' boucle sur les colonnes depuis S jusqu'à la dernière
For n = 19 To DernCol
' si titre en ligne 2 commence par Group on relève le n° de colonne
' le dernier n° relevé sera donc celui de la dernière colonne pouvant avoir un x
If Left(.Cells(2, n).Value, 5) = "Group" Then Col = n
Next n
End With
'ligne de titre dans 2eme feuille
lg = 2
'Boucle sur lignes de 1ere feuille de la 3° à dernière
For x = 3 To Ligne
' Boucle sur les colonnes Group (de S à la dernière)
For y = 19 To Col
' Si cellule contient x
If Sheets(a).Cells(x, y) = "x" Then
' on incremente la ligne de recopie de 1
lg = lg + 1
' copie des données dans feuille 2 en A et C
With Sheets(b)
Range("A" & lg) = Sheets(a).Range("B" & x)
Range("C" & lg) = Sheets(a).Cells(2, y)
End With
End If
Next y
Next x
End Sub


La macro peut ensuite être lancée à partir de n'importe quelle feuille Depuis Developpeur dans le Ruban puis Macros - Selectionner la macro transfert et Exécuter

Cdlmnt
Via

"L'imagination est plus importante que le savoir."    A. Einstein
0
EnSabahNur79 Messages postés 3 Statut Membre
 
Bonjour Via,

Merci beaucoup pour ton retour rapide, tu m'enlèves un grosse épine du pied.

La macro fonctionne très bien, mais il y a juste un hic.
Les valeurs ne sont pas copiées dans la feuille "GroupConsolidated.csv" mais dans la feuille originale "Users Rollout".
J'ai essayé de corriger moi-même mais je ne trouve pas d'où cela peut venir.


Merci de ton aide
0
EnSabahNur79 Messages postés 3 Statut Membre
 
My bad, ça fonctionne très bien.
Il fallait juste que j'active mon cerveau et que je me positionne sur la bonne feuille.

Encore merci pour tout
@+
0