2012-10-18 18 views
13

Używam kodu Excel VBA do kliknięcia przycisku na naszej stronie internetowej, zaufaj mi, wiem, że to nie jest najlepsze z rzeczy do zrobienia, ale jest to najmniej kontrowersyjna opcja dostępna dla mnie w tym czasie.Excel VBA Kontrolowanie lokalnego intranetu IE

Tak więc, ten wybór znika, oto mój problem, mogę używać tego kodu, ładować z powodzeniem imdb.com, google itp. Ale kiedy ładuję naszą lokalną stronę, tracę kontrolę nad tym obiektem, Nie mogę sprawdzić stanu gotowości, nie mogę wyjść. Oto błąd, który dostaję. Run-time error '-2147023179 (800706b5)':

błąd Automatyka Interfejs jest nieznany

Każdy tak często, że zamiast dostać tę wiadomość: Run-time error '-2147417848 (80010108)':

Błąd automatyzacji Wywołany obiekt odłączył się od klientów.

Kliknięcie Debug wskazuje ie.readyState, próbowałem również komentując, że na zewnątrz, a następnie zwraca się do 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 
+0

Dla wszystkich innych, którzy zmagają się z tego rodzaju problemami, znalazłem rozwiązanie i skompilowałem podsumowanie z przykładowymi instrukcjami [tutaj] (https://stackoverflow.com/a/45016781/3410218). Nie polega na używaniu stałego adresu IP ani na zmianie ustawień zabezpieczeń i nie ma potrzeby dołączania odniesień do niczego. To powiedziawszy, bardzo dziękuję za wszystkie uwagi i cenne sugestie - wydaje się, że to błąd w sposobie obsługi zdarzeń w IE w odniesieniu do stref bezpieczeństwa. – user3410218

Odpowiedz

22

Oto szybkie i łatwe rozwiązanie tego problemu:

Zamiast:

set IE = createobject("internetexplorer.application") 

Zastosowanie:

Set IE = New InternetExplorerMedium 

Nie ma potrzeby, aby dostosować IE ustawienia

+4

' InternetExplorerMedium' wymaga odniesienia do ' Microsoft Internet Controls' – Mike

1

Może masz problem z wiążące? To dziwny błąd, aby to uzyskać.

Spróbuj tego kodu (zaadaptowanego z http://www.excely.com/excel-vba/ie-automation.shtml). Mam nadzieję, że to pomaga:

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 
+0

Niestety nie, wciąż otrzymuję tę samą wiadomość z tą zmianą, nadal działa z publicznymi domenami, takimi jak google.com, ale localhost nie działa. – Varyl

+0

to witryna intranetowa na komputerze lub serwerze w intranecie? –

+0

serwer w intranecie, właśnie testowałem to samo z serwerem localhost hostowanym na tym komputerze, dokładnie te same błędy. – Varyl

4

porządku, po prostu znalazł rozwiązanie, z rozpaczy postanowił spróbować ładowania 127.0.0.1 zamiast localhost, na pewno wystarczy, żadnych problemów, więc rozwiązany adres IP serwera lokalnego intranetu, a teraz jestem dobry. Naprawdę nie rozumiem dlaczego, ale to rozwiązało mój problem.

+0

Po prostu ciekawy, czy użyłeś "http: // localhost /" (bez spacji) lub po prostu localhost w URL? –

+0

Użyłem http: // localhost/(bez spacji) Sposób, w jaki to zrobiłem, był używany http: //127.0.0.1/ (bez spacji) – Varyl

+0

dzięki za informacje. nie wiem, dlaczego to działa, ale nie tak jak w inny sposób ... ale dobrze jest wiedzieć o jakimkolwiek przyszłym kodowaniu, które mogę zrobić :) –

6

Mieliśmy ten problem używając IE9. Powstaje z powodu ustawień bezpieczeństwa. Na karcie "Zabezpieczenia" w oknie dialogowym "Opcje internetowe" znajduje się ustawienie "Włącz tryb chroniony" (narzędzia ... opcje internetowe). Każda "strefa" może mieć inne ustawienie "włącz tryb chroniony" Usunęliśmy zaznaczenie "włącz tryb chroniony", co rozwiązało nasz problem. Myślę, że dzieje się tak, że po przełączeniu do strefy w trybie chronionym, IE rozpoczyna nowy proces obsługi ruchu w tej strefie (może zabicie starego procesu). Gdy tak się stanie, zmienna obiektu IE w VBA zostanie rozłączona z Internet Explorerem.

+1

Dziękujemy! Pracowałem nad tym, próbując wszystkiego pod słońcem w VBA! Wiele późniejszych gogli, doszedłem do tego i rozwiązało problem. Otrzymałem różne błędy runtime wszystkie w tej samej linii. To doprowadzało mnie do szału! – PermaNoob

+0

Tyle problemów ... tyle rezolucji ... ten pracował dla mnie. – GibralterTop

4

Spróbuj tego:

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

To działa. Nie pewny dlaczego. –

+0

Clever, to jest po prostu id klasa InternetExplorerMedium, który nie ma ProgID chyba je utworzyć, na przykład InternetExplorer.ApplicationMedium: [HKEY_CLASSES_ROOT \ InternetExplorer.ApplicationMedium] [HKEY_CLASSES_ROOT \ InternetExplorer.ApplicationMedium \ CLSID] @ = "{D5E8041D -920F-45e9-B8FB-B1DEB82C6E5E} "Zobacz https://blogs.msdn.microsoft.com/ieinternals/2011/08/03/default-integrity-level-and-automation/ – WizzleWuzzle

1

Mam dokładnie ten sam problem w pracy z witryny, która jest wewnątrz naszej firmy i intranetu jest również zawarty w moich zaufanych witryn. Wyłączenie trybu chronionego pozwala mi sprawdzić ReadyState, ale tylko jeśli wyłączę dla strefy internetowej oprócz intranetu i zaufanych stron.

Dlaczego włączenie trybu chronionego strefy internetowej powodowałoby błąd automatyczny podczas sprawdzania ReadyState na zaufanej stronie? Czy istnieje sposób obejścia tego bez wyłączania trybu chronionego dla strefy internetowej?

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

"Jesteśmy gettin Błąd tu g, znalazłem mały trudne alternatywne rozwiązanie dla tego, jak poniżej „Take odniesienia dla formantów Microsoft Shell i Automatyzacji ” Użyj poniższego kodu, aby przypisać IE obiekt za utraconym kwestii połączenia

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 
15

Oto co się dzieje . Kiedy twoja przeglądarka wewnętrznie "przeskakuje" do innej strefy bezpieczeństwa - od powiedzmy adres lokalny do adresu inTRAnet lub do adresu inTERnet - IE zamyka/upuszcza bieżący proces IE i otwiera inny z bardziej rygorystycznymi zabezpieczeniami. Stare i nowe procesy IE są procesami potomnymi IE do rodzica zadania IE, więc nie widzisz tego ani przez oglądanie przeglądarki lub oglądanie procesu w Menedżerze zadań. Jeśli używasz Process Explorer (darmowy od Microsoft), możesz to zobaczyć.

To, co musisz zrobić w tym środowisku, to rozwiązanie Anup Upadhyay powyżej. Jego fragment kodu wygląda na wszystkie zadania IE (rodzic i dziecko nie ma znaczenia) i znajduje nowy proces IE, który wskazuje adres internetowy, który został podany pierwotny proces. Dopóki nie masz wielu przeglądarek otwartych na ten sam adres, nowy proces będzie niezawodny i będzie kontynuowany tak, jakbyś tego oczekiwał.

Uwaga: Można również trzeba użyć InternetExplorerMedium obiektu w przeciwieństwie do InternetExplorer obiektu. Lepiej jest też "trzymać się" sesji.

Oto moja wersja, która jest prawie taka sama jak Anup.

Referencje dla MS Office VBA:

  • Microsoft Internet Sterowanie

  • Sterowanie
  • Microsoft Shell i Automatyzacji

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 
+0

To zadziałało dla mnie świetnie. Dziękuję Ci! – CaffeinatedCoder

1

Innym tak lution ..

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 

Uwaga, używając InternetExplorerMedium (zobacz inne odpowiedzi) zazwyczaj wszystko, czego potrzebujesz, FYI również można użyć właściwość url obj.LocationURL zamiast nazwy okna, które byłoby bardziej dokładne. Zobacz inne odpowiedzi.

2

Dla mnie, co następuje pracowali:

  1. Explorer Otwórz program Internet
  2. Przejdź do narzędzi
  3. Goto Opcje internetowe
  4. Przełącz na karcie Zabezpieczenia
  5. kliknij ikonę Zaufane witryny
  6. strony Kliknij
  7. Zobaczysz adres strony, wybierz go
  8. Kliknij Usuń
  9. kliknij przycisk Zamknij, stosuje i Ok

Ps. Testowałem te kroki w przeglądarce IE 8.

+0

Pracowałem także dla mnie, dzięki (Internet explorer 11) – kjack

+0

@kjack Cieszę się, że to wiem! – xameeramir