savoir si deux fichier ont un même module

  • Initiateur de la discussion bellenger florian
  • Date de début
B

bellenger florian

Guest
Bonjour à tous, et à toi qui lit ce post,


J'ai un problème (si si) ou plutôt j'ai une égnime palpitante à relever:

la donnée de départ est un groupe de fichiers dans lesquels il y a des macros, distribuées dans des modules.


Comme un module peut-être importer et exporter, on peut le retrouver dans plusieurs fichiers.

la question est

Combien y a-t-il de modules différents dans tous ses fichiers, et comment créer un dossier où on les stock tous?


Une première solution théorique m'est déjà venu à l'esprit :

Soit le dossier M où on stock tous les modules en question.
Soit N, le nombre de modules différents

pour chaque fichier à examiner:

pour chaque module de ce fichier

pour chaque fichier de M (ancien modules exportés)

-comparer module et fichier de M. Si c'est le même, va voir le
module suivant. Sinon, aller voir fichier de M suivant.


-(On a pas trouvé module dans M): exporter module dans M et
N=N+1

fin pour
fin pour
fin pour


Bien sûr, si vous avez des idées différentes, elles m'intéressent.

Pour ce qui est de mettre en pratique l'idée précédente, j'ai (je pense avoir) déjà trouvé un moyen d'exporter tous les modules d'un fichier dans un dossier.

Par exemple, pour exporter tous les modules du classeur actif



Sub export()

Dim l As Object
Dim i As Integer
Dim s As String

For i = 1 To ActiveWorkbook.VBProject.VBComponents.Count

Set l = ActiveWorkbook.VBProject.VBComponents(i)


If l.Type = 1 Or l.Type = 2 Then
s = "C:\Documents and Settings\bellengerf\Desktop\Macros\" & l.Name & ".doc"
l.export (s)
End If
Next


End Sub

Mais le problème qui me (échec et) mate pour l'instant, c'est comment déterminer si deux fichiers sont identiques ou différents.

L'un de vous sera-t-il plus fort que l'adversité qui m'accable?


popop eircem vladaboum houpla (<- comme je commence à avoir du mal à varier la fin de mes posts, j'essaye d'inventer de nouveaux mots pour dire merci.)



Florian



ps: 1) un moyen de corser le problème: deux fichiers peuvent avoir deux
modules de nom différents, mais qui contiennent le même code.

Comment résoudre le problème précédent sans considérer que les deux modules précédents sont différents?


2) je sais que ce post est un peu long, mais je voulais vous donner le maximum d'informations.
 
L

LaurentTBT

Guest
Bonjour Florian.

Je n'ai pas le temps de traiter à fond ta question, mais voici un lien qui te donnera sans doute des idées.
Lien supprimé

Avec ceci, tu devarais trouver un moyen de comparer les modules des différents fichiers.

Bon courage, la tâche ne sera pas forcément simple.

Laurent.
 
B

bellenger florian

Guest
merci,

je viens de lire le fil en question.


toutefois, j'ai peur que l'idée "2 modules ont même nom, il s'agit du même module, 2 modules ont nom différent, il s'agit de 2 modules différents" ne soit une idée à piège... (vf ps2 de mon post)

(imaginons-nous en train de faire un audit d'un dossier où tout le monde appelle ses modules module1, module2, etc. toutes ses macros macro1 , macro2, macro3, et puis sub1, sub2, sub3 et fonction1,fonction2, fonction3 etc. et où le module1 chez l'un est le module2 chez l'autre etc... )



c'est pourquoi je pensais qu'il était plus sûr de comparer les codes. Bien sûr, on pourrait partir sur une comparaison ligne à ligne, caractère à caractère mais j'ai peur que ce soit un peu fastidieux.


En revanche, j'ai réussi à "exporter les modules" sous la forme d'un fichier word et j'ai vu qu'il y avait une option "outils/suivi des modifications/comparer des documents", ayant un "équivalent" "ActiveDocument.Compare" sous vba word qui affiche les modifications par rapport à un autre document.


Donc je me suis dit: S'il y a moyen d'afficher automatiquement les modifications entre 2 documents, il doit y avoir un moyen de savoir automatiquement s'il y a des modifications entre deux documents (donc s'ils sont identiques ou différents.)

(là, je viens de réaliser que si les modules ont un nom différent, les documents seront différents à cause de la ligne: Attribute VB_Name =
, il faudrait donc trouver un moyen de supprimer cette ligne avant de comparer les documents. Cela devient compliquer.)



j'ai donc fébrilement chercher une fonction type FileIsIdentic (file1 as object, file2 as Object) dans l'aide mais j'ai pas trouvé.

Pourtant, je pense qu'une telle fonction aurait pu être bien utile...


Comme le problème est déjà ardu (pour moi), je me suis placé dans un "monde" bipolaire modules (parfaitement) identiques, modules différents, ce qui peut amener à considérer que 2 modules sont différents à cause d'un retour-chariot en plus.

ceux qui sont un peu plus expérimenté peuvent peut-être (si le problème les intéresse et pour "le fun") se pencher sur la notion de "module à peu près identique que l'on peut par extension considérer comme identique") ,mais je pense que ce problème se situe à un autre niveau de difficulté.


florian
 
L

LaurentTBT

Guest
Rebonjour.

Je pense en effet que tu places la barre un peu haut. Tout le problème est de définir selon quels critères tu souhaites considérer les deux modules comme identiques. Et ce n'est vraiment pas simple.

Souvent, à une question posée sur ce forum, on se retrouve avec plusieurs solutions qui marchent toutes. Et pourtant, une analyse du texte des macros semble montrer des différences importantes.

Pour un même résultat, certains utiliseront par exemple des boucles For i=1 to... Next, alors que d'autres utiliseront For each... next. D'autres encore pourront parfois avoir le même résultat avec une boucle Do until...Loop, ou encore Do ...Loop While.
Autre exemple: tu peux trouver une macro relativement simple créée à l'aide de l'enregistreur de macro qui fera plusieurs lignes de code avec de nombreux Select, alors qu'un habitué de VBA te fera la "même" macro en une seule ligne, sans Select!

Bref, deux macros peuvent être identiques en terme de fonctionnalité tout en étant très différentes dans le texte.

Désolé si je suis trop pessimiste quant à ton projet. J'espère pour toi que mon analyse est fausse et que quelqu'un trouvera qand même une solution, mais j'ai des doutes...

En revanche, avec le lien que je t'ai donné, tu peux au moins comparer des macros au texte identique. Comme les macros de Michel et de moi-même sur ce même lien recopiaient intégralement le code sur des feuilles excel, tu peux alors utiliser des fonctions de comparaison d'excel.

Et pour ce qui est d'une différence de nom et uniquement de nom, tu devrais pouvoir t'en sortir, car le nom est accessible par VBA (propriété .name)

Allez, bon courage et @+.

Laurent.
 
M

michel

Guest
Bonsoir Laurent , Bonsoir Vince

Le sujet est intéressant , mais trop complexe pour mes modestes connaissances

Laurent Lien supprimé ...;o)..., a bien décrit toutes les difficultés liées à ton projet

En attendant , je ne sais pas si cela peut t'aider , mais j'ai modifié le fichier "composants vbaproject" pour pouvoir récupérer sur une seule feuille excel toutes les procédures vba se trouvant dans tous les classeurs d'un répertoire spécifique
Une fois de plus ,j'ai utilisé une procédure très pratique de @+Thierry "interface match mass links" pour récupérer les infos dans tous les classeurs
( je n'ai pas testé le fichier avec des classeurs contenant des procedure workbook_open)

Tu n'as pas précisé le nombre de classeurs et de procédures à traiter , car tout cela peut prendre beaucoup de temps…

Je me joins à Laurent pour te souhaiter bon courage

Bonne soirée
Michel
 

Pièces jointes

  • recuperer_toutes_proc_dans_repertoire.zip
    13 KB · Affichages: 21
B

bellenger florian

Guest
Bonjour,

tout d'abord, je pense que je vous dois quelques mots sur ma situation personnelle :


élève ingénieur, mon projet s'inscrit dans le travail d'un stage dont la teneur est l'analyse d'un dossier à la taille conséquente, évolutif (ce qu'il contient change), sensible, et à migrer en bout de compte.


Comme mon stage prend fin, je n'en aurais bientôt plus la responsabilité. Ce que je vais faire maintenant, c'est présenté ce que j'ai fait, remettre tout mon travail ( code inclu) à mon maître de stage, et puis l'année scolaire va reprendre.


Si j'en ai le temps, la macro dont il est question sur ce fil sera la dernière chose que j'aurais faite avant de partir.

Je vais donc essayer de voir si, grâce à votre aide, j'arrive à monter quelque-chose, sinon tant pis; j'ai déjà pas mal de chose à rendre par ailleurs.

D'ailleurs, à ce sujet, je tenais à remercier une nouvelle fois tous les participants du forum pour l'aide qu'ils m'ont apportée.

Volià, je pense qu'il était important de vous tenir informé de l'évolution de ma situation.

Et comme il y a plein d'autres personnes sur ce forum qui ont des problèmes à résoudre, je ne voudrais pas que ce problème bouffe maintenant inconsidérablement votre temps.

Donc toute avancée sur ce point sera à partir de maintenant pour et uniquement pour l'expérience du site. (Ce qui veut dire en gros, ne faîtes plus au sujet du post que j'ai posé autre chose que pour votre plaisir.)


Pour ma part, par la force des choses, je n'aurais plus à m'occuper que des problèmes des autres ce qui n'est pas forcément une mauvaise chose

J'ai encore des choses à dire pour répondre à vos questions et à vos remarques mais je dois d'abord boucler mon travail.


Florian
 

Statistiques des forums

Discussions
312 681
Messages
2 090 882
Membres
104 686
dernier inscrit
obi009