XL 2010 [Résolu] Copier/Coller ligne avec conditions et récurrences

Saxophone

XLDnaute Nouveau
Bonjour à toutes et tous :)
Je n'ai pas trouvé de solution sur le forum répondant spécifiquement à un cas comme celui-ci...
Je vous explique la situation :
La colonne A contient un numéro de demande.
Pour chaque numéro de demande, les colonnes B, C et D de la même ligne peuvent contenir des données si l'utilisateur les a remplies.

On a donc par exemple 2 numéros de demande "1" et "2" et des données inscrites par l'utilisateur

A B C D
1 x y z
2 u v

Et dans un autre onglet je souhaiterai que la macro qui s'exécute donne :

A B C D
1 x
1 y
1 z
2 u
2 v

Je le traduirai comme ceci à l'écrit :
Pour chaque numéro de commande de la colonne A :
Si le contenu de la cellule B2 <> "" alors on copie dans l'autre onglet le contenu de A2 et B2
Si le contenu de la cellule C2 <> "" alors on copie dans l'autre onglet le contenu de A2 et C2
Si le contenu de la cellule D2 <> "" alors on copie dans l'autre onglet le contenu de A2 et D2

Je ne vois pas comment gérer la chose en VBA, étant pas bon pour créer des codes et je n'ai rien trouvé correspondant à ça sur internet ou bien je n'ai pas su l'adapter.

Merci beaucoup de votre aide.
 

Modeste

XLDnaute Barbatruc
Bonjour Saxophone,

Le mieux aurait été de joindre un fichier: il y a des évidences pour celui qui connaît son fichier, que ne perçoivent pas ceux qui tentent de répondre. Il faudrait également préciser le volume à traiter: la méthode utilisée ici ne conviendra pas pour de gros volumes.
Fais un clic droit sur l'onglet de la feuil2 > Visualiser le code et colle les lignes ci-dessous dans la fenêtre de code de la feuille:
VB:
Private Sub Worksheet_Activate()
[A1].CurrentRegion.ClearContents
With Feuil1
derlig = .Cells(Rows.Count, 1).End(xlUp).Row
x = 1
For i = 1 To derlig
    For col = 2 To .Cells(i, Columns.Count).End(xlToLeft).Column
        Cells(x, 1) = .Cells(i, 1)
        Cells(x, 2) = .Cells(i, col)
        x = x + 1
    Next col
Next i
End With
End Sub
Le code s'exécutera à chaque activation de la Feuil2


 

Saxophone

XLDnaute Nouveau
Bonjour Modeste,

Merci de ta réponse. Effectivement tu as raison.
Le code fonctionne, je vous joints un fichier.
Je l'ai modifié pour qu'il ne supprime pas un entête que j'ai rajouté.
Le volume serait de maximum 200 demandes, soit potentiellement pour l'onglet feuil 2 : 600 lignes.
Je souhaiterai savoir comment choisir les colonnes qu'il doit "viser" ? Dans le fichier joint, les informations des colonnes Choix 1 et Choix 2 ne doivent pas se retrouver à la suite dans la colonne Data User mais rester dans leurs colonnes respectives avec les informations qu'elles contiennent pour chaque demande.

Merci grandement de l'aide que tu pourras m'apporter !
 

Pièces jointes

  • Illustration besoin.xlsm
    15.8 KB · Affichages: 45

Staple1600

XLDnaute Barbatruc
Bonjour à tous, salut Modeste

Puisque j'ai pondu, je poste ;)
VB:
Sub a()
Dim i&, L&, Z&, X&
L = Range("A" & Rows.Count).End(xlUp).Row
For i = 1 To L
Z = Cells(i, 1).End(xlToRight).Column
Cells(i, 2).Resize(, Z).Copy
X = Feuil2.Cells(Rows.Count, "B").End(xlUp).Row
Feuil2.Cells(X + 1, "B").PasteSpecial Paste:=xlPasteAll, Transpose:=True
Feuil2.Cells(X + 1, 1).Resize(Z - 1).Value = Cells(i, 1).Value
Application.CutCopyMode = False
Next
End Sub
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Non, il ne faut rien déduire de tout cela.
C'est juste que j'ai passé du temps sur ta question.
Et donc pour que cela ne soit pas vain , j'ai posté ma proposition voilà tout.

