Macro pour hierarchiser...

Macro pour hierarchiser... - VB/VBA/VBS - Programmation

Marsh Posté le 16-01-2008 à 12:55:01    

Bonjour a tous,
 
Je suis certifie Excel Expert 2003 et je touche les macros depuis un bon moment (edit, changement, lecture...). Par contre je ne suis pas Expert en VBA et je n ai jamais creee de macro ex-nihilo. Je pense qu aujourdhui j ai besoin de le faire:
 
Voila sous excel a permiere feuille:
http://pastebin.com/m7054f70
 
et j aimerai qu elle devienne organisee comme cela:
http://pastebin.com/m44ebc05
 
Alors c est pas top je sais pour visionner mais je ne sais pas comment mettre une piece jointe a mon post!
 
QQ pourrait t il m aider a monter cette macro, please! Je peux meme envoyer le fichier xls directement :-)
 
Merci de votre aide

Reply

Marsh Posté le 16-01-2008 à 12:55:01   

Reply

Marsh Posté le 16-01-2008 à 13:32:48    

Jour Bon pour les pj utiliser par exemple http://cjoint.com/


Message édité par kiki29 le 16-01-2008 à 13:33:29
Reply

Marsh Posté le 16-01-2008 à 14:06:52    

Merci kiki29, je ne connaissais pas ca! (Je le bookmark maintenant)
En tout ca voici mon fichier excel et la macro:
 
http://cjoint.com/data/bqofTGZ7O2.htm
 
 
Merci de votre aide

Reply

Marsh Posté le 16-01-2008 à 16:02:32    

Bonjour,
Une solution pas trop abstraite...
A+

Reply

Marsh Posté le 16-01-2008 à 16:12:50    

OUi galopin, t es un vrai genie!
Je ne comprend pas commetn tu as fait pour relever ce challenge! Ce que tu as pondu me semble parfait mais ou es tu alller chercher ca!
Reconnaissant a jamais!
 
Pour info, peux tu me dire combien de temps tu as pris pour faire ca?
 
Merci encore!
 
PS: J essaie de comprendre ton code mais c est tres dur pour moi!

Reply

Marsh Posté le 16-01-2008 à 17:17:00    

Bonsoir,
Pas très longtemps ! C'est de la petite boucle de débutant... J'ai volontairement utilisé des méthodes "primaires", pas trop opaques pour un débutant...
 
Le plus difficile était de faire une hiérarchisation par continents et sous continents dans la colonne C (première boucle for)
Pour mettre en évidence cette hiérarchisation supprimer la dernière ligne de la macro : Columns(3).Clear
 
Ensuite l'algo est simple
Pour chaque continent, l'inscrire, incrémenter le compteur de ligne, chercher chaque sous-continent
Pour chaque sous-continent de la même famille, l'inscrire, incrémenter le compteur de ligne, chercher chaque pays
Pour chaque pays du même sous-continent, l'inscrire, incrémenter le compteur de ligne...
 
Essaie de suivre en mode pas à pas (F8), fait du débugage, essaie de lire les variables, et si nécessaire tu en redemande j'essaierai d'être plus explicite.
A+

Reply

Marsh Posté le 16-01-2008 à 17:27:27    

Aie ! Aie Aie!
 
En fiat j ai un probleme avec cette macro car elle ne fonctionne qu avec une certaine "profondeur" de parent.
 
Exemple: Si j ajoute en A26 TunisiaSouth puis B26 Tunisia
puis en A27 TunisiaNorth puis B27 Tunisia
et que je fais tourner la macro, alors elle ne prends pas en compte cette "profondeur"....
 
Merci de votre aide.

Reply

Marsh Posté le 16-01-2008 à 17:31:28    

Galopin merci pour ta reponse. ( j ai reposte entre temps!)
Oui j ai regarder tout en mode pas a pas! Et meme comme ca c est pas si simple...  
Je vais essayer de faire ce que je te mettais dans le post precedent...
Tes explications m eclairent un peu, c est vraiment sympa de ta part!

Reply

Marsh Posté le 16-01-2008 à 18:15:44    

Re...
C'est clair que je n'ai fait que 3 niveaux de hirarchisation. Mais tu peux en rajouter autant que tu veux du moment que tu commences par hirarchiser correctement en colonne C
Ensuite YAPUKA rajouter autant de boucles For... If... End if...Next que de niveaux d'imbrication supplémentaire au niveau des pays, régions, départements...
 
