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

WinDev Discussion :

OLE Automation : Méthode Apply


Sujet :

WinDev

  1. #1
    Nouveau Candidat au Club
    OLE Automation : Méthode Apply
    Bonjour à tous,

    Je suis confrontée à un plantage dans un traitement qui utilise un objet automation Excel.
    J'utilise Excel 2016 (32 bits) et je travaille avec la version 24 de Windev.

    Cela fait 3 jours que je cherche une solution sans succès.
    Donc je fais appel à vos connaissances si vous aviez un début de solution à m'apporter, svp...

    Mon plantage survient lorsque j'appelle la méthode "Apply" sur un objet automation dynamique Excel.
    Comme je ne maîtrise pas Excel et VBA, j'enregistre d'abord une macro de ce que le programme Windev doit réaliser puis je convertis le tout en W-Langage.

    J'ai enregistré une macro afin de faire un tri sur 3 colonnes qui ont des entêtes, le tri s'effectuant sur la première colonne.
    Le traitement se déroule correctement jusqu'à l'appel de la méthode "Apply".

    Ci-dessous l'erreur qui survient lors de l'appel de la méthode "Apply" :

    Vous accédez au membre Automation Apply.
    En tentant d'invoquer la méthode <Apply> ou de lire la propriété <Apply>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
    'Erreur 800A03EC : '
    En tentant de lire la propriété <Apply>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
    'Erreur 80020003, Le membre demandé n'existe pas'
    En tentant d'invoquer la méthode <Apply>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
    'Erreur 800A03EC : '

    Et voici mon code Windev :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	//La méthode "Clear" est appelée avant de s’assurer que le tri précédent est effacé afin qu’il soit possible d’appliquer un nouveau tri
    	pautObjXLApp>>ActiveWorkbook>>Worksheets(sLettreFeuille)>>Sort>>SortFields>>Clear
     
    	// Tri des colonnes sur la colonne "Fichier"
    	pautObjXLApp>>ActiveWorkbook>>Worksheets(sLettreFeuille)>>Sort>>SortFields>>Add(pautObjXLApp>>Range("A2:C" + nNombreDeLigneParFeuille), xlSortOnValues, xlAscending, xlSortNormal)
    	pautObjXLApp>>ActiveWorkbook>>Worksheets(sLettreFeuille)>>Sort>>SetRange(pautObjXLApp>>Range("A2:C" + nNombreDeLigneParFeuille))
    	pautObjXLApp>>ActiveWorkbook>>Worksheets(sLettreFeuille)>>Sort>>Header(xlYes)
    	pautObjXLApp>>ActiveWorkbook>>Worksheets(sLettreFeuille)>>Sort>>MatchCase(False)
    	pautObjXLApp>>ActiveWorkbook>>Worksheets(sLettreFeuille)>>Sort>>Orientation(xlTopToBottom)
    	pautObjXLApp>>ActiveWorkbook>>Worksheets(sLettreFeuille)>>Sort>>SortMethod(xlPinYin)
    	// Application du tri
    	pautObjXLApp>>ActiveWorkbook>>Worksheets(sLettreFeuille)>>Sort>>Apply



    J'exécute bien Windev dans une configuration 32 bits de mon projet.

    Là où je ne comprends pas c'est que la traduction du code VBA en W-Langage provient directement d'une macro exécutée sur le fichier que je manipule en W_Langage.
    Et tout fonctionne sauf lorsque le traitement arrive à l'appel de la méthode "Apply"

    J'espère avoir été claire.
    Je vous remercie tous pour l'aide que vous voudrez bien m'apporter.

  2. #2
    Expert éminent
    Bonjour et bienvenue à toi,

    Ce n'est pas toujours simple d'adapter du VBA.

    je te mets ce lien qui, je l'espère t'aidera : https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/231820-tri-sur-colonne-excel-via-ole-automotion-fonction/read.awp
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Make it real not fantasy.

  3. #3
    Rédacteur/Modérateur

    Apply est une méthode, et donc je ferais :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    pautObjXLApp>>ActiveWorkbook>>Worksheets(sLettreFeuille)>>Sort>>Apply()
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  4. #4
    Nouveau Candidat au Club
    Bonjour,

    Merci pour vos réponses.

    Concernant la réponse de frenchsting, j'ai déjà consulté la discussion que vous m'avez indiqué. Sans succès.
    Concernant la réponse de tbc92, j'ai essayé avec et sans les parenthèses. Sans succès.

    J'ai rejoué la macro plusieurs fois sur Excel afin de voir si la sélection des cellules changeaient quelque chose. Sans succès.
    Le traitement se déroule parfaitement jusqu'à l'appel de la méthode Apply() qui fait planter le programme WinDev.

    C'est parfaitement incompréhensible, parce que la macro se déroule sans problème.

    J'ai cherché sur internet "Erreur 800A03EC" pour essayer d'avoir un début d'explication, une idée, une inspiration qui me permettrait de comprendre pourquoi la méthode échoue. Sans succès.

    Mes connaissance des macros et de VBA ne sont pas assez approfondies et c'est pourquoi j'ai posté mon message afin d'avoir de l'aide de personnes plus calées…

    En dernier recours, je n'appliquerai pas le tri sur ma feuille Excel.

    En tous cas, je vous remercie pour votre aide.

  5. #5
    Membre chevronné
    Bonjour,
    D'après ce post : https://www.developpez.net/forums/d1...rror-800a03ec/ qui renvoie à celui ci : https://www.developpez.net/forums/d1...rvice-windows/
    Il faut que le répertoire :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    C:\Windows\System32\config\systemprofile\Desktop
    existe
    Un autre post renvoie sur ce lien pour plus d'infos : https://support.microsoft.com/fr-fr/...tion-of-office
    Il y a peut être plus simple, mais ça tourne

  6. #6
    Rédacteur/Modérateur

    Pour faire un tri, ici, tu crées dans excel un objet de type 'Sort' puis tu exécutes cet objet, par la méthode Apply.

    Si tu as la possibilité, utilise une plus vieille version d'Excel pour faire ton tri. Le code généré en VBA sera totalement différent. Cet objet de type 'Sort', je pense que c'est assez récent, ou assez exotique.
    Je sais que j'avais pu faire des tris dans excel, il y a plusieurs années, et sans passer par cet objet Sort. Et tout comme toi, en générant du code VBA, et en traduisant ce code VBA vers Windev.

    Si à l'occasion je retrouve le code ...


    Pour compléter : tu passes par ce qui est décrit ici
    Et on peut passer par ce qui est décrit ici


    PS : ma proposition, c'est une solution 'dégradée'. Il n'y a pas de raison que l'objet de type SORT ne fonctionne pas. Et le dernier message de Voroltinquo est certainement la bonne direction à explorer.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  7. #7
    Nouveau Candidat au Club
    J'ai, précédemment, à cette discussion déjà vu les liens que vous me proposez.
    Y compris ceux proposés par Voroltinquo.
    J'ai créé le répertoire comme indiqué mais toujours… sans succès.
    Je n'ai malheureusement pas la possibilité de tester sur une version plus ancienne d'Excel.

    J'ai exploré les forums et les solutions proposées avant de venir demander l'aide de la communauté du site.

    Si effectivement, tbc92, tu remets la main sur ton code, je t'en remercie à l'avance.

    Je suis de la vieille école, et avant de vous appeler à l'aide, j'ai cherché par moi-même, mais là… j'avoue être dépassée.
    Ce qui m'embête le plus, c'est de ne pas comprendre pourquoi cette fichue macro fonctionne directement sous Excel, et que le code traduit en W-Langage ne fonctionne pas sur cette méthode Apply().

    En tous cas, merci à tous pour votre aide.

  8. #8
    Expert éminent
    Bonjour,

    j'ai une question : quand tu dis que tu as testé la solution présentée sur le forum de PCSOFT, tu as repris le système de variables "intermédiaire" également ?
    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
    MaFeuille est un objet automation dynamique
    MonTri est un objet automation dynamique
    MaPlage est un objet automation dynamique
     
    MaFeuille = :m_pautExcel>>Worksheets("Ventes")
    MonTri = MaFeuille>>Sort
    MonTri>>SortFields>>Clear
    MonTri>>SortFields>>Add(MaFeuille>>Range("F1:F1500"), xlSortOnValues, xlAscending, xlSortNormal)
    MaPlage = MaFeuille>>Range("F1:F1500")
    MonTri>>SetRange(MaPlage)
    MonTri>>Header(1)
    MonTri>>MatchCase(False)
    MonTri>>Orientation(1)
    MonTri>>SortMethod(1)
    MonTri>>Apply()

    Je parle de ça, car il y a fort longtemps, j'avais eu un souci du même style sur du VBA-> Windows OLE. Ce qui est déroutant, c'est que le principe est le même avec une syntaxe légèrement différente...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Make it real not fantasy.

  9. #9
    Nouveau Candidat au Club
    Oui j'ai testé avec le principe des variables intermédiaires.

    Et que ce soit par ce biais ou par un code sans variable intermédiaire.
    WinDev plante toujours au moment de l'appel de la méthode "Apply".


  10. #10
    Expert confirmé
    hello,
    cela m'étonne que ton code aille jusqu'à l'apply car il devrait y avoir des erreur sur les constantes Excel ( ex: xlSortOnValues) qui ne sont pas définies dans Windev (du moins dans la version que j'ai).
    Voici un bout de code qui fait le tri sur les 5 premières lignes de la colonne A (1ère ligne = entête) de la feuille Feuil1. J'ai remplacé les constantes par leurs valeurs numériques.
    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
    34
    35
    objXLApp est un objet Automation dynamique
    MaFeuille est un objet Automation dynamique
    // Instance de Excel existante ?
    SI ObjetActif("Excel.Application") <> Null ALORS
        // Récupération de l'instance de Excel existante
        objXLApp = ObjetActif("Excel.Application")
    SINON
        // Allocation de l'objet automation Excel
        objXLApp = allouer un objet Automation "Excel.Application"
    FIN
    SI objXLApp = Null ALORS
        Erreur("Impossible de lancer Excel.")
        RETOUR
    FIN
    objXLApp>>Visible = Vrai
    objXLApp>>workbooks>>Open("F:\temp\excel\monclasseur.xlsx") // ouvre le classeur
    MaFeuille = objXLApp>>Worksheets("Feuil1")
    MaFeuille>>Sort>>SortFields>>Clear
    // xlSortOnValues = 0, xlAscending = 1, xlSortNormal = 0
    MaFeuille>>Sort>>SortFields>>Add(MaFeuille>>Range("A2:A5"), 0 , 1, 0)
    MaFeuille>>Sort>>SetRange(MaFeuille>>Range("A1:A5"))
    // xlYes = 1
    MaFeuille>>Sort>>Header(1)
    MaFeuille>>Sort>>MatchCase(Faux)
    // xlTopToBottom = 1
    MaFeuille>>Sort>>Orientation(1)
    // xlPinYin = 1
    MaFeuille>>Sort>>SortMethod(1)
    // Application du tri
    MaFeuille>>Sort>>Apply()
     
     
    // objXLApp>>ActiveWorkbook>>Close()
    // objXLApp>>Quit()
    // libérer objXLApp


    Testé avec Windev 16 et Excel 2010

    Edit : Il y avait une autre erreur : Pour trier sur plusieurs colonnes il faut rajouter un sortfields>>add par colonne. Exemple :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    MaFeuille>>Sort>>SortFields>>Add(MaFeuille>>Range("A2:A5"), 0 , 1, 0)
    MaFeuille>>Sort>>SortFields>>Add(MaFeuille>>Range("B2:B5"), 0 , 1, 0)
    MaFeuille>>Sort>>SortFields>>Add(MaFeuille>>Range("C2:C5"), 0 , 1, 0)




    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko