Se connecter avec
S'enregistrer | Connectez-vous

Créer une macro spéciale dans Excel

Dernière réponse : dans Programmation

Bonjour,

Voilà j'ai besoin de votre aide pour créer une macro spéciale.

Je vous explique. Chaque mercredi matin, je vais chercher un document sur internet pour mon travail.
Il comporte toujours les mêmes titres de colonnes et essentiellement les mêmes données. Mon problème survient parce que j'ai besoin que la macro choisisse des lignes vide dans certaines colonnes et non seulement la sélection que je fais lors de l'enregistrement de la macro. J'ai essayé d'insérer une image pour vous montrer mais, il semble que ça ne fonctionne pas pour la coller ici (ou je ne sais pas comment faire autrement que ctrl+v! :??:  )

Je vous explique donc ce que je dois faire, que j'aimerais automatiser:

Je crée 2 nouveau onglets que je nomme H et S.
Je sélection le rapport complet et je le copie/colle dans la feuille S.
Dans la feuille S, je supprime les lignes 1 à 3.
Je fais un tri par Supplier Style afin de supprimer toutes les lignes sans Supplier Style.
Je coupe/colle les styles 9-19-22-23 et 25 dans la feuille H.
À nouveau dans la feuille S, je fais un tri par Activity Type afin de supprimer toutes les lignes san Activity Type.
J'insère quelques lignes entre les Demand et les Replenishment Order car on ne veux pas ces derniers (mais on ne veut pas les supprimer non plus.)
Je sélectionne toutes les des Demand et Customer Order (ils ont un Activity Type) et je fais un tri par Dock Date.
Puis j'insère 4 lignes pour diviser les semaines (du dimanche au lundi) de la semaine courante et les 3 prochaines et ainsi faire le total de chaque semaine.

On refait la même chose avec la feuille H.

Bon je sais que ça ne semble pas clair :cry:  , mais en le faisant pas à pas, on comprend mieux. Là mon problème c'est que je ne sais pas comment vous mettre des images ou le fichier en entier ici. Alors bref, si quelqu'un veux bien m'aider écrivez moi à carolyne0105..at..gmail.com et je vous enverrai le fichier. Svp Svp :ange: 

Quand je fais moi même la macro et que je supprime les lignes sans supplier style ou activity type, le système enregistre seulement les lignes que je supprime ... et non le fait qu'elle soit vide dans cette colonne spécifique.

Merci beaucoup! :hello:  J'attend vos réponses avec impatience. Au travail, on m'a répondu que ce n'était pas une priorité. :non: 

Autres pages sur : creer macro speciale excel

Lassé par la pub ? Créez un compte