A+

Reply

Marsh Posté le 16-01-2008 à 20:31:06    

OK je vais essayer! Je vais reprendre cela demain desormais!
Bonne nuit !

Reply

Marsh Posté le 16-01-2008 à 20:31:06   

Reply

Marsh Posté le 17-01-2008 à 10:05:36    

Bonjour,
Un essai pour un niveau supplémentaire. On reste à un niveau basique... pour ne pas dire trivial !
Je suppose qu'on arriver à généraliser pour n niveau de manière très simple avec les modules de classe mais je suis loin d'être très pointu dans ce domaine.
Et de toute façon c'est au top de la programmation Excel,rares sont les bricolos comme moi qui s'y hasardent.
Je vais essayer malgré tout, mais l'appui d'un MVP VBA ou d'un pro de la poo ne me semble pas inutile !
A+


Message édité par galopin01 le 17-01-2008 à 10:06:26
Reply

Marsh Posté le 17-01-2008 à 10:13:39    

Pour avoir un niveau de profondeur N avec N inconnu mais limité, tu peux utiliser la récursivité
 
La récursivité à l'avantage d'être très simple à mettre en place, mais a deux gros inconvénients :
- Les performances ne sont pas très bonnes
- Tu peux profoquer une erreur de dépassement de pile lorsque N devient grand (selon les langages, N peut être par exemple de 32, 256 ou bien plus grand)
 
Une autre solution consiste à faire des itération successives jusqu'à ce que la solution soit trouvée. Ce système est moins aisé à développer (dans ton cas, il reste tout de même très simple à mettre en place), et a l'avantage d'être bien plus rapide, exempt de toute limite de profondeur, au prix d'une lisibilité de l'algo moindre.
 
Je te conseille de tenter avec la récursivité en premier (de toute façon, dans une maro Excel, tu n'es virtuellement pas sujet aux limitations de la récursivité)
 
Mon paragraphe sur les performances et les limitations de la récursivité est à relativiser (mais reste vrai tout de même avec nombre de langages, VBA en faisant partie)

Citation :


La présentation récursive d'un algorithme conduit-elle à un programme moins efficace qu'une présentation itérative ?
La mise en œuvre des algorithmes récursifs nécessite une pile. C'est la difficulté d'implanter cette pile qui a fait dire pendant longtemps que les programmes récursifs étaient moins efficaces que les programmes itératifs, mais la situation a changé. En fait, le débat sur l'opposition récursif et itératif est aussi vieux que l'informatique et les progrès récents de la compilation des langages de programmation fonctionnelle permet moins encore de le trancher qu'autrefois. Voici quelques arguments en faveur de la présentation récursive.
 
La présentation récursive permet de présenter simplement des algorithmes beaucoup plus astucieux (et donc plus efficaces) et cela a été admirablement montré par Tony Hoare avec son algorithme de tri rapide.  
Les compilateurs d'aujourd'hui sont tellement astucieux que plus le programme leur est présenté de façon abstraite et sans effets de bord, plus ils peuvent mettre en œuvre leurs optimisations et aboutir à des codes objets efficaces.  
La contribution la plus percutante dans ce débat a été celle de John Backus, l'inventeur de Fortran, qui dans de sa conférence invitée lors de la remise de son prix Turing en 1977 a pris clairement le parti de la programmation fonctionnelle, donc de la programmation récursive.


Message édité par MagicBuzz le 17-01-2008 à 10:17:22
Reply

Marsh Posté le 17-01-2008 à 10:18:43    

PS : Sans vouloir jeter la pierre à Galopin, son algo est vraiment bricolo, limité, et absolument pas évolutif. Je te déconseille de l'utiliser comme base (même si une partie du code est à reprendre telle qu'elle dans une fonction récursive)

Reply

Marsh Posté le 17-01-2008 à 10:29:50    

Tu as aussi une troisième méthode, mais qui est bien plus difficile à mettre en place et vraiment le marteau pillon pour ouvrir une noisette : passer par un arbre...

Reply

Marsh Posté le 17-01-2008 à 10:31:30    

Merci pour tes conseils MagicBuzz!
Je debut en pur code VBA donc deja essayer de comprendre ce que galopin a fait est une vrai aventure pour moi! Quant a ce que tu me dis, je vias chercher des infos la dessus! Mais comme je viens de le preciser, c est loin d etre evident pour moi! :-)
 
Une personne m a envoye  ce code:

Code :
  1. Sub MacroMickG()
  2. Dim lastJ As String, Move_Ctry, C_No, NewNu, SubCty, Sch1 As String
  3. Dim last, c, L
  4. last = Range("b" & Rows.Count).End(xlUp).Row
  5. lastJ = Range("j" & Rows.Count).End(xlUp).Row
  6. c = 1
  7. For C_No = 2 To lastJ
  8.         c = c + 1
  9.     Cells(c, 7).Value = Cells(C_No, "J" )
  10.     NewNu = 2
  11. For SubCty = NewNu To last
  12.     If Cells(SubCty, "B" ).Value = Cells(C_No, "J" ).Value Then
  13.         Sch1 = Cells(SubCty, "B" ).Offset(0, -1).Value
  14.         NewNu = SubCty + 1
  15.             c = c + 1
  16.         Cells(c, 7).Value = Sch1
  17.         Cells(c, 8).Value = Cells(SubCty, "B" ).Value
  18. For Move_Ctry = 2 To last
  19.         If Cells(Move_Ctry, 2) = Sch1 Then
  20.             c = c + 1
  21.             Cells(c, 7).Value = Cells(Move_Ctry, 1).Value
  22.             Cells(c, 8).Value = Cells(Move_Ctry, 2).Value
  23.         End If
  24. Next
  25.     End If
  26. Next
  27. Next
  28. MsgBox "Transfer Complete"
  29. End Sub


 
Je vais aussi mettre le nez dedans!
 
Pas evident!!!!!
 
Nic
 

Reply

Marsh Posté le 17-01-2008 à 11:03:52    

bonjour,

MagicBuzz a écrit :

PS : Sans vouloir jeter la pierre à Galopin, son algo est vraiment bricolo, limité, et absolument pas évolutif. Je te déconseille de l'utiliser comme base (même si une partie du code est à reprendre telle qu'elle dans une fonction récursive)


J'en étais bien conscient ! Mais quand on n'a absolument rien d'autre à se mettre sous la dent...
 
Je n'ai pas réussi à exploiter la Sub MacroMickG ??  :??:  
Elle ne me produit que le message "Transfer Complete"
 
Ya un truc ?
A+
 

Reply

Marsh Posté le 17-01-2008 à 11:08:02    

je pige rien au code du gars :D
 
Sinon, exemple avec la récursivité :

Code :
  1. Option Explicit
  2.  
  3. Dim DerniereLigne As Integer
  4.  
  5. Sub Hierarchie()
  6.  Range("A1" ).Select
  7.  DerniereLigne = Range(Selection, Selection.End(xlDown)).Rows.Count
  8.  
  9.  Call MethodeRecursive("", 2)
  10. End Sub
  11.  
  12. Sub MethodeRecursive(Parent As String, ByRef Position As Integer)
  13.  Dim i As Integer
  14.  For i = 2 To DerniereLigne
  15.    If Cells(i, 2) = Parent Then
  16.        Cells(Position, 4) = Cells(i, 1)
  17.        Cells(Position, 5) = Cells(i, 2)
  18.        Position = Position + 1
  19.        Call MethodeRecursive(Cells(i, 1), Position)
  20.    End If
  21.  Next
  22. End Sub


 
Comme tu vois, c'est on ne peut plus simple...
 
Tu as juste à appeler la macro "Hierarchie".


Message édité par MagicBuzz le 17-01-2008 à 11:09:41
Reply

Marsh Posté le 17-01-2008 à 11:10:38    

galopin01 a écrit :


Je n'ai pas réussi à exploiter la Sub MacroMickG ??  :??:  
Elle ne me produit que le message "Transfer Complete"
 
Ya un truc ?


Utilise la mienne, elle est plus simple et elle marche :D


Message édité par MagicBuzz le 17-01-2008 à 11:10:56
Reply

Marsh Posté le 17-01-2008 à 11:22:08    

Galopin, Si tu veux regarder la macro de MickG, je l ai mise et elle fonctionne:
http://cjoint.com/?brlu7u02H8
 
Evidement elle a le meme probleme de limitation que la tienne!

Reply

Marsh Posté le 17-01-2008 à 11:24:19    

