Créer une macro spéciale dans Excel

  • Auteur de la discussion Carolyne0105
  • Date de début

Carolyne0105

Nouveau membre
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:
 

KangOl

Grand Maître
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 ...
 

zeb

Modérateur
(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.
 

Carolyne0105

Nouveau membre
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!)


[cpp]Sub MacroTestReport()
'
' MacroTestReport Macro
' Macro enregistrée le 2007-08-06 par CAROLYNE0105
'
'
Sheets("Over Under Report").Select
Sheets.Add
Sheets("Over Under Report").Select
Sheets.Add
Sheets("Feuil1").Select
Sheets("Feuil1").Name = "H"
Sheets("Feuil2").Select
Sheets("Feuil2").Name = "S"
Sheets("Over Under Report").Select
Cells.Select
Selection.Copy
Sheets("S").Select
ActiveSheet.Paste
Rows("1:3").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlUp
Cells.Select
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
ActiveWindow.ScrollRow = 2139
Rows("1639:2170").Select
Range("A2170").Activate
Selection.Delete Shift:=xlUp
Rows("1639:1639").Select
ActiveWindow.SmallScroll Down:=-60
Rows("1564:1577").Select
Range("A1577").Activate
Selection.Cut
Sheets("H").Select
Range("A2").Select
ActiveSheet.Paste
Range("A16").Select
Sheets("S").Select
Selection.Delete Shift:=xlUp
ActiveWindow.SmallScroll Down:=-66
Rows("1478:1513").Select
Range("A1513").Activate
Selection.Cut
Sheets("H").Select
Selection.Insert Shift:=xlDown
ActiveWindow.SmallScroll Down:=30
Range("A52").Select
Sheets("S").Select
Selection.Delete Shift:=xlUp
ActiveWindow.SmallScroll Down:=-381
Rows("1049:1109").Select
Range("A1109").Activate
Selection.Cut
Sheets("H").Select
Selection.Insert Shift:=xlDown
ActiveWindow.SmallScroll Down:=54
Range("A113").Select
Sheets("S").Select
Selection.Delete Shift:=xlUp
ActiveWindow.SmallScroll Down:=-738
Rows("230:314").Select
Range("A314").Activate
Selection.Cut
Sheets("H").Select
Selection.Insert Shift:=xlDown
Sheets("S").Select
Selection.Delete Shift:=xlUp
ActiveWindow.ScrollRow = 1
Rows("1:1").Select
Selection.Copy
Sheets("H").Select
ActiveWindow.SmallScroll Down:=-99
Rows("1:1").Select
ActiveSheet.Paste
Range("A1").Select
Sheets("S").Select
Cells.Select
Application.CutCopyMode = False
Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Sheets("H").Select
Cells.Select
Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Sheets("S").Select
ActiveWindow.ScrollRow = 2140
ActiveWindow.SmallScroll Down:=-726
Rows("1383:1443").Select
Range("A1443").Activate
Selection.Delete Shift:=xlUp
Sheets("H").Select
ActiveWindow.ScrollRow = 170
ActiveWindow.SmallScroll Down:=6
Rows("176:198").Select
Range("A198").Activate
Selection.Delete Shift:=xlUp
ActiveWindow.SmallScroll Down:=-45
Rows("137:137").Select
Selection.Insert Shift:=xlDown
With Selection.Interior
.ColorIndex = 1
.Pattern = xlSolid
End With
Sheets("S").Select
ActiveWindow.SmallScroll Down:=-225
Rows("1161:1161").Select
Selection.Insert Shift:=xlDown
With Selection.Interior
.ColorIndex = 1
.Pattern = xlSolid
End With
Rows("1:1160").Select
Range("A1160").Activate
Selection.Sort Key1:=Range("G2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Sheets("H").Select
Rows("1:136").Select
Range("A136").Activate
Selection.Sort Key1:=Range("G2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
ActiveWindow.SmallScroll Down:=-3
ActiveWindow.ScrollRow = 1
Columns("L:L").Select
With Selection.Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
Columns("G:G").Select
With Selection.Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
Sheets("S").Select
ActiveWindow.ScrollRow = 1
Columns("G:G").Select
With Selection.Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
ActiveWindow.SmallScroll ToRight:=3
Columns("L:L").Select
With Selection.Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
End Sub
[/cpp]
 

zeb

Modérateur
(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.
Code:
Dim nouvelle_feuille As Worksheet

Set nouvelle_feuille = Worksheets.Add
nouvelle_feuille.Name = "H"
Set nouvelle_feuille = Worksheets.Add
nouvelle_feuille.Name = "S"
Set nouvelle_feuille = Nothing

Etape 2:
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 :
Code:
Sheets("Feuil1").Range("4:65536").Copy Destination:=Sheets("Feuil2").Cells

Etape 3 :
Je fais un tri par Supplier Style afin de supprimer toutes les lignes sans Supplier Style.
Ok, c'est un tri :
Code:
Sheets("S").Cells.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
et une suppression :
Code:
Rows("1639:2170" ).Select
Range("A2170" ).Activate
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 ?
 

Carolyne0105

Nouveau membre
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

 

zeb

Modérateur
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 ?

Code:
Dim H As Worksheet
Dim ligneH As Long

ligneH = 1
Set H = Worksheets.Add
H.Name = "H"

For Each ligne In Worksheets("Over Under Report").Range("4:65535").Rows
    If ligne.Cells(1, 1).Value = "ActivityTruc" And ligne.Cells(1, 5).Value = "SupplierMachin" Then
        ligne.Copy Destination = H.Rows(ligneH)
        ligneH = ligneH + 1
    End If
Next
 

Carolyne0105

Nouveau membre
Oui j'imagine que ça fonctionnerais... de ce que je comprend lol. Mais ce code je le met où par rapport au autres?

oh la la, vraiment, je n'y connais rien...
 

zeb

Modérateur
Où tu te le mets ? .... euh, dans Sub MacroTestReport2 et à terme, on virera complètement Sub MacroTestReport.

Je te proposais de tout repenser.
 

Carolyne0105

Nouveau membre
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?
 

zeb

Modérateur
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é ?
 

Carolyne0105

Nouveau membre
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?
 

zeb

Modérateur
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 ?
 

Carolyne0105

Nouveau membre
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.

[cpp]
Dim H As Worksheet
Dim ligneH As Long

ligneH = 1
Set H = Worksheets.Add
H.Name = "H"

For Each ligne In Worksheets("Over Under Report" ).Range("4:65535" ).Rows
If ligne.Cells(1, 1).Value = "Activity Type" And ligne.Cells(1, 5).Value = "Supplier Style" Then
ligne.Copy Destination = H.Rows(ligneH)
ligneH = ligneH + 1
End If
Next
[/cpp]

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...

[cpp]
Dim nouvelle_feuille As Worksheet
Set nouvelle_feuille = Worksheets.Add
nouvelle_feuille.Name = "S"
Set nouvelle_feuille = Worksheets.Add
nouvelle_feuille.Name = "H"
Set nouvelle_feuille = Nothing
Sheets("Over Under Report").Range("1:65536").Copy Destination:=Sheets("S").Cells
Sheets ("S")
Rows("1:3").Select
Selection.Delete Shift:=xlUp
[/cpp]

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

zeb

Modérateur
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 :

Code:
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 [fixed]Truc.Select
Selection.Action ...[/fixed]Il est plus clair d'écrire[fixed]Truc.Action ...[/fixed]Non ?

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

Carolyne0105

Nouveau membre
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!
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 126
Messages
6 717 817
Membres
1 586 365
Dernier membre
matiOs1
Partager cette page
Haut