web-dev-qa-db-fra.com

Contrôle Excel VBA IE intranet local

Donc, j'utilise le code VBA d'Excel pour cliquer sur un bouton de notre site Web, croyez-moi, je sais que ce n'est pas la meilleure des choses à faire, mais c'est l'option la moins répréhensible à ma disposition pour le moment.

Donc, ce choix hors du chemin, voici mon problème, je peux utiliser ce code, charger avec succès imdb.com, Google, etc. Mais lorsque je charge notre site local, je perds le contrôle de l'objet ie, je ne peux pas check readyState, je ne peux pas quitter. Voici l'erreur que je reçois . Erreur d'exécution '-2147023179 (800706b5)':

Erreur d'automatisation L'interface est inconnue.

De temps en temps, je reçois le message suivant: Erreur d'exécution '-2147417848 (80010108)':

Erreur d’automatisation .__ L’objet appelé a été déconnecté de ses clients.

En cliquant sur Debug indique le ie.readyState, j'ai également essayé de commenter cela et puis il pointe vers ie.Quit

Sub dothestuff()
    Dim ie As InternetExplorer
    Set ie = New InternetExplorer
    ie.Visible = True

    ie.Navigate "http://www.google.com/"
    anerror = webload(ie)

    ie.Quit
    Set ie = Nothing
End Sub

Function webload(ie)
    Do Until ie.ReadyState = READYSTATE_COMPLETE
        DoEvents
    Loop
End Function
14
Varyl

Voici une solution rapide et facile à ce problème:

Au lieu de:

set IE = createobject("internetexplorer.application")

Utilisation:

Set IE = New InternetExplorerMedium

Pas besoin de modifier les paramètres IE

27
Vigneshts88

Voici ce qui se passe. Lorsque votre navigateur "saute" en interne vers une zone de sécurité différente - d'une adresse locale à une adresse inTRAnet ou à une adresse inTERnet, par exemple - IE ferme/supprime le processus en cours de IE et en ouvre une autre avec sécurité renforcée. Les anciens et nouveaux processus IE sont des processus enfants IE pour la tâche parent IE. Vous ne le voyez donc pas se produire ni en regardant le navigateur, ni en regardant le processus dans le Gestionnaire des tâches. Si vous utilisez Process Explorer (gratuit de Microsoft), vous pouvez voir que cela se produit.

Ce que vous devez faire dans ce type d’environnement est d’utiliser la solution d’Anup Upadhyay ci-dessus. Son extrait de code examine toutes les tâches IE (les parents et les enfants ne font aucune différence) et trouve le nouveau processus IE qui pointe vers l'adresse Web à laquelle le processus d'origine a été attribué. Tant que plusieurs navigateurs ne sont pas ouverts à la même adresse, le nouveau processus sera trouvé de manière fiable et se poursuivra comme prévu.

Remarque: vous devrez peut-être également utiliser l'objet InternetExplorerMedium par opposition à l'objet InternetExplorer . Il est également préférable de "tenir" une session.

Voici ma version qui est presque la même chose que celle d'Anup.

Références pour MS Office VBA:

  • Contrôles Internet Microsoft

  • Contrôles et automatisation Microsoft Shell

n

Dim IE As InternetExplorerMedium ' This object (the "medium" variety as opposed to "InternetExplorer") is necessary in our security climate
Dim targetURL As String
Dim webContent As String
Dim sh
Dim eachIE

targetURL = "[your URL here]"
Set IE = New InternetExplorerMedium
IE.Visible = False ' Set to true to watch what's happening
IE.Navigate targetURL

While IE.Busy
  DoEvents
  Wend

Do
  Set sh = New Shell32.Shell
  For Each eachIE In sh.Windows
    If InStr(1, eachIE.LocationURL, targetURL) Then
      Set IE = eachIE
      'IE.Visible = False  'This is here because in some environments, the new process defaults to Visible.  
      Exit Do
      End If
    Next eachIE
  Loop
Set eachIE = Nothing
Set sh = Nothing

While IE.Busy  ' The new process may still be busy even after you find it
  DoEvents
  Wend
17
Jim M

Essaye celui-là:

Set IE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
6
Rick

