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

Contribuez Discussion :

Automatiser l'ouverture d'un fichier compatible Excel depuis le Web (téléchargement)


Sujet :

Contribuez

  1. #61
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonjour,
    avant de voir ce que ramène EnumChildWindows il y a un truc que je ne comprends pas dans le test que tu as posté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hwndIE = FindWindow("DirectUIHWND", vbNullString)
    A mon avis tu ne peux pas utiliser FindWindow pour capter le handle de "DirectUIHWND" car ce n'est pas une fenêtre de niveau supérieur. De plus c'est la fenêtre enfant de la "Frame Notification Bar" et même celle-ci ne peut être captée via FindWindow donc ça ne peut pas fonctionner...es-tu sûr de ton test ?
    A+

  2. #62
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    En ajoutant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    et en modifiant la sub Test comme suit :
    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
     
    Sub test()
    Dim hwndIE As Long, hWnDEuronext As Long, hWnDbandeau As Long
    Dim Alister As Long
     
    'on capte le handle de la fenêtre Euronext et on teste s'il y a des fenêtres enfant
    hWnDEuronext = FindWindow("IEFrame", vbNullString)
    Alister = EnumChildWindows(hWnDEuronext, AddressOf EnumChildProc, 0)
     
    'on capte le handle de la fenêtre du bandeau et on teste s'il y a des fenêtres enfant
    hWnDbandeau = FindWindowEx(hWnDEuronext, 0&, "Frame Notification Bar", vbNullString)
    Alister = EnumChildWindows(hWnDbandeau, AddressOf EnumChildProc, 0)
     
    'on capte le handle de la fenêtre enfant du bandeau et on teste s'il y a des fenêtres enfant
    hwndIE = FindWindowEx(hWnDbandeau, 0&, "DirectUIHWND", vbNullString)
    Alister = EnumChildWindows(hwndIE, AddressOf EnumChildProc, 0)
    End Sub
    EnumChildWindows ramène les bons résultats.
    A+
    David

  3. #63
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    Autrement dit le findwindow sur les fenêtres enfants et même en ayant la classe écrit en dur n'est fiable
    c'est ce que j'en avais deduis
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #64
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Non ce n'est pas qu'il n'est pas fiable c'est qu'il n'est pas fait pour cela.
    La fonction FindWindow récupère le handle d'une fenêtre de top niveau. Elle ne recherche pas les fenêtres enfants.
    Donc à partir du moment où tu ne recherches pas une fenêtre de top niveau cela ne sert à rien de l'utiliser.
    Il te faut utiliser FindWindowEx ou GetWindow avec la constante correspondante mais attention, après cela dépend de ce que tu recherches exactement car les 2 peuvent peut-être donner des résultats différents en fonction de la configuration de l'arborescence des fenêtres (à vérifier).
    A+

  5. #65
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut nouvelles
    Bonjour,

    Désolé pour le moment pas suivi votre conversation...mais en revanche pour vous confirmer que tout ce qui a été fait jusqu'à présent fonctionne à merveille.
    MERCI A VOUS TOUS, C'est vraiment formidable
    Tests toujours en cours mais il ne devrait plus y avoir de raisons pour qu'un probléme de fiabilité apparaisse maintenant...encore 2-3 mois de tests
    A bientôt

  6. #66
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut ca marche nickel
    Bonjour,

    Pour vous dire que jusqu'à présent tout marche nickel
    MERCI A VOUS TOUS

  7. #67
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut une question
    Bonjour,

    Marc tu as raison il faut suivant les sites et si navigation sous IE ralonger le temps de La ligne vide n°23 de ton post #3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Application.Wait Now + 0.00001 … Sans cette pause inférieure à une seconde, le fichier ne s'ouvre pas ! à 
    Application.Wait Now + 0.00003 c'est préférable car sinon parfois trop court ca plante!!!
    Sinon lors du clic automatique sur enregistrer le fichier vient par défaut s'enregistrer dans le répertoire téléchargement avec un nom prédéfinit...peut on changer cela, ou alors faut il attendre que le fichier soit chargé dans ce répertoire pour ensuite le déplacer et le renommer avec VBA?

    bonne soirée

  8. #68
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Attention, il y a maldonne ! Bien relire le titre de la deuxième étape de ce post #3 …
    Il ne s'agit donc pas d'enregistrer le fichier mais de son ouverture automatique dans Excel !
    Et comme c'est une URL, IE enregistre temporairement le fichier en local comme précisé dans le post #10 …

    Si tu as le besoin de conserver le fichier, au lieu de bidouiller IE encore à coup de Sendkeys, diverses solutions :
    • copie du fichier temporaire dans un dossier de sauvegarde
    • via la requête, les données étant déjà chargées en mémoire, les sauvegarder directement dans un fichier
    • télécharger le fichier via l'API URLDownloadToFile (chapître IX du tutoriel VBA et développement Web) …

    Vouloir tout totomatiser ne donne parfois comme résultat qu'un joli coulis !
    Comme déjà signalé, le meilleur compromis est une solution semi-automatique.
    Par exemple si le nom du fichier ou le répertoire de destination change,
    mieux vaut lancer via un premier bouton IE et laisser l'utilisateur télécharger le fichier
    puis via un second bouton lancer l'importation du fichier téléchargé …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #69
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    Bonjour marc,

    d'accord, d'accord mais il faut que tu m'expliques un petit peu plus en détail...

    En effet jusqu'à présent seul le bouton ouvrir fut testé avec ton code...Pour le moment pas bidouiller IE ni autre juste bouton enregistrer à la place d'ouvrir
    Pour info l'option enregistrer existe aussi, je l'ai testé pour voir en format texte(sur nasdaq) car là il me faut du format texte ...au début elle ne marchait pas car :

    L’erreur qui empêchait la validation de la pop up venait du fait que le temps d’attente après validation de la pop up par le sendkey n’était pas suffisant tout simplement !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Application.Wait Now + 0.00001 'temps d'attente trop court qui ne permet pas à l'enregistrement de se lancer
    Application.Wait Now + 0.00003 'temps d'attente suffisant qui permet à l'enregistrement de se lancer
    Donc ce que tu as fait marche nickel et tout aussi bien pour l'option cliquer bouton ouvrir que le bouton enregistrer!!! BRAVO
    par contre lors du clic sur enregistrer il n'y a bien sûr pas clic aussi sur ouvrir...
    et aprés clic le fichier va s'enregistrer comme tu l'indiques :IE enregistre temporairement le fichier en local comme précisé dans le post #10
    Ici ma question était de savoir si je laissait IE l'enregistrer avec un nom et un répertoire définit par IE puis si aprés je le retravaillais pour le mettre à la bonne place avec le bon nom et le bon répertoire...
    c'est ce que tu indiques en option 1: copie du fichier temporaire dans un dossier de sauvegarde
    Peux tu me dire comment retrouver le nom et le répertoire temporaire (avec quoi devant .path pour l'identifier et le recopier au bon endroit? (je mets debug print *.path pour le moment sans succés avec validation du bonton enregistrer mais j'arrive pas à tracer le fichier sa destination et son nom il me manque quelque chose type name, path...)Donc pour l'instant je renomme et réenregistre manuellement au bon endroit!!!

    Sinon je ferais ton option 2 avec ouvir: via la requête, les données étant déjà chargées en mémoire, les sauvegarder directement dans un fichier

    Pour l'option 3 : télécharger le fichier via l'API URLDownloadToFile (chapître IX du tutoriel VBA et développement Web) …étude à venir

    En tout cas bravo parce que ta méthode marche partout et elle est robuste elle ne tombe pas en panne...d'ailleurs rien de ce qui a été fait jusqu'à présent avec vous tous n'est à ce jour tombé en panne ni n'a eu de probléme quelconque. et maintenant ca fait quand même 3 mois d'utilisation

  10. #70
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Oui, pour la temporisation j'avais prévenu …

    C'est pour cela dans un contexte professionnel, après avoir exposé contraintes & éventuels soucis,
    s'il faut vraiment en passer par le pilotage d'Internet Explorer (méthode présentée comme dernier recours),
    souvent la solution retenue est un téléchargement manuel puis importation automatisée dans Excel
    ou bien comme dans la première étape de cette contribution une gestion semi-automatique …
    J'ai aussi eu après une gestion toute automatique la demande de l'abandonner
    suite à trop de fluctuations du site (temps de réponse, modifications de la page source) …

    Une fois le classeur ouvert, la propriété Path contient son chemin … (exemple ActiveWorkbook.Path)

    Cette contribution décrit l'importation d'un fichier via une URL dans Excel,
    démontrant même si c'est envisageable en pilotant IE mieux vaut utiliser une requête !

    Même sans importer les données dans Excel, le plus fiable et le plus rapide étant une requête,
    pourquoi donc alors vouloir piloter IE bien plus aléatoire et long ?‼
    Quel est exactement le besoin ? Un lien vers la page en question ?
    (Normalement cela mériterait une nouvelle discussion dans le forum dédié au VBA …)

    _____________________________________________________________________________________________________
    Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. (Confucius)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  11. #71
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    Une fois le classeur ouvert, la propriété Path contient son chemin … (exemple ActiveWorkbook.Path)
    Mieux : la propriété FullName contenant le chemin complet d'accès au fichier (dossier & nom) …

    De mon côté les données ne sont plus importées en pilotant IE malgré l'ouverture dans Excel du fichier CSV source !
    En fait le préfixe du nom du fichier a changé, prouvant encore une fois l'automatisation via IE n'est pas pérenne …

    Modification de la ligne n°36 du code du post #1 : If OK And ActiveWorkbook.Name Like "*_Equities_EU_*.csv" Then

    Insérer entre les lignes n°39 & 40 cette ligne : Debug.Print .FullName

    Le chemin complet du fichier temporaire chargé est alors indiqué dans la fenêtre Exécution.

    Mais bon, je préfère sauvegarder directement le résultat d'une requête (ResponseText) dans un fichier !

    _____________________________________________________________________________________________________
    L’important, le principal, est de savoir ce qu’il faut observer. (Edgar Allan Poe)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  12. #72
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    Merci Marc étude avec fullname (bientôt)

    Oui pour le reste toujours d'accord avec toi requête le top mais ici sur le site dont voici l'url directe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    url = "https://community.nasdaq.com/login.aspx?ReturnURL=%2fMyPortfolio.aspx" 'pour aller directement sur
    'la page souhaitee
    il faut entrer un mail et un pass...on pourra créer un exemple test ici si tu veux c'est tout simple...

    puis ensuite encore se balader sur 2-3 pages web (j'ai bien repéré par contre que l'url générée aprés était toujours la même et avec le même id dedans donc une idée fut d'inscrire directement cette url au départ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    url = "http://www.nasdaq.com/portfolio/community-pt.aspx?clientid={*********}&pagename=community-pt&community=Y&ptname={*}"
    mais non ca ne passe pas la barrière à l'entrée et retour sur l'url initiale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    url = "https://community.nasdaq.com/login.aspx?ReturnURL=%2fMyPortfolio.aspx"
    donc pour le moment pilotage par IE puis étape page par page (cela fait comme cela marche, c'est déjà un trés bon point)
    Peut être peut on améliorer par une requête...pas encore étudié
    Bon we

  13. #73
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    J'ai déjà vu par requête une connexion sur la page de login d'un site avec passage en paramètres de l'ID et du mot de passe
    ainsi qu'une redirection vers une autre page du site dans le même Send mais cela avait l'air spécifique au site …

    Pour ton community.nasdaq, il faudrait déjà intercepter les requêtes de chaque étape.
    Mais bon si c'est pour de l'utilisation ponctuelle, vu que tu as déjà une solution en pilotant IE …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  14. #74
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut oui
    Bonjour Marc,

    oui inutile de compliquer les choses en effet tout marche, et IE suffit amplement pour une utilisation ponctuelle entièrement d'accord...

  15. #75
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 67
    Points
    67
    Par défaut
    Bonjour PatrickToulon et Davido84,
    Le sujet a été passionnant sur les API, je me suis cassé comme vous les dents avec les nouvelles versions de IE, mais aussi office 2010.
    Certains objet(boutons,listbox etc...) n'ont plus d'ID, du coup, il n'est plus possible de retrouver les Hwnds et d'envoyer des infos via SendMessage, PostMessage etc...
    Sous VBA, je me suis résolu à travailler avec keybd_event ou SendKeys.

    Je fais un hors sujet:
    Il est possible de piloter ces fameux objets, mais il faut passé en Visual Studio et faire de l'UI automation avec la fonction AutomationElement.
    Je pilote Mozilla avec cette méthode.
    Le plan B est d'écrire une DLL en .NET et l'utiliser en VBA.
    Si vous utilisez UiSpy(Microsoft), vous pourrez récupérer les infos non visibles avec Spy, WinID, winspector etc...

    A+
    Thierry


    Citation Envoyé par patricktoulon Voir le message
    re
    Autrement dit le findwindow sur les fenêtres enfants et même en ayant la classe écrit en dur n'est fiable
    c'est ce que j'en avais deduis

  16. #76
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Améliorations de la seconde étape pour l'ouverture automatique d'un fichier dans Excel en pilotant IE.

    Rappel : le plus efficace est de ne pas piloter IE mais de juste reproduire la requête utilisée dans la page
    comme dans la troisième étape du post #20 …

    S'il est nécessaire de piloter IE, le point faible de la seconde étape est la temporisation fluctuante
    d'un ordinateur à un autre ou selon l'état de charge du réseau.

    La première amélioration consiste à détecter la présence du bandeau de téléchargement
    remplaçant ainsi une temporisation hasardeuse ou trop longue.

    Quant à la seconde amélioration, il n'est plus question de simuler une séquence de touches du clavier
    mais de déclencher directement dans le bandeau de téléchargement le bouton d'ouverture du fichier !


    Deux références doivent être activées au sein du projet VBA :

    Microsoft Internet Controls (pas obligatoire via CreateObject mais comme la référence suivante est nécessaire …)
    UIAutomationClient.

    Cette dernière peut poser problème sous Seven avec un message « Erreur de chargement de la DLL » !
    Ne pas perdre de temps à tenter de bidouiller Windows car l'astuce est simple :
    via la commande d'Excel Enregistrer sous … pointer le dossier C:\Windows\System32
    comme pour enregistrer le classeur puis Annuler … Retourner activer la référence côté VBE.

    (Ceux ne s'en sortant pas pour activer cette référence, conserver alors la simulation des touches et
    voir l'exemple de cette discussion pour la détection du bandeau …)


    Ces références activées, copier l'intégralité de ce code dans le module ThisWorkbook du classeur :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #If Win64 Then
        Private Declare PtrSafe Function FindWindowExA& Lib "user32" (ByVal hParent&, ByVal hChild&, ByVal ClassName$, ByVal WindowName$)
        Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal MilliSeconds&)
    #Else
        Private Declare Function FindWindowExA& Lib "user32" (ByVal hParent&, ByVal hChild&, ByVal ClassName$, ByVal WindowName$)
        Private Declare Sub Sleep Lib "kernel32" (ByVal MilliSeconds&)
    #End If
     
    Const MSG = "DemoEuroNextCsvIEAuto :", PROC = "ThisWorkbook.IEAuto"
      Dim IE As New InternetExplorer, D As Date, H&, T!
     
    Sub DemoEuroNextCsvIEAuto()
        Const EG = "edit-go"
               T = Timer
        IE.Navigate "https://www.euronext.com/fr/popup/data/download?ml=nyx_pd_stocks&cmd=default&formKey=nyx_pd_filter_values%3A1006ef55d4998cc0fad71db6a6f38530"
                  While IE.Busy Or IE.ReadyState < READYSTATE_COMPLETE:  DoEvents:  Wend
        If Not IsObject(IE.Document.all(EG)) Then
            IE.Visible = True:  T = 0:  Beep:  Set IE = Nothing
        Else
            With Application
             If IIf(.UseSystemSeparators, .International(xlDecimalSeparator), .DecimalSeparator) = "," Then _
                                   IE.Document.all("edit-decimal-separator-2").Checked = True
            End With
                                   IE.Document.all("edit-format-2").Checked = True
                                   IE.Document.all(EG).Click
            Do:  H = FindWindowExA(IE.HWND, 0&, "Frame Notification Bar", vbNullString):  Loop Until H
    '        Sleep 700
            IE.Visible = True
                IEAuto
        End If
    End Sub
     
    Private Sub IEAuto()
            Dim oIUIAIP As IUIAutomationInvokePattern, oCUIA As New CUIAutomation
            On Error Resume Next
            Set oIUIAIP = oCUIA.ElementFromHandle(ByVal H).FindFirst(TreeScope_Subtree, _
                          oCUIA.CreatePropertyCondition(UIA_NamePropertyId, "Ouvrir")). _
                                      GetCurrentPattern(UIA_InvokePatternId)
                oIUIAIP.Invoke
            Set oIUIAIP = Nothing:  Set oCUIA = Nothing
        If Err.Number Then
            Debug.Print MSG; Err.Number
            T = 0:  Beep:  Set IE = Nothing
        Else
            D = Now + 0.00002:  Application.OnTime D, PROC
        End If
    End Sub
     
    Private Sub Workbook_Deactivate()
        If ActiveWorkbook.Name Like "*_Equities_EU_*.csv" And T Then
             Debug.Print MSG; Format$(Timer - T, " 0.000s")
             On Error Resume Next
             Application.OnTime D, PROC, , False
             T = 0:  IE.Quit:  Set IE = Nothing
             On Error GoTo 0
             Application.ScreenUpdating = False
        With ActiveWorkbook.ActiveSheet.Cells(1).CurrentRegion
                Feuil1.Name = .Cells(2, 1).Value & " " & .Cells(3, 1).Text
                .Cells(4, 1).Clear:             Feuil1.UsedRange.Clear
                .Cells(5, 1).CurrentRegion.Copy Feuil1.Cells(2, 2)
            With Feuil1.Cells(2, 2).CurrentRegion
                Union(.Columns(5), .Columns(11)).HorizontalAlignment = xlCenter
                   Union(.Columns("F:I"), .Columns(13)).NumberFormat = "#,##0.000 "
                                           .Columns(12).NumberFormat = "#,##0 "
                 .Columns("A:D").AutoFit:  .Columns(10).AutoFit:  .Columns(13).AutoFit
            End With
                .Rows(1).Copy Feuil1.Cells(2)
        End With
             ActiveWorkbook.Close False
        With Feuil1
            .[G1:N1].HorizontalAlignment = xlCenter
            .Cells(2).CurrentRegion.Columns(4).Replace "é", "é", xlPart
            .Activate:  Cells(2, 1).Select:  ActiveWindow.FreezePanes = True
        End With
             Application.ScreenUpdating = True
        End If
    End Sub
     
    ' • Temporisations : - ligne 27 : conditionne l'ouverture du premier coup (effet "flash")
    '                    - ligne 45 : délai du prochain IEAuto en cas de loupé (1 jour = 86400s * 0.00002 = 1.7s)
     
    ' • Ligne 37 : bouton à déclencher
    A l'exécution, la fenêtre d'Internet Explorer apparaît seulement après la détection du bandeau de téléchargement
    (ligne de code n°26) puis après environ deux secondes le bouton Ouvrir est déclenché (ligne n°39) …

    Ce marquage de deux secondes est en fait dû à un loupé lors du premier appel de la procédure IEAuto
    car le téléchargement n'est pas encore prêt lors de l'apparition du bandeau comme on peut le voir en testant l'URL
    par exemple via le navigateur Firefox n'affichant pas un bandeau mais une fenêtre de téléchargement :
    le bouton OK est grisé quelques dixièmes de seconde avant d'être disponible …
    C'est la raison pour laquelle en fin de la procédure IEAuto est programmé un nouvel appel de cette même procédure
    dans un délai raisonnable afin de laisser le temps au fichier d'être téléchargé puis ouvert dans Excel
    (ligne n°45 & voir le commentaire à la fin du code).

    Si le fichier est bien ouvert dans Excel mais que retentit quand même un bip, augmenter le délai de la ligne n°45 …

    Pour accélérer un peu le traitement, il suffit d'insérer une pause (si, si !) avant le primo appel d'IEAuto
    pour déclencher du premier coup le bouton : activer la ligne n°27 en supprimant l'apostrophe du début.
    (A noter l'instruction Wait pour un temps équivalent au Sleep voir même supérieur est ici moins efficace !)
    La valeur 500 passe pour deux ordinateurs de tests mais pas pour un troisième …

    Si cette pause est suffisante, à peine apparue la fenêtre d'IE qu'elle disparait aussitôt, l'effet flash !
    Sinon, c'est comme avec la ligne en commentaire, il y a une attente avant le second appel d'IEAuto

    Comme souligné dans la discussion en lien avant le code, depuis la version 11 si Internet Explorer est fermé
    avant l'ouverture du fichier dans Excel (dans le cas d'un retour entre Excel & IE)
    il risque de subsister en mémoire un résiduel d'IE rendant impossible sa réouverture ultérieure :
    il faut alors le supprimer via le Gestionnaire des tâches de Windows !
    A noter aussi la fermeture complète d'IE11 pouvant prendre quelques secondes, laisser lui le temps de se fermer avant
    de l'ouvrir de nouveau sinon apparaîtra le même message d'erreur « Un arrêt du système a déjà été programmé » …

    _________________________________________________________________________________________________________

    Test réussi : merci alors de cliquer sur
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  17. #77
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour marc
    ca ne fonctionne pas chez moi le cuiautomation W7 64 office 2007/ ie11
    Nom : Capture.JPG
Affichages : 1244
Taille : 148,7 Ko

    si j'active la reference j'ai une erreur de chargement de Dll

    vat-il falloir déménager du syswow en system32??? hein!!!!!

    je vais faire une recherche sur la question
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #78
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    Testé de mon côté avec Seven & Excel 2003 & IE9 et
    Windows 8.1 & Excel 2010 & IE11 (la version .0.33 me posant pourtant problème en VBScript) …

    Pour référencer la dll, tenter aussi en pointant vers C:\Windows\SysWOW64 …

    J'ai essayé les deux avec succès et sans voir de différence même si les dll n'ont pas la même taille.
    Je me suis aussi renseigné sur la question (pour un projet autre qu'IE) et tous n'évoquent que System32 …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  19. #79
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    j'ai vu par ici et la des version de ton ieauto en late binding mais c'est assez usine a gaz
    par contre j'ai pas saisi le sens de ta dernière réponse
    Pour référencer la dll, tenter aussi en pointant vers C:\Windows\SysWOW64 …
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #80
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    J'ai pourtant clairement indiqué l'astuce pour référencer la dll dans le post #76 : faire semblant d'Enregistrer sous … !

    Ne me dit pas que t'as juste copié le code encore une fois sans rien lire ‼

    Si les deux références ne sont pas activées, ce n'est pas la peine comme je l'ai aussi indiqué avant le code …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

Discussions similaires

  1. Forcer l'ouverture d'un fichier avec Excel
    Par Cda01 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/12/2011, 15h47
  2. [XL-2003] Ouverture d'un fichier par excel en 3 exemplaires
    Par basto dans le forum Excel
    Réponses: 1
    Dernier message: 25/08/2009, 17h05
  3. ouverture d'un fichier avec excel sous vs.net 2003
    Par lesultan2007 dans le forum VB.NET
    Réponses: 2
    Dernier message: 29/07/2009, 15h46
  4. Telecharger un fichier excel depuis le web via PERL
    Par ptimos93800 dans le forum Web
    Réponses: 3
    Dernier message: 19/03/2009, 18h38
  5. [vbexcel]automatiser l'ouverture d'un fichier
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/12/2005, 17h33

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