2016-09-29 92 views
0

我做了一堆API的調用一個網站,限制每小時的API調用的#。因爲我有時會撥打100k以上的電話,有時需要幾個小時才能獲得我需要的所有數據。我想構建一個循環,檢查API調用是否超過每小時的最大數量,如果超出,請檢查從何時開始到現在的時間差異。喜歡的東西循環相對於API調用#和時間間隔

startTime = Now() 

For i = 1 To 150000 
    If counter <= 36000 Then 
     url = baseURL + Str(i) + "?apikey=" + apiKey 
     resp.Open "GET", url 
     resp.Send 

     ' Process the response 

     counter = counter + 1 
    Else # More than 36,000 API calls have been made 
     Do 
      # Nothing in the loop, just waiting for 60 minutes to pass 
     While DateDiff(n, startTime, Now()) < 60 

     startTime = Now() 
     i = i - 1 # Need to re-loop on the current i 
    End If 
Next i 

我還沒有機會測試它,但在紙面上看起來它會工作,但看起來也像是一個黑客的工作(尤其是I = I - 1)。有沒有更好的方式來做我想做的事情?

回答

2

更新:由於共產國際指出我錯過了我的計數器。

每次計數器達到36000線我會檢查,看是否有小時已經過去了。如果沒有,我會重置開始時間,然後繼續,否則我會安排宏在開始時間後1小時再次運行。

Sub MakeAPICalls(Optional Counter As Long = 150000) 

    Dim Start: Start = Timer 
    Dim count As Long 

    For I = Counter To 150000 

     count = count + 1 

     URL = baseURL + Str(I) + "?apikey=" + apiKey 
     resp.Open "GET", URL 
     resp.Send 

     ' Process the response 
     ' Exit Do if complete 

     If (count Mod 36000) = 0 Then 
      If (Timer - Start) < 3600 Then 
       Start = Timer 
      Else 
       Application.OnTime Now + (3600 - (Timer - Start)), "MakeAPICalls " & I 
       Exit Sub 
      End If 
     End If 
    Next 

End Sub 
+0

像'OnTime'調用,但不應該'count'是靜態的? – Comintern

+0

計數器和計時器可以重置,因爲直到小時結束時纔會再次調用子計數器。可能需要靜態的部分是OP的代碼。我無法分辨何時收集了所有數據。 OP將必須構建他的代碼,以這種方式,多次運行宏將仍然會產生預期的結果。 – 2016-09-30 00:19:18

+0

有道理。 OP在URL中內置了'Str([loopcounter])'。我只是在想,重複使用'count'會更容易。 – Comintern

1

我會用2個嵌套循環簡化此。通過你的請求計數步驟外循環,然後使用內循環,使您的36K請求:

Dim requests As Long 
For i = 1 To 150000 Step 36000 
    If i > 144000 Then requests = 5999 Else requests = 35999 
    For x = 0 To requests 
     URL = baseURL + Str(i + x) + "?apikey=" + apiKey 
     resp.Open "GET", URL 
     resp.Send 
     ' Process the response 
    Next 
    Sleep 3600000 '1 hour 
Next 

注意這裏使用了Sleep API調用:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

這將確保您的處理器ISN」在一無所有的循環中,100%掛在一個小時內。如果您希望Excel保持響應(Sleep字面上暫停它在運行的線程),你可以把你的DoEvents NOP循環內,但它仍然會是一個浪費噸的CPU週期。

+1

好吧,我想讀你的最後一句話。我認爲'睡眠1000:DoEvents'會是很好的妥協。應該調整「睡眠3600000」來解釋達到36K呼叫的時間(如果需要59分鐘來處理36K呼叫,則應該暫停1分鐘)。 – 2016-09-30 00:07:23