Nous avons eu ce problème en utilisant IE9. Cela est dû aux paramètres de sécurité. Il existe un paramètre appelé "Activer le mode protégé" dans l'onglet "Sécurité" de la boîte de dialogue "Options Internet" (outils ... options Internet). Chaque "zone" peut avoir un paramètre différent pour "activer le mode protégé" Nous avons décoché "activer le mode protégé" et cela a résolu notre problème. Je pense que ce qui se passe, c’est que lorsqu’on bascule vers une zone en mode protégé, IE démarre un nouveau processus permettant de gérer le trafic dans cette zone (ce qui peut tuer l’ancien processus). Lorsque cela se produit, votre variable d'objet IE dans VBA est déconnectée d'Internet Explorer.

6
Gove

Très bien, je viens de trouver une solution et j'ai décidé par désespoir d'essayer de charger 127.0.0.1 au lieu de localhost, bien entendu, aucun problème, donc résolu l'adresse IP du serveur intranet local, et maintenant je suis prêt à partir ..__ ne comprends pas vraiment pourquoi, mais cela a résolu mon problème.

4
Varyl
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False
IE.Navigate "C:\abc.html"

"Nous obtenons une erreur ici, j'ai trouvé une petite solution alternative délicate pour cela, comme suit:" Prenez la référence pour Microsoft Shell Controls And Automation. ". Utilisez le code ci-dessous pour réaffecter un objet IE à la connexion perdue problème

Dim sh
Dim eachIE
Do

    Set sh = New Shell32.Shell
    For Each eachIE In sh.Windows
        ' Check if this is the desired URL

' Here you can use your condition except .html
' If you want to use your URL , then put the URL below in the code for condition check.
    ' This code will reassign your IE object with the same reference for navigation and your issue will resolve.
' 
        If InStr(1, eachIE.locationurl, ".html") Then 
        Set IE = eachIE
        Exit Do
        End If
    Next eachIE
Loop
4
Anup Upadhyay

Pour moi, ce qui suit a fonctionné:

  1. Ouvrez Internet Explorer
  2. Aller aux outils
  3. Aller aux options Internet
  4. Passer à l'onglet Sécurité
  5. Cliquez sur Sites de confiance
  6. Sites de clic
  7. Vous verrez l'URL du site, sélectionnez-le
  8. Cliquez sur Supprimer
  9. Cliquez sur fermer, appliquer et OK

Ps. J'ai testé ces étapes sur le navigateur IE 8.

2
student

Une autre solution.. 

Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate ("http://URLOnMyIntranet/site.html")
IE.Visible = True

Set IE = nothing
Set objShellApp = CreateObject("Shell.Application")
For Each objWindow In objShellApp.Windows
    Debug.Print objWindow.LocationName
     If LCase(objWindow.LocationName) = LCase("Your windows name, use debug to find out") Then
            Set IE = objWindow
     End If
Next

Notez que, si vous utilisez InternetExplorerMedium (voir les autres réponses), vous pouvez également utiliser la propriété Url obj.LocationURL au lieu du nom de la fenêtre, qui serait plus précise. Voir d'autres réponses.

1
ozmike

Peut-être que vous rencontrez un problème de liaison? C'est une erreur étrange à obtenir pour cela.

Essayez ce code (adapté de http://www.excely.com/Excel-vba/ie-automation.shtml ). Espérons que cela aide:

Option Explicit

' lasts for the life of Excel being open
Dim ie As Object

Sub dothestuff()
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
    ie.Navigate "http://www.google.com/"

    Do While ie.Busy
        DoEvents
    Loop

    ie.Quit
    Set ie = Nothing
End Sub
1
Joseph

Je rencontre exactement le même problème avec un site Web qui se trouve dans l'intranet de notre société et qui est également inclus dans mes sites de confiance. La désactivation du mode protégé me permet de vérifier ReadyState, mais uniquement si je désactive la zone Internet en plus des sites intranet et de confiance.

Pourquoi l'activation du mode protégé pour la zone Internet provoquerait-elle l'erreur d'automatisation lors de la vérification de ReadyState sur un site de confiance? Existe-t-il un moyen de contourner ce problème sans désactiver le mode protégé pour la zone Internet? 

1
engineer_dave