IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Récupérer les macros Office en VB6


Sujet :

VB 6 et antérieur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 21
    Points : 13
    Points
    13
    Par défaut [Réouverture] Récupérer les macros Office en VB6
    Bonjour,

    Je débute en VB et je souhaite réaliser une application VB6 (pas de .Net) qui sache ouvrir un document Office (Word, Excel, Access) et en extraire le code des macros présentes dans ce document. J'ai trouvé l'excellent tutoriel sur la manipulation des fichiers en VB sur ce site, mais je n'ai rien trouvé sur la manipulation des macros.

    Quelqu'un pourrait éclairer ma lanterne?

    Merci

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup !!!

    Oui, d'après le tuto, je peux ouvrir des macros et récupérer le contenu de chaque module, donc c'est absolument parfait.

    Encore merci

  4. #4
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Ouah !

    Il tue ce tuto (tue tôt)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Je me permet de faire remonter mon thread. Mon appli avance bien et je n'ai plus que les macros à extraire. Je rappelle le contexte : Il s'agit d'une appli VB6 qui va scanner le poste à la recherche des fichiers bureautique.

    Cependant, le tuto ci-dessus est basé sur du VBA et donc certaines fonctions ne marchent pas en VB simple (ou alors il manque quelques chose). Par exemple, pour lister les modules d'un classeur excel, j'ai essayé d'adapter la fonction trouvée sur le tuto comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Sub Main()
    'Nécéssite d'activer la référence
    '"Visual basic For Application Extensibility 5.3"
    '
    Dim i As Integer, Ajout As Integer, x As Integer
    Dim Msg As String
    Dim VBCmp As VBComponent
    Dim Wb As Workbook
     
    'Indiquez le nom du classeur ouvert
    'Set Wb = ThisWorkbook
    Set Wb = Workbooks("c:\Classeur1.xls")
     
    Ajout = 1
    For Each VBCmp In Wb.VBProject.VBComponents
        Msg = VBCmp.Name
     
        With Cells(Ajout, 1)
            .Interior.ColorIndex = 6
            .Value = Msg
        End With
     
        x = Wb.VBProject.VBComponents(Msg).CodeModule.CountOfLines
        For i = 1 To x
            Cells(Ajout + i, 1) = _
                Wb.VBProject.VBComponents(Msg).CodeModule.Lines(i, 1)
        Next
     
        Ajout = Ajout + x + 2
    Next VBCmp
    End Sub
    Mais à l'ouverture du fichier, j'ai un message d'erreur : "indice en dehors de la plage".

    Soit la fonction WorkBooks fonctionne différemment en VB, soit il me manque quelque chose de préalable du style création d'un objet application excel.
    J'ai essayé de substituer la ligne avec WorkBooks par ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    appExcel = CreateObject("Excel.Application")
    FichierExcel = appExcel.Workbooks.Open("c:\Classeur1.xls")
    Mais ca n'a pas donné mieux.

    Pourriez-vous de nouveau m'aider?

    Merci

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 147
    Points
    20 147
    Par défaut
    bonjour


    Tu peux essayer cette adaptation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    'Nécéssite d'activer les références
    '"Visual basic For Application Extensibility 5.3"
    'et
    '"Microsoft Excel xx.x Object Library"
    '
    Dim i As Integer, Ajout As Integer, x As Integer
    Dim Msg As String
    Dim VBCmp As VBComponent
    Dim xlApp As Excel.Application
    Dim Wb As Excel.Workbook
     
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    Set Wb = xlApp.Workbooks.Open("C:\Classeur1.xls")
     
    Ajout = 1
     
    For Each VBCmp In Wb.VBProject.VBComponents
        Msg = VBCmp.Name
     
        With Cells(Ajout, 1)
            .Interior.ColorIndex = 6
            .Value = Msg
        End With
     
        x = Wb.VBProject.VBComponents(Msg).CodeModule.CountOfLines
        For i = 1 To x
            Cells(Ajout + i, 1) = _
                Wb.VBProject.VBComponents(Msg).CodeModule.Lines(i, 1)
        Next
     
        Ajout = Ajout + x + 2
    Next VBCmp

    michel

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Merci! Ca ouvre bien le fichier, par contre, j'ai deux autres messages d'erreur qui suivent maintenant :

    Erreur 1004 : L'accès par programme au projet Visual Basic n'est pas fiable.

    Puis quand je relance en débogage (je me suis dit que cette erreur pouvait être occultée) :

    Erreur 1004 : La méthode 'VBProject' de l'objet '_Workbook' a échoué.

    Je remets le code, puisque j'ai adapté la partie basse pour tout récupérer dans un msgbox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Sub Main()
    'Nécéssite d'activer la référence
    '"Visual basic For Application Extensibility 5.3"
    '
    Dim i As Integer, Ajout As Integer, x As Integer
    Dim Msg As String
    Dim VBCmp As VBComponent
    Dim xlApp As Excel.Application
    Dim Wb As Excel.Workbook
     
    Set xlApp = CreateObject("Excel.Application")
    'xlApp.Visible = True
    Set Wb = xlApp.Workbooks.Open("C:\Classeur1.xls")
     
     
    For Each VBCmp In Wb.VBProject.VBComponents
        Msg = VBCmp.Name
    '
    '    With Cells(Ajout, 1)
    '        .Interior.ColorIndex = 6
    '        .Value = Msg
    '    End With
     
        x = Wb.VBProject.VBComponents(Msg).CodeModule.CountOfLines
        Dim temp As String
        temp = ""
        For i = 1 To x
            temp = temp & Wb.VBProject.VBComponents(Msg).CodeModule.Lines(i, 1)
        Next
        MsgBox temp
     
    Next VBCmp
    End Sub
    Je continue de chercher de mon coté, mais si quelqu'un a une idée, je suis prenneur

    EDIT : Je viens de trouver la solution sur le net : Cette erreur arrive quand le Visual Basic n'est pas défini comme source sûre dans Excel. Pour l'activer, il faut aller sous Excel dans Outils -> Macros -> Sécurité -> Onglet Editeurs approuvés et cocher la case "Faire confiance au projet Visual Basic" (sic). Je vais faire un essai pour savoir s'il faut cocher cette p... d'option sur chaque ordinateur qu'on scanne ou non et je reviens le dire ici

    RE-EDIT : Effectivement, ca marche sur un autre ordinateur sans activer l'option "faire confiance à...". Ceci est peut être dû au fait que sous W2K3, tout est super vérouillé par défaut. Sur un XP de base, ca marche.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Je remonte une fois de plus mon thread pour compléter les informations et poser des questions. J'ai quelques petits soucis avec cette méthode :

    1) J'ai couplé ce bout de code à un programme de scan de disque pour sortir tous les fichiers Excel. Ca marche pas trop mal, cependant, dans sa version basique, il ne ferme pas les instances Excel ouvertes et donc ca propovque rapidement une gros problème de mémoire.
    Pour résoudre ce problème, il suffit de fermer les instances et les documents à l'aide de ces quelques lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Set Wb = Nothing
        xlApp.Workbooks.Close
        xlApp.Quit
    Set xlApp = Nothing
    Il relance Excel à chaque fichier xls scanné, mais au moins, il n'en n'ouvre pas des centaines. Si quelqu'un arrive à fermer uniquement le fichier tout en conservant Excel ouvert, je suis preneur. Quand j'ai essayé, il m'a ralé dessus parce qu'il n'aimait pas avoirt deux fichiers nommés pareil ouverts en même temps. C'est donc que je n'ai pas réussi à uniquement fermer les fichiers sans fermer Excel.

    2) Après le scan de certains fichiers comportant des macros, il me demande si je veux enregistrer les modifs. Il suffit de faire croire à Excel que le classeur a été sauvegardé à l'aide de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        xlApp.ActiveWorkbook.Saved = True
    juste avant le close.[/code]

    3) Certains fichiers Excel ont une macro qui s'éxécute à l'ouverture. Ca me pose problème car je ne sais pas comment désactiver ça. Quelqu'un a une idée?
    EDIT : Il suffit d'ajouter la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlApp.EnableEvents = False
    4) Il faudrait aussi que je scanne les macros des fichiers Word et Access. , je suppose qu'il faut évidemment changer l'application lancée. Par contre, ça m'étonnerait que la propriété Workbooks marche sous Word et Excel et je ne connais pas les méthodes d'accès pour ces applis.

    Merci de m'aider pour ces problèmes

    Boris

  9. #9
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    La FAQ et les tutoriels devraient pouvoir te renseigner...

Discussions similaires

  1. Récupérer les comptes office outlook
    Par subzero01 dans le forum Outlook
    Réponses: 3
    Dernier message: 18/09/2008, 19h39
  2. [VB6] MySQL Comment récupérer les données ?
    Par budylove dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 22/02/2006, 14h58
  3. [VB6]Récupérer les classes d'un projet
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 08/01/2006, 10h26
  4. [VB6] Récupérer les états Access ?
    Par Commodore dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 16/11/2005, 11h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo