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

Macros et VBA Excel Discussion :

Problèmes de performances dans le pilotage de WORD depuis VBA dans EXCEL [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 99
    Par défaut Problèmes de performances dans le pilotage de WORD depuis VBA dans EXCEL
    Bonjour

    Est-il logique, selon vous, que le même traitement sur un document Word s'exécute entre 10 et 40 fois moins vite (selon la charge de la machine) sous Excel en VBA que depuis Word, en VBA.

    Je travaille sur une tablette Surface 2 Pro sous Windows 10 / Office 2013 avec 8 Go de RAM...

    Voici un exemple très simplifié du code que j'exécute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        With Processus_Word.ActiveDocument    
            For N°_de_shape = 1 To .Shapes.Count        
                For N°_de_paragraphe = 1 To .Shapes(N°_de_shape).TextFrame.TextRange.Paragraphs.Count                    
                    If .Shapes(N°_de_shape).TextFrame.TextRange.Paragraphs(N°_de_paragraphe).Range.Characters(1).Information(wdWithInTable) = True Then
                        Nombre_de_paragraphes_dans_un_tableau = Nombre_de_paragraphes_dans_un_tableau + 1
                    Else
                        Nombre_de_paragraphes_hors_tableau = Nombre_de_paragraphes_hors_tableau + 1
                    End If
                Next N°_de_paragraphe            
            Next N°_de_shape        
        End With
    En fait, j'ai les mêmes problèmes de lenteur quand j'analyse le texte dans un tableau ou non et dans un shape ou non...

    J'ai bien entendu essayé d'ajouter des SET Shape_Courant = ... ou encore des SET Paragraphe_courant = ..., mais le gain est insignifiant.

    Avez vous déjà été confrontés à ce problème ?

    Merci d'avance

    Gilbert

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    sur le papier, ca me paraitrait logique que Excel + Word consomment plus que Excel seul ou Word seul...
    Hormis les boucles qui pourraient etre remplacees par des For Each, la simple ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If .Shapes(N°_de_shape).TextFrame.TextRange.Paragraphs(N°_de_paragraphe).Range.Characters(1).Information(wdWithInTable) = True Then
    peut etre reduite en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If .Shapes(N°_de_shape).TextFrame.TextRange.Paragraphs(N°_de_paragraphe).Range.Characters(1).Information(wdWithInTable) Then
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre confirmé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 99
    Par défaut
    Bonjour

    Merci pour ta réponse.

    Je suis d'accord avec toi : ça ne peut pas être aussi rapide depuis Excel que nativement dans Word. Mais de là à passer jusqu'à 40 fois plus de temps...
    J'aurais trouvé acceptable un delta de + 20% à + 50 %. J'en suis très loin.
    Pour donner un ordre de grandeur, sur un document Word contenant grosso-modo 300 paragraphes dans 16 shapes, le petit bout de code que j'ai mis en exemple demande entre 2,5 et 4 secondes nativement sous Word, alors qu'il en demande de 26 à 170 depuis Excel.

    Pour ce qui est de remplacer les boucles par des For Each, je ne peux pas car j'ai besoin d'utiliser les n° de paragraphe, de shape ou encore de tableau.

    Excellente suggestion concernant la suppression des "= True" dans mes tests, mais la raison au fait que je les mette est un peu tordue :
    • par le passé, certains langages que j'utilisais l'imposaient (les vieilles habitudes perdurent)
    • mais surtout, tout ce qui me permet de diminuer la lisibilité de mon code après obfuscation m'arrange tant qu'il reste lisible dans son écriture "native" : en fait je n'écris même pas "= True" mais "= GLF_True", sachant que j'ai défini par ailleurs "GLF_True = True". Une fois obfusqué, mon "= GLF_True" devient un truc du genre "= A£_i5" : une petite pierre de plus dans le mur que je construit pour protéger mon code...

    Par acquis de conscience, je viens de mesurer l'impact : il est de l'ordre 29 %, mais négligeable en pratique (sur 1 milliard de tests, ça me permettrait de gagner 2,8 secondes..., or là je n'en fais que 300 )

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Moi, je dirais de laisser la macro dans Word et de l'appeler à partir d'Excel avec :

    En tout cas, quelqu'un l'a déjà fait et en est sorti bien content.

    Il faut sans doute adapter, et le résultat ne sera peut-être pas époustouflant parce que c'était un cas plutôt particulier, mais bon...

  5. #5
    Membre confirmé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 99
    Par défaut
    Bonsoir

    Merci pour ta suggestion : je crois que je vais être obligé de m'y résigner si je veux des performances acceptables...
    Si j'ai rechigné jusqu'ici à m'engager dans cette voie c'est pour 2 raisons :
    • j'affiche une petite fenêtre d'avancement sous Excel que je mets à jour au fur et à mesure de la progression de mes traitements : je ne peux pas la reporter dans Word car une bonne part de mes traitements est réalisée en VBA Excel sans interaction avec Word... Si je veux la piloter depuis Word, je risque de me retrouver avec des soucis de performances "dans l'autre sens"
      Conclusion : ça risque d'être compliqué de préserver cet affichage
    • le but de mes traitements en VBA Word est de construire un modèle Excel de mon document : je pourrais restituer l'analyse Word sous forme d'un fichier à plat, mais c'est plus complexe que ça car je reporte les couleurs du texte et du fonds ainsi que le gras, le souligné, l'italique, la police, etc. directement dans mes cellules Excel

    Une question stupide : comment faire de façon concrète ?
    • j'imagine qu'il faut que je crée un .dotm contenant la ou les macros dont j'ai besoin
    • mais du coup comment ouvrir mes documents existants Word ou RTF (issus, par exemple, de l'océrisation de fichiers PDF ou autres) selon ce modèle ?


    Gilbert

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 236
    Par défaut
    hello,
    Citation Envoyé par CognitiKom Voir le message
    Une question stupide : comment faire de façon concrète ?
    Voici ce que je viens d'expérimenter :
    Sous Word dans l'éditeur VBA , dans le projet Normal (qui doit correspondre à Normal.dotm) , j'ai créer un module avec cette fonction dedans :
    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
    Public Function NbParagraphes() As Variant
     Dim Nombre_de_paragraphes_dans_un_tableau, Nombre_de_paragraphes_hors_tableau As Integer
     Nombre_de_paragraphes_hors_tableau = 0
     Nombre_de_paragraphes_dans_un_tableau = 0
     With ActiveDocument
            For N°_de_shape = 1 To .Shapes.Count
                For N°_de_paragraphe = 1 To .Shapes(N°_de_shape).TextFrame.TextRange.Paragraphs.Count
                    If .Shapes(N°_de_shape).TextFrame.TextRange.Paragraphs(N°_de_paragraphe).Range.Characters(1).Information(wdWithInTable) = True Then
                        Nombre_de_paragraphes_dans_un_tableau = Nombre_de_paragraphes_dans_un_tableau + 1
                    Else
                        Nombre_de_paragraphes_hors_tableau = Nombre_de_paragraphes_hors_tableau + 1
                    End If
                Next N°_de_paragraphe
            Next N°_de_shape
        End With
        'MsgBox Nombre_de_paragraphes_hors_tableau
        NbParagraphes = Array(Nombre_de_paragraphes_hors_tableau, Nombre_de_paragraphes_dans_un_tableau)
     End Function
    Le fait de mettre la fonction dans un module de Normal la rend accessible à tous les documents Word qu'on ouvre (à confirmer ? )

    et voici comment je l'exécute à partir d'excel , en ouvrant un document word :
    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
    Sub Test_Word_Macro()
     Dim wdApp As Object, monDoc As Object
        Dim strFile As String
        strFile = "F:\temp\test.docx"
        On Error Resume Next
        Set wdApp = GetObject(, "Word.Application")
        If Err.Number <> 0 Then
            Set wdApp = CreateObject("Word.Application")
        End If
        Err.Clear
        On Error GoTo 0
        wdApp.Visible = True ' mettre à False si la macro fonctionne
        Set monDoc = wdApp.Documents.Open(strFile)
        Dim Resultat As Variant
        Resultat = wdApp.Run("NbParagraphes")
        MsgBox "Nb paragraphes hors tableaux : " & Resultat(0) & " - " & _
               "Nb paragraphes dans tableaux : " & Resultat(1)
        monDoc.Close
        wdApp.Quit
    End Sub
    j'obtiens bien les résultats de la macro dans la fenêtre de dialogue qui s'ouvre.
    Testé avec Word et Excel 2010 sous windows 7 .

    Ami calmant, J.P

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] savegarder dans un meme document word depuis une macro Excel
    Par jabranejb dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/12/2012, 22h51
  2. Comment écrire en VBA dans des signets de Word ?
    Par franck92300 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 09/11/2009, 07h52
  3. Pilotage entête word depuis excel
    Par hitmax dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/08/2008, 08h11
  4. Pilotage entête word depuis excel
    Par hitmax dans le forum VBA Word
    Réponses: 4
    Dernier message: 05/08/2008, 08h04
  5. Réponses: 1
    Dernier message: 15/07/2008, 10h37

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