Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
709 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Macro pour hierarchiser...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Macro pour hierarchiser...

n°1672132
jbesclapez​75
Posté le 16-01-2008 à 12:55:01  profilanswer
 

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

mood
Publicité
Posté le 16-01-2008 à 12:55:01  profilanswer
 

n°1672159
kiki29
Posté le 16-01-2008 à 13:32:48  profilanswer
 

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


Message édité par kiki29 le 16-01-2008 à 13:33:29
n°1672181
jbesclapez​75
Posté le 16-01-2008 à 14:06:52  profilanswer
 

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

n°1672318
galopin01
Posté le 16-01-2008 à 16:02:32  profilanswer
 

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

n°1672332
jbesclapez​75
Posté le 16-01-2008 à 16:12:50  profilanswer
 

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!

n°1672412
galopin01
Posté le 16-01-2008 à 17:17:00  profilanswer
 

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+

n°1672420
jbesclapez​75
Posté le 16-01-2008 à 17:27:27  profilanswer
 

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.

n°1672423
jbesclapez​75
Posté le 16-01-2008 à 17:31:28  profilanswer
 

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!

n°1672440
galopin01
Posté le 16-01-2008 à 18:15:44  profilanswer
 

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+

n°1672497
jbesclapez​75
Posté le 16-01-2008 à 20:31:06  profilanswer
 

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

mood
Publicité
Posté le 16-01-2008 à 20:31:06  profilanswer
 

n°1672623
galopin01
Posté le 17-01-2008 à 10:05:36  profilanswer
 

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
n°1672624
MagicBuzz
Posté le 17-01-2008 à 10:13:39  profilanswer
 

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
n°1672626
MagicBuzz
Posté le 17-01-2008 à 10:18:43  profilanswer
 

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)

n°1672631
MagicBuzz
Posté le 17-01-2008 à 10:29:50  profilanswer
 

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

n°1672632
jbesclapez​75
Posté le 17-01-2008 à 10:31:30  profilanswer
 

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
 

n°1672641
galopin01
Posté le 17-01-2008 à 11:03:52  profilanswer
 

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+
 

n°1672642
MagicBuzz
Posté le 17-01-2008 à 11:08:02  profilanswer
 

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
n°1672644
MagicBuzz
Posté le 17-01-2008 à 11:10:38  profilanswer
 

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
n°1672650
jbesclapez​75
Posté le 17-01-2008 à 11:22:08  profilanswer
 

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!

n°1672652
jbesclapez​75
Posté le 17-01-2008 à 11:24:19  profilanswer
 

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! :-(

n°1672655
jbesclapez​75
Posté le 17-01-2008 à 11:27:09  profilanswer
 

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

n°1672658
MagicBuzz
Posté le 17-01-2008 à 11:31:05  profilanswer
 

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

n°1672661
jbesclapez​75
Posté le 17-01-2008 à 11:41:14  profilanswer
 

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?

n°1672664
MagicBuzz
Posté le 17-01-2008 à 11:58:29  profilanswer
 

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
n°1672678
jbesclapez​75
Posté le 17-01-2008 à 12:11:27  profilanswer
 

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

n°1672687
MagicBuzz
Posté le 17-01-2008 à 12:38:21  profilanswer
 

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
n°1672691
jbesclapez​75
Posté le 17-01-2008 à 12:43:42  profilanswer
 

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!
 

n°1672735
MagicBuzz
Posté le 17-01-2008 à 14:03:04  profilanswer
 

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
n°1672757
galopin01
Posté le 17-01-2008 à 14:27:52  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Macro pour hierarchiser...

 

Sujets relatifs
macro menu déroulantAide pour une macro
Macro VB cartouche Catia v5Macro appelant un fichier .xls annexe -> Pb d'accès aux données
erreur avec une macro d'excelMacro Taille Ligne
créer une macro VBA qui modifiera une base de données automatiquementHELP!!!! Macro s'appliquant sur tous les fichiers d'un dossier ???
récupérer coefficient de détermination avec une macro 
Plus de sujets relatifs à : Macro pour hierarchiser...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR