2016-07-05 9 views
0

ich versuchte, gehen zu sammeln/schaben Daten aus dem Web mit diesem Code:nicht Excel verwenden können, während Code ausgeführt wird

Sub GetSP() 
Dim appIE As Object 

Set appIE = CreateObject("internetexplorer.application") 

With appIE 
    .Navigate "http://uk.investing.com/currencies/streaming-forex-rates-majors" 
    .Visible = True 
End With 

Do While appIE.Busy 
    DoEvents 
Loop 

RunCodeEveryX: 

Set allRowOfData = appIE.document.getElementById("pair_1") 
Dim myValue As String: myValue = allRowOfData.Cells(2).innerHTML 
Range("A1").Value = myValue 

Application.Wait Now + TimeValue("00:00:01") 
GoTo RunCodeEveryX 

appIE.Quit 
Set appIE = Nothing 

End Sub 

Wenn jedoch der Code ausgeführt wird, kann ich nicht einmal bearbeiten Sie die Excel weil Excel damit beschäftigt zu arbeiten, um die Daten zu bekommen. Was ich hoffe, war der Code läuft, ich kann etwas aus dem gleichen Blatt mit dem Web-Scraping weiter machen.

Gibt es eine Alternative, jetzt zu warten? (Was ich glaube, macht Excel beschäftigt)

Vielen Dank!

@jeeped - Ich konnte die entsprechenden Daten mit Ihrem bevorzugten Modus sammeln und die Daten erfolgreich extrahieren. Ich frage mich, ob es eine gute Möglichkeit gibt, diesen Schritt unendlich zu wiederholen (da die Daten auf der Webseite aktualisiert werden, würde ich gerne wiederholen, wie mit meinem ursprünglichen Code), bis ich es beende, während ich den Rest des Arbeitsblatts bearbeiten kann .

Danke! Ich hoffe, es macht Ihnen nichts aus, wenn ich Sie gezielt anspreche, obwohl die Frage für alle offen ist.

Sub GetSP() 

Dim HTMLDoc As New HTMLDocument 
Dim oHttp As MSXML2.xmlHTTP 


On Error Resume Next 
Set oHttp = New MSXML2.xmlHTTP 
If Err.Number <> 0 Then 
    Set oHttp = CreateObject("MSXML.XMLHTTPRequest") 
    MsgBox "Error 0 has occured" 
End If 
On Error GoTo 0 
If oHttp Is Nothing Then 
    MsgBox "Just cannot make" 
    Exit Sub 
End If 

oHttp.Open "GET", "http://uk.investing.com/currencies/streaming-forex-rates-majors", False 
oHttp.send 
HTMLDoc.body.innerHTML = oHttp.responseText 

With HTMLDoc 
    PriceGetter = .getElementById("pair_1").innerText 
    PriceGetter2 = .getElementsByClassName("pid-1-bid")(0).innerText 
    Range("A1").Value = PriceGetter 
    Range("A2").Value = PriceGetter2 
End With 

End Sub 
+0

VBA sollte in erster Linie Single-Threaded in Betracht gezogen werden. Du fragst nur nach Ärger. Entfernen Sie sich von einer InternetExplorer-Anwendung zugunsten einer xmlhttprequest, um Ihre Abrufe zu beschleunigen. – Jeeped

+0

Hi @Jeeped Ich würde gerne darüber lernen und lesen. Würde es auch mit Excel funktionieren? – bebongtheshark

+0

Siehe [diese] (http://stackoverflow.com/search?q=user%3A4039065+%5Bexcel%5Dxmlhttp). Das sind nur meine; Es gibt viele mehr. – Jeeped

Antwort

0

Sie können einen Loop anstelle des Application.Wait verwenden. Wenn Sie DoEvents darin verwenden, reagiert die App immer noch.

Wenn Sie unter Windows sind, ist hier eine Funktion, die für eine gewisse Zeit schläft:

Declare Function GetTickCount Lib "kernel32.dll"() As Long 

Function Sleep(milliseconds As Long) 


Dim NowTick As Long 
Dim EndTick As Long 

EndTick = GetTickCount + (milliseconds) 

Do 
    NowTick = GetTickCount 
    DoEvents 
Loop Until NowTick >= EndTick 
End Function 

Nennen Sie es wie folgt aus:

Sleep 1000 'Sleeps for 1 Second 
+0

Der Code funktioniert sehr gut! Ich bin mir allerdings nicht sicher, ob ich es richtig platziert habe. Mein ursprünglicher Code ist in Sheet1, die Funktion, die Sie freigegeben haben, ich habe es in Module1 eingefügt (ich habe ein Modul erstellt). So funktioniert es gut, aber das Problem ist, wenn ich etwas auf dem Blatt, es einen Fehler 400. – bebongtheshark

+0

Oder Declare Sub Schlaf Lib "kernel32" (ByVal dwMilliseconds als Long) ' – Carrosive

+0

@bebongtheshark Fehler 400 ist eine schlechte Anfrage , überprüfe deine URL – Carrosive