0

Ich versuche, eine Datei mit Speichern als über die Frame-Benachrichtigungsleiste Internet Explorer herunterladen. Allerdings habe ich nach vielen Suchen nur Lösungen gefunden, die auf save in der Rahmenbenachrichtigungsleiste klicken. Bisher habe ich versucht, wie die Datei auf dem Probenort zu speichern:VBA - wählen Sie Speichern als aus dem Rahmen Benachrichtigungsleiste des Internet Explorers

http://www.tvsubtitles.net/subtitle-114117.html

mit dem folgenden Code:

' Add referenses 
' Microsoft Internet Controls 
' Microsoft HTML Object Library 
' UIAutomationClient (copy file from C:\Windows\System32\UIAutomationCore.dll to Documents Folder) 

#If VBA7 Then 
    Private Declare PtrSafe Function FindWindowEx _ 
     Lib "user32" _ 
     Alias "FindWindowExA" (_ 
     ByVal hWnd1 As LongPtr, _ 
     ByVal hWnd2 As LongPtr, _ 
     ByVal lpsz1 As String, _ 
     ByVal lpsz2 As String) _ 
     As LongPtr 
#Else 
    Private 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 
#End If 

Sub downloadfilefromeie() 

    Dim subpage As InternetExplorer 
    Dim objpage As HTMLDocument 
    Dim o As CUIAutomation 
    Dim h As LongPtr 
    Dim fnb As LongPtr 
    Dim e As IUIAutomationElement 
    Dim iCnd As IUIAutomationCondition 
    Dim Button As IUIAutomationElement 
    Dim InvokePattern As IUIAutomationInvokePattern 
    Dim strBuff As String 
    Dim ButCap As String 

    Set objshell = CreateObject("Shell.Application") 
    Set objallwindows = objshell.Windows 
    Set subpage = New InternetExplorer 
    For Each ow In objallwindows 
     'MsgBox ow 
     If (InStr(1, ow, "Internet Explorer", vbTextCompare)) Then 
      'MsgBox ow.Hwnd & " " & ow & " " & ow.locationURL 
      If (InStr(1, ow.locationURL, "tvsub", vbTextCompare)) Then 
       Set subpage = ow 
      End If 
     End If 
    Next 
    Set objpage = New HTMLDocument 
    If subpage Is Nothing Then 
    Else 
     Set objpage = subpage.Document 
     'Debug.Print objpage 
     'objpage.getElementById("content").Click 
     Set dl = objpage.getElementsbyclassname("subtable") 
     Set dltable = dl(0).FirstChild.ChildNodes 
     Set dlrow = dltable(10).getElementsByTagName("a")(2) 
     dlrow.Click 
     While objpage.ReadyState <> "complete" 
      DoEvents 
     Wend 
    End If 
    Application.Wait (Now() + TimeValue("0:00:05")) 
    Set o = New CUIAutomation 
    h = subpage.Hwnd 
    fnb = FindWindowEx(h, 0, "Frame Notification Bar", vbNullString) 
    If fnb = 0 Then Exit Sub 
    'Debug.Print "type of fnb is " & TypeName(fnb) 
    Set e = o.ElementFromHandle(ByVal fnb) 
    'Debug.Print "type of e is " & TypeName(e) 
    Set iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "Save") 
    Set Button = e.FindFirst(TreeScope_Subtree, iCnd) 
    'Debug.Print "type of Button is " & TypeName(Button) 
    Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId) 
    'Debug.Print "type of InvokePattern is " & TypeName(InvokePattern) 
    InvokePattern.Invoke 

End Sub 

ich versucht habe "Save"-"Save as" ändern, aber es funktioniert nicht Arbeit. Meine Vermutung ist, dass ich irgendwie in der Lage sein muss, zuerst auf den Pfeil auf der Split-Taste zu klicken, bevor ich auf die Schaltfläche "Speichern unter" klicke, aber ich hatte keinen Erfolg dabei. Gerne zu schätzen, wenn jemand eine Lösung anbieten kann.

+0

Einige Hinweise auf den Code: 1) Die Zeilen 'Set subpage = New InternetExplorer' und' Set objpage = New HTMLDocument' sind nicht notwendig. 2) Setze 'Set objallwindows = objshell.Windows ... Für jedes ow In objallwindows ... Weiter' blockiere in' Do ... Loop', füge 'Exit Do' Zeile nach' Set subpage = ow' hinzu, füge auch '' hinzu DoEvents irgendwo. 3) Dann ist 'Wenn Unterseite ist nichts, dann ist auch nicht notwendig. – omegastripes

+0

Können Sie weitere Details angeben, welche Daten Sie herunterladen möchten und woher? Vielleicht gibt es eine andere Lösung könnte gefunden werden, zuverlässiger und die IE überhaupt nicht benötigt. – omegastripes

Antwort

0

ich einfach versucht, eine Datei über den Link http://www.tvsubtitles.net/download-114117.html, herunterzuladen, die auf der Webseite zu finden sind http://www.tvsubtitles.net/subtitle-114117.html, und es funktionierte für mich, hier ist der Code:

Sub Test_download_tvsubtitles_net() 

    DownloadFile "http://www.tvsubtitles.net/download-114117.html", ThisWorkbook.Path & "\download-114117.zip" 

End Sub 

Sub DownloadFile(sUrl, sPath) 

    Dim aBody 

    With CreateObject("MSXML2.XMLHTTP") 
     .Open "GET", sUrl, False 
     .Send 
     aBody = .responseBody 
    End With 
    With CreateObject("ADODB.Stream") 
     .Type = 1 ' adTypeBinary 
     .Open 
     .Write aBody 
     .SaveToFile sPath, 2 ' adSaveCreateOverWrite 
     .Close 
    End With 

End Sub 
+0

Danke Omegastripes! – bangbangjim

+0

Danke Omegastripes! Die Sache ist, dass ich dies bei der Arbeit anwenden müsste, und dass die Dateien, die ich bei der Arbeit herunterladen muss, über die Rahmenbenachrichtigungsleiste heruntergeladen werden müssen (weil ich im Grunde nicht auf einen Downloadlink klicke, sondern den Inhalt eines Seite als .txt-Datei mit angepasstem Trennzeichen usw.) Denkst du, dass das mit deiner Methode möglich ist? Danke noch einmal. – bangbangjim

+0

@bangbangjim Es ist nicht ganz klar, warum Sie über die Frame-Benachrichtigungsleiste herunterladen müssen, Sie haben geschrieben, dass Sie nicht auf einen Download-Link klicken, aber das ist genau das, was Ihr Code "dlrow.Click" tut. Meine Frage ist, was ist der Unterschied in heruntergeladenen Dateien mit Ihrem Code (ich habe überprüft - es funktioniert gut) und den obigen Code? – omegastripes

Verwandte Themen