Maintenant pour savoir si elle fonctionne sur de gros volumes, eh bien il te suffit de tester, non ? ;)

On peut modifier ce que l'on veut dans VBA mais pour le moment je vaque à d'autres occupations.

Je laisse donc la place à Modeste et/ou ses coreligionnaires du forum. ;)
 

Saxophone

XLDnaute Nouveau
Re,
J'ai commenté le code selon comment je pense l'avoir compris ^^
Dites moi si je me trompe..

J'ai tenté de modifié cette ligne ci-dessous afin de spécifier des numéros fixe de colonne afin que les données des colonnes "Choix" ne soient pas inclues dans la colonne "Data User" voir fichier joint... Sans résultat, la boucle utilisant l'incrémentation de col...
Need help svp

VB:
For col = 2 To Feuil1.Cells(i, Columns.Count).End(xlToLeft).Column


VB:
Private Sub Worksheet_Activate()

''[A1].CurrentRegion.ClearContents
'With Feuil1
'compte le nombre de ligne à traiter dans la feuil1 colonne A
derlig = Feuil1.Cells(Rows.Count, 1).End(xlUp).Row
'commence à la ligne 2 pour éviter les entetes
X = 2
'de i=2 donc 2eme ligne à la dernière ligne de la colonne A de la feuil1
For i = 2 To derlig
'de la colonne 2 à la dernière colonne contenant des données, ici 6
    For col = 2 To Feuil1.Cells(i, Columns.Count).End(xlToLeft).Column
'C/C les n° de commande de la feuil1 selon le nombre de données sur la ligne correspond
        Cells(X, 1) = Feuil1.Cells(i, 1)
'C/C les données de la feuil1 de la colonne 2 aux autres colonnes contenant des données
        Cells(X, 2) = Feuil1.Cells(i, col)
        X = X + 1
    Next col
Next i
End Sub
 

Pièces jointes

  • Illustration besoin.xlsm
    18.7 KB · Affichages: 41

Modeste

XLDnaute Barbatruc
Bonsoir Saxophone,
Salut JM :) nice to see you

Les commentaires ajoutés semblent assez corrects (... si je les ai bien compris :rolleyes:)
Par contre je n'ai pas bien compris quel était le résultat attendu? C'est celui qui est illustré en Feuil2 de ton dernier fichier?? Si oui, je me suis perdu entre les explications et le résultat. Si non, peux-tu illustrer ce que la manip devrait donner en feuille2?
Par ailleurs, les colonnes que tu veux "cibler", tu les connais par avance? Si oui, un petit tableau qui contiendrait les n° des colonnes serait une technique. Si ce sont toutes les colonnes impaires à partir de la 3e, on peut s'y prendre autrement ... mais il nous manque des infos
 

Saxophone

XLDnaute Nouveau
Bonsoir Modeste,

Les colonnes à "cibler" dont je parlais sont les colonnes "Data User 1", "Data User 2", "Data User 3".
Je pense que l'encart "Résultat Attendu" dans la feuil2 sera plus parlant qu'un long discours :)
Je te remercie de suivre ce fil Modeste !
 

Pièces jointes

  • Illustration besoin.xlsm
    20.5 KB · Affichages: 46

Staple1600

XLDnaute Barbatruc
Re à tous

Je ne comprends pas la logique au vue du dernier fichier exemple.
Pourquoi Z a pour Choix2 Rond si on se fie à ce qu'on lit en Feuille1 ?
Idem pour W

La logique voudrait que la colonnes Choix1 soit en relation avec la colonne DataUser et Choix2 soit en relation avec la colonne DataUser2, non ?
 

Staple1600

XLDnaute Barbatruc
Re

J'ai bien vu la feuille 2 d'ou mes questions précédentes
Pourquoi Z à Rond en Choix2 alors que quand on regarde la feuille 1 la colonne Choix 2 semble se référer à Y,non ?
Donc j'aurai cru que le résultat attendu serait
1 X Vert
1 Y Rond
1 Z
2 U Jaune
2 V Carré
2 W
etc..
 

Discussions similaires

Statistiques des forums

Discussions
312 149
Messages
2 085 771
Membres
102 970
dernier inscrit
JMaurice