Ouverture fichier excel depuis internet

crio

XLDnaute Nouveau
Bonjour le forum,

Après moults essais et recherches sur internet, je viens vers vous car je n'arrive pas à résoudre mon problème...

Dans le cadre de mon travail, je développe un logiciel de traitement de données piloté par VBA.

A un moment donné, le programme doit aller chercher un fichier disponible sur l'Intranet.
La navigation sur celui ci est automatisée et j'arrive sur la fenêtre Internet demandant si l'utilisateur veut Ouvrir, Sauvegarder ou Annuler.
L'ouverture du fichier est commandé par l'envoi de la touche "v" à l'aide de la fonction "keybd_event".

Malheureusement, le fichier ne s'ouvre que si l'instruction suivant le "keybd_event" est "stop" ou si je mets un point d'arrêt.

J'ai essayé la méthode "DoEvents" qui redonne la main à l'ordinateur, mais cela ne fonctionne pas, le fichier n'est pas ouvert...

L'idée est d'attendre que le fichier soit ouvert pour poursuivre l'exécution du code car des traitements doivent être effectués sur ce dernier.

Existe-t-il un moyen de forcer Excel à attendre que le fichier soit ouvert pour poursuivre l'exécution du code?

D'avance je remercie celles et ceux qui se pencheront sur mon problème.
 
G

Guest

Guest
Bonjour,

difficile de répondre sans connaître exactement de quoi il retourne. Mais tu peux toujours essayer de mettre un Timer après l'envoi de la touche:

Code:
Public Sub Wait(ByVal seconds As Long)
    Dim StartTime As Long, StopTime As Long
    StartTime = Timer
    StopTime = StartTime + seconds
    Do
        DoEvents
    Loop Until Timer > StopTime
End Sub

Utilisation: Wait 1 'ou 2 ou 3.......

Ou un simple Application.SendKeys "v" , True

A+
 
Dernière modification par un modérateur:

crio

XLDnaute Nouveau
Re : Re: Ouverture fichier excel depuis internet

Malheureusement aucune de ces méthodes ne me donnent le résultat souhaité.

Mais je pense que cela vient du fait qu'on ne peut ouvrir un fichier Excel dans une fenêtre excel où tourne déjà une macro. Il faut attendre que celle ci soit terminée ou interrompue pour que le fichier sélectionné soit ouvert.

Dans ce cas, j'ai l'impression qu'il est impossible, et ce quelque soit la méthode utilisée (Wait, DoEvents, API...), d'ouvrir un fichier Excel dans une fenêtre où tourne une macro...

Néanmoins, si on peut contourner ce fait, je suis preneur.

Crio
 
G

Guest

Guest
Re,

Je te redis que sans plus de détails concernant ta macro, difficile de répondre.

j'arrive sur la fenêtre Internet demandant si l'utilisateur veut Ouvrir, Sauvegarder ou Annuler.

Sans doute as-tu initialisé une variable objet "Internet.Application"? Si oui, tu peux trouver le chemin du fichier et l'ouvrir par la méthode Open.

A+
 
G

Guest

Guest
Re,

On peut toujours ouvrir plusieurs fichiers dans la même instance Excel.
Ne pas confondre la fenêtre d'application (Instance excel) avec les fenêtres de classeur qui sont filles de la fenêtre Excel/

A+
 

crio

XLDnaute Nouveau
Re : Re: Ouverture fichier excel depuis internet

On peut toujours ouvrir plusieurs fichiers dans la même instance Excel.

Apparement pas si une macro d'un autre fichier ouvert dans l'instance est en cours d'exécution.

Pour améliorer la lisibilité de mon problème, voici le code:

Code:
Function ouverture_repertoire_derog(elt, nb_elem_verif_nb_elem) 

Dim k As Integer                    'compteur de boucle d'appel de la fonction intranet
Dim i As Integer

Dim element(1)                      'variable memoire des elements

i = 0

For k = LBound(elt) To nb_elem_verif_nb_elem - 1 Step 1

    If k <> 0 Then
        MsgBox "Ouverture du fichier du " & (k + 1) & "eme élément."
    End If
    
    element(0) = elt(k + i)
    element(1) = elt(k + i + 1)

    temps = Timer
    Do
    Loop While Timer < temps + 2
           
    Call test_ouv_intranet_simplifie(element)    
    
    i = i + 1
    
Next k

temps = Timer
Do
Loop While Timer < temps + 2

Call crea_fiche_synthese(nb_elem_verif_nb_elem)            

End Function       
'--------------------------------------------------------------------------------------
Function test_ouv_intranet_simplifie(elt)

Dim temps

Dim i As Double

Dim IE As InternetExplorer, IEdoc As Object, DOCelement As Object
Dim MonTexte1 As String, SiteWeb As String, MonTexte2 As String
 
 
SiteWeb = "http://*********"