l'enregistreur de macro est une base de travail dans ton cas (enfin, dans tous les cas).
Il faut allez nettoyer son code (bha oui, il est pas toujours optimisé (les .Select en autres) et le modifier pour qu'il fasse exactement ce que tu veux.

pour mettre un fichier expemple a disposition, utilise par exemple des service comme rapidshare ...
Expert Programmation

(J'ai supprimé le @ de ton adresse mail, histoire que tu ne te fasses pas spammer.)

Il ne me semble pas que ce soit bien compliqué. Les conseils de KangOl sont avisés : utilise l'enregistreur de macro. Juste une précision, ce que tu appelles un tri est en fait un filtre. Je me trompe ?

Plutôt que ton fichier et/ou des copies d'écrans, publie le code de ta macro, on l'optimisera ensemble.

Bonjour,

Merci pour vos conseils! En fait je ne sais pas s'il y a vraiment une différence, mais bon j'utilise dans Excel "données""trier" et là je choisi par quoi je veux trier.

Alors comme je disais précédemment, mon problème c'est que la macro enregistre le fait que je supprime les cellules X à Z au lieu du fait qu'elle soient vide lors des tri par Supplier Style, Activity Type et Dock Date. Le système voit seulement Rows("1049:1109").select

Bon je vous laisse m'aider!

Voici le code de ma macro.
(Comme je n'y connais rien, si vous la modifier, pouvez vous svp la réinscrire ici au complet?Comme ça je n'aurai qu'à copier/coller. merci!)


  1. Sub MacroTestReport()
  2. '
  3. ' MacroTestReport Macro
  4. ' Macro enregistrée le 2007-08-06 par CAROLYNE0105
  5. '
  6. '
  7. Sheets("Over Under Report").Select
  8. Sheets.Add
  9. Sheets("Over Under Report").Select
  10. Sheets.Add
  11. Sheets("Feuil1").Select
  12. Sheets("Feuil1").Name = "H"
  13. Sheets("Feuil2").Select
  14. Sheets("Feuil2").Name = "S"
  15. Sheets("Over Under Report").Select
  16. Cells.Select
  17. Selection.Copy
  18. Sheets("S").Select
  19. ActiveSheet.Paste
  20. Rows("1:3").Select
  21. Application.CutCopyMode = False
  22. Selection.Delete Shift:=xlUp
  23. Cells.Select
  24. Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
  25. OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  26. ActiveWindow.ScrollRow = 2139
  27. Rows("1639:2170").Select
  28. Range("A2170").Activate
  29. Selection.Delete Shift:=xlUp
  30. Rows("1639:1639").Select
  31. ActiveWindow.SmallScroll Down:=-60
  32. Rows("1564:1577").Select
  33. Range("A1577").Activate
  34. Selection.Cut
  35. Sheets("H").Select
  36. Range("A2").Select
  37. ActiveSheet.Paste
  38. Range("A16").Select
  39. Sheets("S").Select
  40. Selection.Delete Shift:=xlUp
  41. ActiveWindow.SmallScroll Down:=-66
  42. Rows("1478:1513").Select
  43. Range("A1513").Activate
  44. Selection.Cut
  45. Sheets("H").Select
  46. Selection.Insert Shift:=xlDown
  47. ActiveWindow.SmallScroll Down:=30
  48. Range("A52").Select
  49. Sheets("S").Select
  50. Selection.Delete Shift:=xlUp
  51. ActiveWindow.SmallScroll Down:=-381
  52. Rows("1049:1109").Select
  53. Range("A1109").Activate
  54. Selection.Cut
  55. Sheets("H").Select
  56. Selection.Insert Shift:=xlDown
  57. ActiveWindow.SmallScroll Down:=54
  58. Range("A113").Select
  59. Sheets("S").Select
  60. Selection.Delete Shift:=xlUp
  61. ActiveWindow.SmallScroll Down:=-738
  62. Rows("230:314").Select
  63. Range("A314").Activate
  64. Selection.Cut
  65. Sheets("H").Select
  66. Selection.Insert Shift:=xlDown
  67. Sheets("S").Select
  68. Selection.Delete Shift:=xlUp
  69. ActiveWindow.ScrollRow = 1
  70. Rows("1:1").Select
  71. Selection.Copy
  72. Sheets("H").Select
  73. ActiveWindow.SmallScroll Down:=-99
  74. Rows("1:1").Select
  75. ActiveSheet.Paste
  76. Range("A1").Select
  77. Sheets("S").Select
  78. Cells.Select
  79. Application.CutCopyMode = False
  80. Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlGuess, _
  81. OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  82. Sheets("H").Select
  83. Cells.Select
  84. Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlGuess, _
  85. OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  86. Sheets("S").Select
  87. ActiveWindow.ScrollRow = 2140
  88. ActiveWindow.SmallScroll Down:=-726
  89. Rows("1383:1443").Select
  90. Range("A1443").Activate
  91. Selection.Delete Shift:=xlUp
  92. Sheets("H").Select
  93. ActiveWindow.ScrollRow = 170
  94. ActiveWindow.SmallScroll Down:=6
  95. Rows("176:198").Select
  96. Range("A198").Activate
  97. Selection.Delete Shift:=xlUp
  98. ActiveWindow.SmallScroll Down:=-45
  99. Rows("137:137").Select
  100. Selection.Insert Shift:=xlDown
  101. With Selection.Interior
  102. .ColorIndex = 1
  103. .Pattern = xlSolid
  104. End With
  105. Sheets("S").Select
  106. ActiveWindow.SmallScroll Down:=-225
  107. Rows("1161:1161").Select
  108. Selection.Insert Shift:=xlDown
  109. With Selection.Interior
  110. .ColorIndex = 1
  111. .Pattern = xlSolid
  112. End With
  113. Rows("1:1160").Select
  114. Range("A1160").Activate
  115. Selection.Sort Key1:=Range("G2"), Order1:=xlAscending, Header:=xlGuess, _
  116. OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  117. Sheets("H").Select
  118. Rows("1:136").Select
  119. Range("A136").Activate
  120. Selection.Sort Key1:=Range("G2"), Order1:=xlAscending, Header:=xlGuess, _
  121. OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  122. ActiveWindow.SmallScroll Down:=-3
  123. ActiveWindow.ScrollRow = 1
  124. Columns("L:L").Select
  125. With Selection.Interior
  126. .ColorIndex = 6
  127. .Pattern = xlSolid
  128. End With
  129. Columns("G:G").Select
  130. With Selection.Interior
  131. .ColorIndex = 6
  132. .Pattern = xlSolid
  133. End With
  134. Sheets("S").Select
  135. ActiveWindow.ScrollRow = 1
  136. Columns("G:G").Select
  137. With Selection.Interior
  138. .ColorIndex = 6
  139. .Pattern = xlSolid
  140. End With
  141. ActiveWindow.SmallScroll ToRight:=3
  142. Columns("L:L").Select
  143. With Selection.Interior
  144. .ColorIndex = 6
  145. .Pattern = xlSolid
  146. End With
  147. End Sub
Expert Programmation

Citation :
(Comme je n'y connais rien, si vous la modifier, pouvez vous svp la réinscrire ici au complet?Comme ça je n'aurai qu'à copier/coller. merci!)
Bah voyons. Et puis cent balles et un Mars.

Relis les règles : nous ne sommes pas une société de services en ingénieurie informatique.

Passons.

Ce code est horrible. (Digne de l'enregistreur de macro, quoi.)
Mais surtout il est trop long.

Et surtout, il n'est pas du tout adapté dans un cas général.
Il faut tout refaire et pas à pas.

Je commence :
Etape 1 : Créer les feuillles S et H.
  1. Dim nouvelle_feuille As Worksheet
  2.  
  3. Set nouvelle_feuille = Worksheets.Add
  4. nouvelle_feuille.Name = "H"
  5. Set nouvelle_feuille = Worksheets.Add
  6. nouvelle_feuille.Name = "S"
  7. Set nouvelle_feuille = Nothing


Etape 2:
Citation :
Je sélection le rapport complet et je le copie/colle dans la feuille S. / Dans la feuille S, je supprime les lignes 1 à 3.

Mais non. Dis ce que tu veux faire, pas ce que tu fais. En fait, tu veux copier les lignes 4 à n de "Over Under Report" vers S :
  1. Sheets("Feuil1").Range("4:65536").Copy Destination:=Sheets("Feuil2").Cells


Etape 3 :
Citation :
Je fais un tri par Supplier Style afin de supprimer toutes les lignes sans Supplier Style.

Ok, c'est un tri :
  1. Sheets("S").Cells.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
et une suppression :
  1. Rows("1639:2170" ).Select
  2. Range("A2170" ).Activate
  3. Selection.Delete Shift:=xlUp
M'enfin, c'est là que je ne comprends pas. Si tu ne veux pas les supprimer, pourquoi les supprimes-tu ?

L'étape 3 est correcte. Je veux faire le tri et supprimer les lignes sans Activity Type.

Ce que je comprend du code décrit c'est qu'il supprimera les lignes 1639 à 2170.
Mon problème c'est que la semaine suivante ce ne sera peut-être pas juste ces lignes là qui seront sans Activity Type... vous me suivez? La quantité de lignes sans Activity Type (ou Supplier Style) est variable.

Et puis sinon c'est l'étape suivante que je ne veux pas supprimer des lignes; celles de Replenishment Order. C'est pourquoi j'insère une ligne entre les Replenishment Order et Demand.

Mais même si ça n'allait pas plus loin que d'insérer une ligne noire entre les RO et les demand... mon travail serait déjà tellement facilité. Vraiment! C'est formidable ce que vous faites ici.

Merci

Expert Programmation

Mouais :/ 


Je te relis et je me dis :
Et si tu parcourrais les lignes de "Over Under Report" une par une et que pour chacune tu vérifiais si ActivityTruc ouy SupplierMachin correspond ?

  1. Dim H As Worksheet
  2. Dim ligneH As Long
  3.  
  4. ligneH = 1
  5. Set H = Worksheets.Add
  6. H.Name = "H"
  7.  
  8. For Each ligne In Worksheets("Over Under Report").Range("4:65535").Rows
  9. If ligne.Cells(1, 1).Value = "ActivityTruc" And ligne.Cells(1, 5).Value = "SupplierMachin" Then
  10. ligne.Copy Destination = H.Rows(ligneH)
  11. ligneH = ligneH + 1
  12. End If
  13. Next

Ah d'accord je comprend là.

Il faudrait avoir un moyen pour que je puisse vous montrer le document de départ et ce à quoi j'arrive à la fin. Parce qu'en fait, cette procédure de tri, coupage et collage, ce n'est pas moi qui l'ai écrite... alors il faudrait vraiment s'assurer qu'au final, le résultat soit le même, peut importe la façon que la macro est écrite.

Des suggestions?
Expert Programmation

Bof. Je veux bien t'aider à comprendre comment faire des choses, pas à les faire pour toi. Si tu finis par bien comprendre, ce sera pour moi une satisfaction et pour toi, l'assurance de savoir vérifier par toi-même si le résultat obtenu est celui escompté.

Si tu sais ce que tu veux faire, on va t'aider à l'obtenir.
Si tu ne sais que ce que tu veux obtenir, on ne va pas te le faire.

--------------------------------------------------------

Tu as étudié et testé le bout de code que je t'ai proposé ?

Bah alors de ce que je comprends, je crois qu'il serait préférable de garder toutes les étapes précédentes de la macro... sauf le bout où on lui dit de supprimer les lignes X à Z. On pourrait remplacer cette étapes par le dernier truc que tu disais.. lui faire chercher ligne par ligne les cellules vides et ensuite les supprimer. Ça reviendrait à faire ce que je parlais au début et donnerait un bon résultat vu qu'on ne change pas le reste de la procédure...

Qu'en penses-tu?
Expert Programmation

1°) La macro d'origine est très moche ! Je peux t'aider à obtenir quelque chose de fonctionnel et très clean. A quoi bon tout copier puis faire le tri plutôt que de trier puis copier seulement le nécessaire ?
2°) C'est à toi de prendre la décision. C'est ton code.
3°) Si je te propose quelque chose, tu disposes. C'est ton code. Je continuerai à t'aider, quelque soit ton choix.
4°) Si je t'impose quelque chose, tu disposes. C'est ton code. Je ne continuerai peut-être pas à t'aider. (Mais il y a d'autres membres dans ce forum, il y a même d'autres forums...)


Bon alors, ma propostion de regarder le code proposé... Ce n'est pas un bon début ?

Bon alors pour la macro suivante, j'ai bien vérifié les noms et tout et tout, mais il y a juste une nouvelle feuille nommée H qui se crée, rien ne se colle.

  1. Dim H As Worksheet
  2. Dim ligneH As Long
  3.  
  4. ligneH = 1
  5. Set H = Worksheets.Add
  6. H.Name = "H"
  7.  
  8. For Each ligne In Worksheets("Over Under Report" ).Range("4:65535" ).Rows
  9. If ligne.Cells(1, 1).Value = "Activity Type" And ligne.Cells(1, 5).Value = "Supplier Style" Then
  10. ligne.Copy Destination = H.Rows(ligneH)
  11. ligneH = ligneH + 1
  12. End If
  13. Next


Pour le reste des formules (jusqu'à l'étape 3) ça va bien. Voici ce que ça donne de mon côté. J'ai inversé les lettre de nom de feuille pour la cause, j'ai modifié le range de 4 à 65536 car on me dit erreur 1004 les zones de copies sont de forme et tailles différentes. Je me suis donc dit copions et supprimons... je croyais m'en sortir en utilisant le code plus bas, mais je me suis retrouvé à être dans la feuille H... c'est pourquoi j'ai écris Sheets ("S")... mais ça ne fonctionne toujours pas...

  1. Dim nouvelle_feuille As Worksheet
  2. Set nouvelle_feuille = Worksheets.Add
  3. nouvelle_feuille.Name = "S"
  4. Set nouvelle_feuille = Worksheets.Add
  5. nouvelle_feuille.Name = "H"
  6. Set nouvelle_feuille = Nothing
  7. Sheets("Over Under Report").Range("1:65536").Copy Destination:=Sheets("S").Cells
  8. Sheets ("S")
  9. Rows("1:3").Select
  10. Selection.Delete Shift:=xlUp


Voilà, désolée du délais, j'étais partie dîner. Merci!
Expert Programmation

On a bien dit que les "Activity Type" étaient dans la colonne A (1) et que les "Supplier Style" étaient dans la colonne E. Bon, si tu veux les lignes qui ont "Activity Type" dans la colonne A et "Supplier Style" dans la colonne E, le premier code devrait fonctionner.

Pour le erreur 1004, écris ça :

  1. Sheets("Over Under Report" ).Range("4:65536" ).Copy Destination:=Sheets("S").Cells.Range("A1")
pour sélectionner une cellule de destination. Excel devrait s'y retrouver.

Pourquoi la ligne 8 ?

Lignes 9 et 10, pourquoi sélectionner un truc pour avoir le plaisir d'utiliser Selection juste après.
Au lieu d'écrire
Truc.Select
Selection.Action ...
Il est plus clair d'écrire
Truc.Action ...
Non ?

Bon, alors qu'est-ce qu'on fait ; Copie/Suppression ou Tri/Copie ?

Ah bon on dit donc que Supplier Style est dans la colonne A (1) et que Activity Type est dan la colonne E. C'est sûrement pour ça... Je vais revérifier le code.

Pour la ligne 8 et bien c'est que j'ai copié ce que je croyais être votre code (ligne 9 et 10) et je voulais modifier. Ça montre juste que je n'y connais rien ;) 

et une suppression :
Code :
Rows("1639:2170" ).Select
Range("A2170" ).Activate
Selection.Delete Shift:=xlUp


On fait le plus cours... j'imagine tri/copie...

Bon je prend le temps de vérifier les trucs de votre message et on se tiens au courant.

Merci!
Expert Programmation

  1. Dim H As Worksheet
  2. Dim ligneH As Long
  3.  
  4. ligneH = 1
  5. Set H = Worksheets.Add
  6. H.Name = "H"
  7.  
  8. For Each ligne In Worksheets("Over Under Report" ).Range("4:65535" ).Rows
  9.  
  10. Msgbox "Je suis sur la ligne " & ligne.Row & Chr(13) & _
  11. "Je regarde si je trouve Activity Type dans la cellule " & ligne.Cells(1, 1).Address & Chr(13) & _
  12. "et si je trouve Supplier Style dans la cellule " & ligne.Cells(1, 5).Address & Chr(13) & _
  13. "Si oui, je copierai cette ligne dans la ligne " & ligneH & "de H"
  14.  
  15. If ligne.Cells(1, 1).Value = "Activity Type" And ligne.Cells(1, 5).Value = "Supplier Style" Then
  16. ligne.Copy Destination = H.Rows(ligneH)
  17. ligneH = ligneH + 1
  18. End If
  19. Next
Expert Programmation

Oups. C'est pour en comprendre le fonctionnement
Pour arrêter une macro en cours de fonctionnement : [Ctrl+Pause]

Tu as dû appuyer 65531 fois ?
- rhoooo, je suis un salop !

Alors, ça remplis correctement ta feuille H ou pas ?

Bah en fait je l'ai fait une couple de fois, mais je me suis pas rendu à la fin... je suppose donc que c'est pour ça que rien ne s'est collé...

Heu...je veux bien faire ctrl + pause... mais je ne connais pas ton bouton pause... c'est quelle lettre?

Anyway j'ai supprimé ton msg box (10 à 14) de la macro, inversé activity type et supplier Style et rien ne se passe quand il termine la macro... on me dit incompatibilité de type et on me montre la ligne

  1. ligne.Copy Destination = H.Rows(ligneH)
Expert Programmation

Grrrr !! (après moi-même)
ligne.Copy Destination = H.Rows(ligneH).Cells(1, 1)
ligne.Copy Destination:= H.Rows(ligneH).Cells(1, 1)


La touche Pause, c'est la touche Pause [:spamafote]

Merci.
La bonne nouvelle c'est que ça marche. :wahoo: 

Le hic c'est qu'il copie seulement quand il trouve les mots "Supplier Style" en A et "Activity Type" ent E, par conséquent il copie seulement la ligne de titre. Il faudrait pouvoir lui dire de copier les lignes remplies mais pas les lignes vides... Tu me suis? Sûrement...

Je vais aller diner dans 15 minutes (ici il est 11h15) donc je serai de retour à 12h30.

bha alors ca non ?:
  1. Dim H As Worksheet
  2. Dim ligneH As Long
  3. ligneH = 1
  4. Set H = Worksheets.Add
  5. H.Name = "H"
  6. For Each ligne In Worksheets("Over Under Report" ).Range("4:65535" ).Rows
  7. If ligne.Cells(1, 1).Value <> "" And ligne.Cells(1, 5).Value <> "" Then
  8. ligne.Copy Destination:= H.Rows(ligneH).Cells(1, 1)
  9. ligneH = ligneH + 1
  10. End If
  11. Next
Expert Programmation

:pfff:  Je n'avais pas compris que Supplier Style était le nom de la colonne, je croyais que c'était la valeur à trouver :pfff:  Comme quoi ton idée de montrer une image était bonne :sarcastic: 

Citation :
tous les "Supplier Style" #9,19,22,23 et 25

Désolé, j'ai aucune idée de ce que tu dis...

Comme nous avons fait H, tu vas faire S. D'accord ! (Tu vois c'est là que j'impose au lieu de ne que proposer ;)  )

On utilisera aussi une variable ligneS pour suivre où on en est dans S.
Il faut alors dans la boucle For ajouter un test (If) pour savoir si on est dans le cas #9,19,22,23 ou 25 pour mettre S plutôt que H en destination. Et donc incrémenter ligneS plutôt que ligneH. Est-ce clair pour toi ?

Bon alors maintenant je veux trouver les numéro de supplier style 9,19,22,23 et 25 et les avoir dans la nouvelle feuille S, mais plus dans H.

Avec votre aide, j'ai réussi à écrire:

  1. ligneS = 1
  2. Set S = Worksheets.Add
  3. S.Name = "S"
  4. For Each ligne In Worksheets("H").Range("1:65535").Rows
  5. If ligne.Cells(1, 1).Value <> "9,19,22,23,25" Then
  6. ligne.Copy Destination:=S.Rows(ligneS).Cells(1, 1)
  7. ligneS = ligneS + 1
  8. End If
  9. Next


Voici mes problèmes... je sais pas comment...
1-en partant il copy et non cut/paste (j'ai essayé : ligne.cut.paste destination ect.. mais ça n'a pas marché.
2-ensuite, eh bien yahoo il copie, mais pas seulement les lignes où le "Supplier Style" est 9,19,22,23 ou 25.
3-je sais pas pourquoi, mais on dirait qu'il termine jamais il y a pourtant un End sub à la fin de ma macro.
4- finalement, en plus, il faudrait que la ligne de titre aussi soit copiée.

Bon du moins mon affaire marche (pas bien mais bon lol) alors je suis pas si cruche finalement lol

Vous pouvez m'aider encore svp?

Bon je termine le boulot. À demain matin 8h :bounce: 
Expert Programmation

If ligne.Cells(1, 1).Value <> "9,19,22,23,25" Then
Carolyne :/  ... Je te le lis en français :
Si la valeur de la cellule 1x1 de la ligne considérée est différente de "9,19, 22,23,25", alors faire ce qui suit !!!!! Meuh non !

Je t'écris ce que je crois être ce que tu veux :
  1. If ligne.Cells(1, 1).Value = 9 Or ligne.Cells(1, 1).Value = 19 Or ligne.Cells(1, 1).Value = 22 Or ligne.Cells(1, 1).Value = 23 Or ligne.Cells(1, 1).Value = 25 Then

--------------------------------

Toujours selon le principe, on réfléchit d'abord et ensuite seulement on fait : Au lieu de copier les lignes de "Over Under Report" dans "H" puis dans "S", on va directement dispacher dans "H" ou dans "S" au départ.

Donc :
  • Création de S avec son ligneS associé, initalisé à 1
  • Création de H avec son ligneH associé, initalisé à 1
  • Boucle For sur les lignes de "Over Under Report".
    * Si on trouve quelque chose dans la cellule 1x5, (Activity Type)
    * Si on trouve 9 ou 19 ou 22 ou 23 ou 25 dans la cellule 1x1 (Supplier Style) on copie dans S
    * Si on trouve autre chose dans la cellule 1x1, on copie dans H
    * Sinon, on ne fait rien
    * Si ne on trouve rien dans la cellule 1x5, on ne fait rien.
  • Et voilà !

    Hé ça marche!!! J'ai réussis à le virer de bord!!!

    Il y a juste à un endroit où j'ai le bon résultat, mais que la formule en donne plus que ce que je voudrais. C'est ma ligne 9... je voulais essayer de copier juste ma ligne de titre dans ma feuille S avant de vous revenir ici...Sauf que il copie l'info sur vraiment plusieurs ligne... mais les commandes d'après les écrases alors mon résultat est bon...

    Comment l'auriez vous écris?

    Bon voici la mienne:
    1. Dim H As Worksheet
    2. Dim ligneH As Long
    3. ligneH = 1
    4. Set H = Worksheets.Add
    5. H.Name = "H"
    6. ligneS = 1
    7. Set S = Worksheets.Add
    8. S.Name = "S"
    9. Sheets("Over Under Report").Range("4:4").Copy Destination:=Sheets("S").Cells
    10. For Each ligne In Worksheets("Over Under Report").Range("4:65535").Rows
    11. If ligne.Cells(1, 5).Value <> "" Then
    12. If ligne.Cells(1, 1).Value = 9 Or ligne.Cells(1, 1).Value = 19 Or ligne.Cells(1, 1).Value = 22 Or ligne.Cells(1, 1).Value = 23 Or ligne.Cells(1, 1).Value = 25 Then
    13. ligne.Copy Destination:=S.Rows(ligneS).Cells(2, 1)
    14. ligneS = ligneS + 1
    15. End If
    16. If ligne.Cells(1, 1).Value <> "" Then
    17. ligne.Copy Destination:=H.Rows(ligneH).Cells(1, 1)
    18. ligneH = ligneH + 1
    19. End If
    20. End If
    21. Next
    22. End Sub
    Expert Programmation

    Yeepee !!

    1. Dim H As Worksheet
    2. Dim S As Worksheet
    3. Dim O As Worksheet
    4.  
    5. Dim ligneH As Long
    6. Dim ligneS As Long
    7.  
    8. Set H = Worksheets.Add
    9. Set S = Worksheets.Add
    10. Set O = Worksheets("Over Under Report")
    11.  
    12. H.Name = "H"
    13. S.Name = "S"
    14.  
    15. ligneH = 2
    16. ligneS = 2
    17.  
    18. O.Range("4:4").Copy Destination:=Sheets("S").Range("1:1")
    19. O.Rows(4).Copy Destination:=Sheets("H").Rows(1)
    20.  
    21. For Each ligne In O.Range("4:65535").Rows
    22. If ligne.Cells(1, 5).Value <> "" Then
    23. If ligne.Cells(1, 1).Value = 4392 Or ligne.Cells(1, 1).Value = 4889 Or ligne.Cells(1, 1).Value = 4897 Or ligne.Cells(1, 1).Value = 4955 Or ligne.Cells(1, 1).Value = 5005 Then
    24. ligne.Copy Destination:=S.Rows(ligneS)
    25. ligneS = ligneS + 1
    26. ElseIf ligne.Cells(1, 1).Value <> "" Then
    27. ligne.Copy Destination:=H.Rows(ligneH)
    28. ligneH = ligneH + 1
    29. End If
    30. End If
    31. Next
    32. End Sub


    J'ai ajouté les définitions (Dim) pour S que tu avais oublié.
    J'ai ajouter O pour Over Under Report, c'est juste histoire de te montrer la logique.

    Ligne 18 de mon code (ta ligne 9), au lieu de dire Cells, je dis Range("1:1"), la ligne 1 quoi. Du coup, je pense ligne 15 et 16 du code à commencer à la ligne 2 de S et H.

    Mais Range("4:4"), c'est la ligne 4, autant écrire Rows(4). C'est que que je fais pour mettre la ligne de titre à H, ligne 19. Utilise la syntaxe qui te paraît la plus simple pour toi.

    Sauf que là en page S... le titre est sur ligne 1, j'ai une ligne 2 blanche et l'info débute ligne 3.
    Et page H... ligne 1 blanche, 2 titre et 3 les info débutes...

    Il sert à quoi le ElseIf en ligne 26?

    Bon après tout ça, ça commence à être plus simple et à achever...

    Je voudrais trier les "Demand" et les "Customer Order" par Dock Date (1, 6) mais pas les "Replenishment Order". C'est pourquoi je devais insérer une ligne noire entre les "Demand" et les "Replenishment Order" afin de mieux visualiser où m'arrêter de sélectionner.
    Lassé par la pub ? Créez un compte