MagicBuzz, comment je fais pour copier coller facillement ton code? Dois y avoir un truc non? Car moi je choppe aussi le numero de ligne, c est enervant! :-(

Reply

Marsh Posté le 17-01-2008 à 11:27:09    

MagicBuzz, je viens de trouver, il faut copier coller dans Word et virer la numerotation (c est une option du format)
Desole pour le derangement

Reply

Marsh Posté le 17-01-2008 à 11:31:05    

(sinon il suffisait de double cliquer sur le code, ça vire les numéros de ligne ;))

Reply

Marsh Posté le 17-01-2008 à 11:41:14    

Pour etre honnete avec vous je pensais que ca allait etre beaucoup plus facile! Mais c est une erreur de jugement car je n y connais pas grand chose et j essaie d apprendre.
 
Je vais vous partager mon point de vue: (Quand je donnerais des exemples, regardez le fichier que je vous ai envoye car je part de l exemple continent AMERIQUE en cellule A23)
 
En disant a excel de chercher dans la colonne B, les cellules vides, alors vous etes sur qu en colonne A se trouve un Top Parent!
Il faut chopper ce Top parent et le coller en F1 par exemple. (exemple coller ligne A23 et B23 -qui est vide- en F2 et G2)
Puis chercher dans la colonne B, une valeur egale a F2 et ramener cette ligne (A17 et B17) en (F3 et G3)
Puis chercher dans la colonne B, une valeur egale a F3 et ramener cette ligne (A2 et B2) en (F4 et G4)...
 
J espere que je suis assez clair.  
 
Qu en pensez vous de ce raisonement?

Reply

Marsh Posté le 17-01-2008 à 11:58:29    

Ben c'est pas ce que fait mon truc ?
 
Il cherche en colonne "B" tous les pays sans parent (donc B vide)
Recopie la ligne dans la colonne D et E.
Puis va chercher pour l'élément copier tous ses fils.
Et pour chaque fils, refait la même chose...
 
Chez moi ça marche parfaitement...
 
http://img526.imageshack.us/img526/4526/hierarchieyr8.png
 
A gauche, mon jeu de test. A droite, les données hiérarchisées... Je vois pas ce qui pose problème...
Ca reprends rigoureusement ce que t'as posté dans ton premier post.


Message édité par MagicBuzz le 17-01-2008 à 12:04:27
Reply

Marsh Posté le 17-01-2008 à 12:11:27    

Ben j arrive pas a utiliser ton code Magic :-(
 
Tu pourrais stp poster ton fichier excel sur http://cjoint.com
 
Je suis impatient de voir! :-)

Reply

Marsh Posté le 17-01-2008 à 12:38:21    

Ben tu copie-colle mon code dans ta macro (t'efface tout ce qu'il y a déjà)
 
Tu te mets sur ta feuille.
Tu vérifies que tes données sont bien dans les colonnes A et B, et commencent à la ligne 2, et que A n'a jamais de trous.
 
ALT+F8
=> Exécuter la macro "Hierarchie".


Message édité par MagicBuzz le 17-01-2008 à 12:38:50
Reply

Marsh Posté le 17-01-2008 à 12:43:42    

Ah c est bon j ai compris!
Car moi je rajoutais  un Sub macro1() au debut car je croyais que toutes les macros devait commencer comme cela!
En fait non, ton travail debut par Option Explicit... directement! J ai compris et je te remercie de ton aide!
Je vais maintenant la tester plus "intensement" en tout cas merci encore pour ton aide!
 

Reply

Marsh Posté le 17-01-2008 à 14:03:04    

Option Explicit, tu feras gaffe, il t'oblige à déclarer explicitement toutes les variables avant leur utilisation, à l'aide d'un Dim.
 
C'est chiant, car ça oblige à être rigoureux, mais ça a trois avantages :
- Un qui te parle : ça augmenter considérablement les performances
- Un qui te parle moins : tu retrouves aisément toutes les variables que tu utilises sans devoir tout lire le code
- Un qui te parle pas du tout : tu connais le périmètre de chaque variable de façon explicite, et cela te permet de réutiliser les mêmes noms de variables avec des périmètres différents (vital pour la récursivité)


Message édité par MagicBuzz le 17-01-2008 à 14:03:23
Reply

Marsh Posté le 17-01-2008 à 14:27:52    

c'est on ne peut plus simple...  
Merci beaucoup MagicBuzz !

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed