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

VBA Discussion :

Utilisation pratique des API SendMessage ou PostMessage


Sujet :

VBA

  1. #1
    Nouveau membre du Club
    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
    Points : 30
    Points
    30
    Par défaut Utilisation pratique des API SendMessage ou PostMessage
    Bonjour

    J'ai une application assez lourde en Excel dont le but est d'extraire des informations de documents PDF, Word, Excel, PowerPoint ou encore des fichiers image, sachant que je convertis les images et les PDF en .rtf pour les analyser comme du Word.

    Du fait que ces extractions se font à partir de règles descriptives telles que : Extraire toutes les lignes à partir de la n° 2 de la colonne QUANTITÉ du tableau dont le titre supérieur commence par Ventes de l'année ou encore Extraire toutes les plages de texte du document commençant par un texte en gras, en police ARIAL ou COLIBRI de taille 12 à 16 et finissant au premier changement visuel - l'utilisateur doit disposer nativement d'environ 150 à 200 critères de ce type, sans compter tous ceux qu'il peut écrire par lui-même dans un classeur externe -, le traitement de pré-analyse des documents est devenu lourd et donc malheureusement lent.
    Étonnement lent je devrais dire car concernant les documents que je traite sous Word (.doc et . rtf issus de documents océrisés), je viens de constater que le même traitement réalisé nativement en VBA sous Word s'exécute entre 10 et 40 fois plus rapidement qu'en VBA sous Excel.
    Je vais donc devoir "sous-traiter" une partie de mon code à Word en arrière-plan.
    Jusqu'ici, j'avais prévu des "fenêtres d'avancement" (UserForms) qui permettent de rassurer l'utilisateur sur le bon fonctionnement du programme. Ces fenêtres font notamment état de l'action en cours (ouverture du document, analyse des tableaux, etc.) mais indiquent également le pourcentage d'avancement de l'action en cours ainsi qu'un pourcentage évalué global.
    Je souhaite maintenir ces fenêtres en place.
    Entre autres solutions, j'ai commencé à explorer les API SendMessage et PostMessage : je voudrais que Word adresse régulièrement à mes fenêtres d'avancement Excel des données qui permettent de les actualiser.
    • Pour le moment, je n'ai réussi qu'à modifier le bandeau de mes fenêtres : en pratique le bandeau est masqué pour être remplacé par un affichage personnalisé et donc ça ne me gênerait pas de récupérer les informations d'avancement via le bandeau, mais à ma connaissance il n'y a pas d'évènement "Bandeau_change".
    • Je sais comment identifier le handle de ma fenêtre d'avancement ou celui d'un éventuel TextBox qui recevrait le message, mais la syntaxe des SendMessage / PostMessage m'échappe
    • Et d'ailleurs, quelle API choisir ? Si j'ai bien compris, SendMessage attend un code retour alors que PostMessage est totalement asynchrone, mais est-ce la seule différence (sachant que j'ai déjà un début de réponse : j'ai réussi à faire marcher SendMessage (mal, mais bon) mais pas PostMessage.

    Vos lumières seraient les bienvenues

    Merci d'avance
    Gilbert

  2. #2
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 35
    Points : 55
    Points
    55
    Par défaut Pas besoin d'API
    Bonjour Gilbert,

    Si vous souhaitez transiter des informations entre Excel et Word, dans votre cas il suffit de créer un objet en PublicNotCreatable dans Excel qui contient les méthodes et propriétés que vous voulez appeler depuis Word, un fois le code Word lancé, faites un callback vers Excel pour récupérer l'objet en late binding que vous pourrez manipuler depuis Word et donc le processus est hote dans Excel.

    Je pourrai vous envoyer un exemple ce week-end car je n'ai pas de pc sous la main.

    Bonne continuation.
    Power Tree - Complément Excel
    www.xl-powertree.com
    Analysez et consolidez vos tableaux Excel

  3. #3
    Nouveau membre du Club
    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
    Points : 30
    Points
    30
    Par défaut
    Bonjour Araigné

    Un grand merci pour cette suggestion : je ne connaissais pas du tout.

    Si vous pouvez m'envoyer un exemple, c'est sûr que cela m'arrangerait.

    Bonne journée
    Gilbert

  4. #4
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274

  5. #5
    Nouveau membre du Club
    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
    Points : 30
    Points
    30
    Par défaut
    Bonjour Kiki, le 29ème du nom, à moins que ce ne soit Kiki-le-Breton (moi je suis d'origine Normande, personne n'est parfait )

    En fait, je ne m'intéresse pas seulement au contenu (= au texte) mais aussi à sa mise en forme et à sa position dans la page.
    Je veux ainsi que l'utilisateur puisse par exemple dire au logiciel de :
    • de récupérer le texte qui se trouve dans un "cadre" de x cm de large sur y cm de haut, situé à xx cm du haut de la page (voire de la marge haute apparente) et à yy cm du bord gauche de la page (voire de la marge gauche apparente)
    • ou encore de récupérer la ou les plages de texte qui commencent par du texte en telle couleur (à n% près) et dans telle police ou telle autre et qui finissent au premier texte espacé verticalement de plus de 1 cm

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 35
    Points : 55
    Points
    55
    Par défaut Chose promi....
    Bonjour Giblert,

    Voici l'exemple en pj.
    Pour les plus curieux le code utilisé.

    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
     
     
    'Dans un module de classe appelé InterfaceWordToExcel
    'A mettre en PublicNotCreatable
    'Cet objet servira à communiquer entre Word et Excel.
     
    Option Explicit
     
    Public Sub ExempleMessage(Message As String)
     
        Call MsgBox(Message)
     
    End Sub
     
    Public Sub ExemplePrint(Val As Long)
     
        Debug.Print Val
     
    End Sub
    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
     
    'Dans un module std d'Excel
     
    Option Explicit
     
    Public Sub Exemple()
     
        Dim WdApp As Object
        Set WdApp = CreateObject("Word.Application")
     
        Dim WdDoc As Object
        Set WdDoc = WdApp.Documents.Open(ThisWorkbook.Path & "\Doc Word hote du code.docm")
     
        Call WdApp.Run("DebutCodeWord", New InterfaceWordToExcel)
     
        Call WdDoc.Close(False)
        Call WdApp.Quit
     
        Set WdDoc = Nothing
        Set WdApp = Nothing
     
    End Sub
    Et enfin le code dans 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
    Option Explicit
    'Dans un module std
     
    Public Sub DebutCodeWord(ObjetExcel As Object)
        'Il prend en entré l'objet Excel qui nous sert à retourner dans Excel
        Call ObjetExcel.ExempleMessage("Début")
     
        Dim i As Long
     
        For i = 0 To 99
            Call ObjetExcel.ExemplePrint(i)
        Next
     
        Call ObjetExcel.ExempleMessage("Fin")
     
    End Sub
    J'espère que tu réussira à implémenter la méthodologie sans trop de difficulté.
    @+
    Fichiers attachés Fichiers attachés
    Power Tree - Complément Excel
    www.xl-powertree.com
    Analysez et consolidez vos tableaux Excel

  7. #7
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par CognitiKom Voir le message
    Bonjour Kiki, le 29ème du nom, à moins que ce ne soit Kiki-le-Breton (moi je suis d'origine Normande, personne n'est parfait )
    Mes ancêtres de France aussi. (Fécamp)
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  8. #8
    Nouveau membre du Club
    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
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par araigné Voir le message
    Bonjour Giblert,

    Voici l'exemple en pj.
    Pour les plus curieux le code utilisé.

    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
     
     
    'Dans un module de classe appelé InterfaceWordToExcel
    'A mettre en PublicNotCreatable
    'Cet objet servira à communiquer entre Word et Excel.
     
    Option Explicit
     
    Public Sub ExempleMessage(Message As String)
     
        Call MsgBox(Message)
     
    End Sub
     
    Public Sub ExemplePrint(Val As Long)
     
        Debug.Print Val
     
    End Sub
    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
     
    'Dans un module std d'Excel
     
    Option Explicit
     
    Public Sub Exemple()
     
        Dim WdApp As Object
        Set WdApp = CreateObject("Word.Application")
     
        Dim WdDoc As Object
        Set WdDoc = WdApp.Documents.Open(ThisWorkbook.Path & "\Doc Word hote du code.docm")
     
        Call WdApp.Run("DebutCodeWord", New InterfaceWordToExcel)
     
        Call WdDoc.Close(False)
        Call WdApp.Quit
     
        Set WdDoc = Nothing
        Set WdApp = Nothing
     
    End Sub
    Et enfin le code dans 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
    Option Explicit
    'Dans un module std
     
    Public Sub DebutCodeWord(ObjetExcel As Object)
        'Il prend en entré l'objet Excel qui nous sert à retourner dans Excel
        Call ObjetExcel.ExempleMessage("Début")
     
        Dim i As Long
     
        For i = 0 To 99
            Call ObjetExcel.ExemplePrint(i)
        Next
     
        Call ObjetExcel.ExempleMessage("Fin")
     
    End Sub
    J'espère que tu réussira à implémenter la méthodologie sans trop de difficulté.
    @+
    Un grand merci !

    C'est super. Tu me sauves

    Gilbert

  9. #9
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 35
    Points : 55
    Points
    55
    Par défaut
    À ce point là!!! :-D
    Bonne chance pour la suite de ton projet.

    Raphaël.
    Power Tree - Complément Excel
    www.xl-powertree.com
    Analysez et consolidez vos tableaux Excel

  10. #10
    Nouveau membre du Club
    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
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par araigné Voir le message
    À ce point là!!! :-D
    Non, quand même pas
    Mais c'est vrai qu'avec les dizaines de difficultés que j'ai rencontrées jusqu'ici sur ce projet, une de moins est la bienvenue...

    Gilbert

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

Discussions similaires

  1. Bioinfo : utilisation des API EnsEMBL en perl
    Par bluemartini dans le forum Contribuez
    Réponses: 5
    Dernier message: 19/09/2013, 15h49
  2. Utilisation des API .Net
    Par pc152 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/06/2009, 12h25
  3. [VB.Net][Fichier ini] utilisation des API
    Par DonF dans le forum Windows Forms
    Réponses: 5
    Dernier message: 09/03/2009, 15h32
  4. Utilisation des API .NET depuis Java ?
    Par yjuliet dans le forum VB.NET
    Réponses: 0
    Dernier message: 17/02/2009, 11h59
  5. Utilisation des API MySQL // ADO ou BDE ? (sujet 2)
    Par rohstev dans le forum C++Builder
    Réponses: 8
    Dernier message: 07/11/2003, 11h50

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