FORUM Tom's Hardware » Programmation » VB / VBA / VBS » Créer une macro spéciale dans Excel
 

Créer une macro spéciale dans Excel

Il y a 93 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici



Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : Créer une macro spéciale dans Excel
 
Plus d'informations

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:


Message édité par le 06-08-2007 à 11:06:55

Profil : Pointeur
Plus d'informations

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


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
zeb
Profil : Modérateur libre

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


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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

 


Code :
  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


Message édité par le 06-08-2007 à 18:51:26
Profil : Pointeur
Plus d'informations

entoure ton code de la balise [code] stp :)
Vraiment.


Message édité par KangOl le 06-08-2007 à 17:29:57

---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
Plus d'informations

Et voilà, c'est fait!
Navrée.

zeb
Profil : Modérateur libre

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.

Code :
  1. Dim nouvelle_feuille As Worksheet
  2. Set nouvelle_feuille = Worksheets.Add
  3. nouvelle_feuille.Name = "H"
  4. Set nouvelle_feuille = Worksheets.Add
  5. nouvelle_feuille.Name = "S"
  6. 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 :

Code :
  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 :

Code :
  1. Sheets("S" ).Cells.Sort Key1:=Range("A2" ), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

et une suppression :

Code :
  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 ?


Message édité par zeb le 06-08-2007 à 19:23:22

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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

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 :
  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 = "ActivityTruc" And ligne.Cells(1, 5).Value = "SupplierMachin" Then
  8.         ligne.Copy Destination = H.Rows(ligneH)
  9.         ligneH = ligneH + 1
  10.     End If
  11. Next


Message édité par zeb le 07-08-2007 à 17:24:56

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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

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

Je te proposais de tout repenser.


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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

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


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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