MonTexte1 = elt(0)
MonTexte2 = elt(1)

debut:

Set IE = New InternetExplorer
IE.Visible = True
IE.Navigate SiteWeb
 
'attente de fin de chargement
Do Until IE.ReadyState = 4
Loop
 
Set IEdoc = IE.Document
 
'introduction du texte
Set DOCelement = IEdoc.getElementsByName("*******").Item 'on trouve les noms 'de champ en affichant le code source des pages intranet
DOCelement.Value = MonTexte1
 
Set DOCelement = IEdoc.getElementsByName("*******").Item 'cf ci dessus
DOCelement.Value = MonTexte2

IEdoc.all("search").Click
    
Do Until IE.ReadyState = 4
Loop

On Error GoTo gestion1
reprise:
IEdoc.all("valide").Click
    
On Error GoTo gestion2
reprise2:

Do Until IE.ReadyState = 4
Loop

On Error GoTo gestion3
reprise3:

IEdoc.all("boutonValider").Click

temps = Timer
While Timer < temps + 7.5
Wend

IE.Quit

temps = Timer
While Timer < temps + 25
Wend

On Error GoTo gestion4
reprise4:

Call keybd_EVENT(vbKeyV, 0, 0, 0)

'************************************************************
'ce qui est au dessus marche correctement, si on met un point d'arret sur la ligne qui 'suit ce commentaire, le fichier s'ouvre normalement 

Call keybd_EVENT(vbKeyV, 0, KEYEVENTF_KEYUP, 0)

DoEvents

'l'instruction "stop" permet l'ouverture des fichiers
'=> on ne peut peut etre pas ouvrir un nouveau fichier excel quand une macro est en 'train de tourner

'**********************************************************

'C'est ici que je souhaite que le fichier s'ouvre et 1 fois sur 2 ca plante.
'J'utilise la fonction "stop" pour permettre l'ouverture, mais c'est pas terrible au niveau 'utilisation et ca ne marche pas systématiquement...

Stop


If Workbooks.Count = 1 Then GoTo debut


'On Error GoTo gestion5
'reprise5:

Call copie_inter_classeur               
Call simplification_tableau             

Exit Function

gestion1:
Err.Clear
Resume reprise

gestion2:
Err.Clear
Resume reprise2

gestion3:
Err.Clear
Resume reprise3

gestion4:
Err.Clear
Resume reprise4

gestion5:
'MsgBox Err.Description & vbLf & vbLf & Err.Number
Err.Clear
Resume reprise5

End Function


Les arguments des fonctions sont:

elt: tableau contenant des données entrées par l'utilisateur (4 valeurs au total)
nb_elem_verif_nb_elem: un nombre qui conditionne le nombre de boucles d'ouverture à effectuer

Sans doute as-tu initialisé une variable objet "Internet.Application"? Si oui, tu peux trouver le chemin du fichier et l'ouvrir par la méthode Open

Le problème est que le fichier à ouvrir est stocké sur un serveur et que je ne pas son chemin d'accès. Je suis obligé de naviguer sur l'intranet pour l'ouvrir...
Après, s'il existe une fonction permettant de trouver le chemin d'accès d'un fichier spécifique se trouvant sur un serveur distant, je prends. (Mais ca risque de dépasser mes connaissances en VBA)

Effectivement ! Sauf si tu ouvres ton fichier dans une autre instance Excel... A essayer

