Bienvenue sur les forums conseil & création · S'enregistrer

Se connecter automatiquement

Forums » Tableurs et logiciels de gestion (Money, Excel, Open Office...) » [Résolu] tri de donnée et envois vers feuille · Envoyer le lien

Par fred_ecai, le 21 Déc 2009, 16:19 Revenir en haut de page Répondre en citant

Bonjour,

je suis un tout nouveau débutant en macro et je ne connais que le minimum Embarassed , alors je vais faire simple.

Voilà, je souhaite faire un tri de donnée en fonction d'une colonne "catégorie" (jusque la la macro est facile !!!) . je souhaiterais ensuite faire en sorte que les lignes contenant le mot "usinée" dans la colonne "catégorie" soient sélectionnées pour être copièes ligne 6 de ma feuille "usinée" que les lignes contenant "commerce" dans la colonne "catégorie" soient sélectionnées pour être copier poller ligne 6 de ma feuille "commerce" et ainsi de suite pour 7 types de catégorie.
Dun projet à l'autre la quantité de pièce commerce ou usinée varient donc je ne peux pas dire dans ma macro "selectionne ligne 2 à 12 pour copier coller"
je ne sais pas si j'ai été bien clair... en tout cas je reste a dispo pour plus de précision... Confused

merci d'avance à ceux qui m'aideront.
Wink Wink
Par Horny, le 23 Déc 2009, 17:34 Revenir en haut de page Répondre en citant

Salut,

Bon, c'est un peu confus, mais en gros, si j'ai bien compris, tu as des lignes avec un mot-clé dans la colonne catégorie qui t'indique dans quelle feuille tu veux copier ces lignes (en fait, les extraire, si j'ai bien tout compris).

Est-ce qu'il ne vaudrait pas mieux, dans ce cas là, faire une boucle sur tes lignes, repérer le contenu de la colonne catégorie pour chaque, et copier/coller la ligne correspondante dans la feuille du même nom que ce qui est écrit dans catégorie ?

@+++
Par fred_ecai, le 24 Déc 2009, 09:02 Revenir en haut de page Répondre en citant

Salut et merci...
en fait vu que c'était assez urgent, j'ai testé plusieurs petites choses et certainnes seront a améliorer par la suite !!!

voici un bout de code que j'ai commencé d'écrire, si jamais d'autre personne galère aussi...

le but c'était de créer une boucle qui viennent identifier les lignes contenant assemblage en colonne G et qui sélectionne des cellules non contigues. (la j'ai pas su faire...!)
j'ai donc fait une boucle qui vient activer une cellule, regarde le mot, l'identifie selectionne un cellule la copie... et ainsi de suite pour les autres cellule et les autres termes... Rolling Eyes

ce qui donne...


Range("G1").Activate
While ActiveCell.Value <> Empty
'assemblage
If Cells(ActiveCell.Row, 7).Value = "Assemblage" Then
Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, 2)).Select
Selection.Copy
Sheets("Assemblage").Activate
Range("A30000").End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues
Sheets("Sheet1").Activate
Cells(ActiveCell.Row, 3).Select
Selection.Copy
Sheets("Assemblage").Activate
Range("C30000").End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues
Sheets("Sheet1").Activate
Cells(ActiveCell.Row, 5).Select
Selection.Copy
Sheets("Assemblage").Activate
Range("N30000").End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Sheets("Sheet1").Activate
Cells(ActiveCell.Row, 7).Activate
End If
'Mécano-Soudure
If Cells(ActiveCell.Row, 7).Value = "Mécano-Soudure" Then
Cells(ActiveCell.Row, 1).Select
Selection.Copy
Sheets("Mécano-Soudure").Activate
Range("A30000").End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues
Sheets("Sheet1").Activate
End If
ActiveCell.Offset(1, 0).Activate
Wend

...ça vaut ce que ça vaut... mais ça marche
Je suis prenneur pour d'autre améliorations possible...
finaement, j'ai tester le VB... et ç'est pas si pire !!!!
Razz
Par Horny, le 24 Déc 2009, 09:27 Revenir en haut de page Répondre en citant

Salut,

Si la macro marche, c'est le principal !

Après, effectivement, il y a possibilité de réécrire le code pour qu'il soit plus lisible (le jour où tu devra faire une modification, par exemple). Par exemple, plutôt que de faire des if truc = "Assemblage"...end if ; if truc = "Mécano-Bazar"...end if, l'utilisation de elseif ou de select case te permettrait plus facilement de rajouter/supprimer des catégories par la suite:

Code:

If truc = "Assemblage" Then
     'assemblage
     ...
ElseIf truc = "Mécano-bazar" Then
    'Mécano-bazar
    ...
ElseIf ... Then
    ...
End if


ou par Select Case (mon préféré dans un cas comme le tiens, mais c'est subjectif Wink ):

Code:

Select Case Truc
    Case Is = "Assemblage"
    ...

    Case Is = "Mécano-bazar"
    ...

    Case Else    'pour gérer un cas autre, qui ne serait pas pris en charge
    ...

End Select



Tu peux également grouper certaines lignes, par exemple, quand tu as:

Code:

Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, 2)).Select
Selection.Copy


Tu peux le remplacer en une ligne:

Code:

Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, 2)).Copy


En effet, dans VBA, tu n'as quasiment jamais besoin de sélectionner des cellules (même pour la fonction Copy/Paste, il suffit que la cellule soit activée... or, si un utilisateur ne peut activer une cellule sans la sélectionner, en VBA c'est possible, ce qui peut éviter certains "clignotements" lorsque la macro est exécutée).

Encore une fois, si la macro fonctionne en l'état, et qu'il y a peu de chances que tu soit amené à la modifier par la suite, pas la peine de se prendre la tête dessus pendant des heures Wink

@+++
Par fred_ecai, le 24 Déc 2009, 09:36 Revenir en haut de page Répondre en citant

oui c'est le principal...

j'ai essayer de faire :

Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, 2)).Copy
mais ça ne marche plus dés que je rentre une 3eme cellule, c'est pas normal ???

enfin bref, c'était pour me servir dans l'urgence, donc j'ai fait au plus simple...
c'est un code qui va étre amené a être modifier et améliorer sous peu... j'ai donc pas fini d'étre sur le forum...

Merci encore pour les infos de tous sur d'autre post...
Par fred_ecai, le 24 Déc 2009, 09:37 Revenir en haut de page Répondre en citant

on peut pas passer le post en mode "résolu"?
Par Horny, le 24 Déc 2009, 10:24 Revenir en haut de page Répondre en citant

Citation:

j'ai essayer de faire :

Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, 2)).Copy
mais ça ne marche plus dés que je rentre une 3eme cellule, c'est pas normal ???


Si, c'est normal... Range() attend une plage de cellule, comme par exemple A1:D4. Mais tu ne peux pas demander par exemple la plage A1:C2:D4... Il faut passer par les unions de plage, ce qui n'est pas très pratique par VBA (alors que c'est enfantin dans Excel, en maintenant ctrl enfoncé et en sélectionnant les plages/cellules).

@+++

Forums » Tableurs et logiciels de gestion (Money, Excel, Open Office...) » [Résolu] tri de donnée et envois vers feuille · Envoyer le lien