2016-06-27 5 views
0

Ich habe Code, wo ich auf einen XML-Feed für Live-Währungsdaten zugreifen. Ich muss den Preis alle 3 Minuten erfassen, und es muss ziemlich genau sein, sonst wird es die anderen Berechnungen abwerfen.Timer oder Code entspricht nicht dem Zeitplan

Ich habe einen Timer eingerichtet, um den Code alle 3 Minuten oder in dem von mir gewählten Intervall auszuführen.

Ich fing an, Rutschen zu bemerken, das war ein oder zwei Sekunden zuerst, aber hat sich in 10 Sekunden in Stellen verwandelt. Irgendwelche Gedanken?

Sub xmlData() 

Dim aSwitch As String: aSwitch = Sheet2.[Switch].Value 
Dim aSymbol As String: aSymbol = Sheet2.[Symbol].Value 

'check [switch] status 
If aSwitch = "OFF" Then 
    MsgBox "Switch is OFF!", vbCritical, "Program Status" 
    Exit Sub 
End If 

'MsgBox "Program is ON!", vbCritical, "Program Status" 

'refresh xml data 
Dim iMap As XmlMap 
Set iMap = ActiveWorkbook.XmlMaps(1) 
iMap.DataBinding.LoadSettings "http://****.com/webservice/v1/symbols/" & aSymbol & "/quote" 
iMap.DataBinding.Refresh 

'dim inputs 
Dim aStart As String: aStart = Sheet2.Range("c3").Text 
Dim aInterval As String: aInterval = Sheet2.Range("d3").Text 
Dim aStatus As String: aStatus = Sheet2.[Status].Value 
'oth 
Dim aSecurity As String: aSecurity = Sheet2.[Security].Value 
Dim aPrice As String: aPrice = Sheet2.[Price].Value 
Dim aDatetime As String: aDatetime = Sheet2.[DateTime].Value 

'separate adatetime 
Dim aDate As String: aDate = Mid(aDatetime, 1, 10) 
Dim aTime As String: aTime = Mid(aDatetime, 12, 10) 

'Time actual 
Dim aTimeNow As String: aTimeNow = Format(Now(), "HH:mm:ss") 

'copy xml data to table 
Dim aRow As Long 

aRow = Sheet2.Cells.Find(What:="*", SearchOrder:=xlRows, _ 
    SearchDirection:=xlPrevious, LookIn:=xlValues).Row + 1 

Sheet2.Cells(aRow, 1).Value = aDate 
Sheet2.Cells(aRow, 2).Value = aTime 
Sheet2.Cells(aRow, 3).Value = aSecurity 
Sheet2.Cells(aRow, 4).Value = aPrice 
Sheet2.Cells(aRow, 5).Value = aTimeNow 

'start timer for reload 
Application.OnTime Now + TimeValue(aInterval), "xmlData" 

End Sub 

EDIT 160.627

Ist es möglich, die XML Holen nicht sofort?

+0

Vielleicht Prozedur braucht Zeit auszuführen, so versuchen, die „next“ Zeit Berechnung * vor * etwas anderes zu tun. –

+0

Besser noch, berechnen Sie die geplante Zeit in absoluten Zahlen, anstatt als ein Unterschied von 'Now' –

+0

TW-so wie die Einstellung des Timers am Anfang? ok ... CN-ich bin nicht sicher, wie man in absoluten Zahlen rechnet. –

Antwort

1

Berechnen Sie die geplante Zeit in absoluten Zahlen und nicht als Differenz von Now. (Jetzt wird immer eine gewisse Menge an Zeit nach der letzten geplanten Zeitpunkt sein, so wird immer kriechen)

Sub xmlData() 
    Static ScheduleTime As Variant ' Statis retains value between executions 
    Dim aInterval As String 

    ' other code 
    ' ... 

    If ScheduleTime = 0 Then 
     ' initialise on first execution 
     ScheduleTime = Now + TimeValue(aInterval) 
    Else 
     ' schedule based on last scheduled time 
     ' this assumes execution time is always less than interval 
     ScheduleTime = ScheduleTime + TimeValue(aInterval) 
    End If 

    Application.OnTime Now + TimeValue(aInterval), "xmlData" 

End Sub 
Verwandte Themen