Je voudrais qu'il s'ouvre dans la meme instance pour pouvoir facilement effectuer des opérations entre les fichiers. (je galère pas mal lorsque les fichiers sont ouverts dans des instances différentes...:(, meme avec les API de recherche de fenetre...)
 
Dernière édition:
G

Guest

Guest
Re,

Cela ne m'en dira pas beaucoup plus si ce n'est que dans ton document (IEdoc) tu dois avoir un lien vers ton fichier, c'est ce lien qu'il faut récupérer.

Si tu arrives à le récupérer, il ne restera à employé la méthode:
Code:
ActiveWorkbook.FollowHyperlink Address:=LIEN_VERS_LE_FICHIER

Tu zappera alors la fenêtre de confirmation.

Si ce n'est pas possible:

Avant IE.Quit tu attends l'ouverture de la page de confiration, tu récupères le nom du bouton "ouvrir" et tu lance son Click.

A+
 
Dernière modification par un modérateur:

crio

XLDnaute Nouveau
Re : Ouverture fichier excel depuis internet

Re,

Cela ne m'en dira pas beaucoup plus si ce n'est que dans ton document (IEdoc) tu dois avoir un lien vers ton fichier, c'est ce lien qu'il faut récupérer.

Ce n'est malheureusement pas un lien mais un bouton de validation.
Lorsque l'on clique sur ce dernier cela ouvre la fenetre de confirmation (avec les 3 boutons: "Ouvrir, Enregistrer, Annuler".

Je simule le clic du bouton "Ouvrir" via la fonction "keybd_event" en envoyant la lettre "v" qui correspond au raccourci clavier d'ouverture.

Jusque la il n'y a aucun probleme au niveau de l'exécution du code et de la navigation sur l'intranet.

Mais une fois le bouton "Ouvrir" simulé, le fichier ne se charge pas dans l'instance Excel appelante...
parce que la macro n'a pas fini son exécution.

Avant IE.Quit tu attends l'ouverture de la page de confiration, tu récupères le nom du bouton "ouvrir" et tu lance son Click

En fait, l'intranet génère une nouvelle fenêtre internet explorer qui une fois chargée affiche une boite de téléchargement.
L'instruction IE.Quit ferme l'autre fenêtre.

Le probleme c'est que sur les fenetres de téléchargement, les controles n'ont pas de nom ou alors je n'y ai pas acces car je n'ai pas le code source.

Le fichier a ouvrir se situe sur un serveur, d'où mon obligation de passer par l'intranet.

Je suis désolé de ne pas avoir d'exemple fonctionnel sous la main...

Par analogie avec mon problème, on rencontre le même souci lorsqu'on affiche un UserForm ou un MsgBox et qu'on essaye d'ouvrir un autre fichier Excel depuis un répertoire en cliquant dessus.

L'idée serait carrément de rendre la fenêtre (et non l'instance) non modale pendant une certaine durée, comme pour les UserForm, ce qui permettrait l'exécution de la commande d'ouverture.
Ceci n'est qu'une idée car je doute qu'on puisse faire ca avec une fenêtre Excel.

A+
 
Dernière édition:

GeoTrouvePas

XLDnaute Impliqué
Re : Re: Ouverture fichier excel depuis internet

On peut toujours ouvrir plusieurs fichiers dans la même instance Excel.
Ne pas confondre la fenêtre d'application (Instance excel) avec les fenêtres de classeur qui sont filles de la fenêtre Excel/

Je l'entendais bien comme ça. J'avais même lancé un post sur ce sujet pour arriver à boucler sur l'ensemble des instances ouvertes. Sans résultat probant il me semble.

L'idée serait carrément de rendre la fenêtre (et non l'instance) non modale pendant une certaine durée, comme pour les UserForm, ce qui permettrait l'exécution de la commande d'ouverture.

C'est une solution envisageable mais je ne sais pas si ça fonctionne.
J'ai déjà été confronté à ce problème et je l'avais solutionné en utilisant l'option "Ignorer les autres applications" qui se traduit en Vba par :
Code:
Application.IgnoreRemoteRequests = True

Si jamais tu as un userform d'affiché et que tu ouvres un autre classeur, celui - ci sera automatiquement ouvert dans une nouvelle instance.

A voir si c'est utilisable dans ton cas.

Mais fait bien attention avec ce paramètre. Il faut absolument penser à le remettre à false lorsque tu quittes ton classeur. Sinon à chaque double clic sur un classeur à partir de l'explorateur, ton instance Excel s'ouvrira mais pas ton classeur... Plutôt génant...
 
Dernière édition:

crio

XLDnaute Nouveau
Re : Re: Ouverture fichier excel depuis internet

C'est une solution envisageable mais je ne sais pas si ça fonctionne.
J'ai déjà été confronté à ce problème et je l'avais solutionné en utilisant l'option "Ignorer les autres applications" qui se traduit en Vba par :
Code :
Application.IgnoreRemoteRequests = True

Si jamais tu as un userform d'affiché et que tu ouvres un autre classeur, celui - ci sera automatiquement ouvert dans une nouvelle instance.

A voir si c'est utilisable dans ton cas.

Mais fait bien attention avec ce paramètre. Il faut absolument penser à le remettre à false lorsque tu quittes ton classeur. Sinon à chaque double clic sur un classeur à partir de l'explorateur, ton instance Excel s'ouvrira mais pas ton classeur... Plutôt génant..

Excellent, de cette maniere et en introduisant une latence (pour attendre la suite des instructions) ca m'ouvre effectivement le fichier cible dans une nouvelle instance.

Merci beaucoup pour l'astuce!:)

J'ai maintenant un autre souci directement lié:

Comment faire pour copier l'ensemble des données du fichier ouvert vers le classeur d'origine?
Etant donné que le classeur ouvert ne comporte qu'une seule feuille, l'idée serait de faire un simple:

Code:
Cells.Copy destination:=classeur_origine.sheets(x)

Mais je ne sais pas comment effectuer cette action vu que les classeurs sont dans des instances séparées...

Je connais néanmoins une partie du nom de la fenêtre du classeur ouvert ce qui devrait permettre de sélectionner l'instance (via API ou autre).

A+
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 655
Messages
2 111 605
Membres
111 217
dernier inscrit
aladinkabeya2