2017-12-16 4 views
1

Visual Basic with excelを使用して、APIからデータを取得しています。 For-Eachループの繰り返しごとに約100個のAPI呼び出しを実行しています。各繰り返しは1行のデータを埋めます。ExcelのVisual Basic、多くのAPI呼び出しのためにフリーズを止めるには?

問題は、約4〜5行を完了した後、私のExcelがフリーズすることです!

この問題の最適な解決策は、各API呼び出しの間に約3秒の遅延があることだと思います。これにより、APIのレート制限エラーも防止されます。

これが私の現在のコードです -

For Each BidRow In Range("A2:A102") 
     MyRequest.Open "GET", "https://api.someapi.com/values/" & Range("B" & RowNo) 
     MyRequest.Send 
     Set JsonBid = JsonConverter.ParseJson(MyRequest.ResponseText) 
     Range("D" & RowNo).Value = JsonBid("key") 
     RowNo = RowNo + 1 
Next BidRow 

JsonConverterはちょうど別のモジュールです。

とにかく、私はVisual Basicで3000ミリ秒の遅延を行う方法はわかりません.JavaScriptでsettimeout()関数を使用すると非常に簡単です。または、私はここでいくつかの非同期コーディングテクニックを持っているかもしれません。私は今たくさんのことをしようとして失われている!

これを解決する方法はありますか?あなたは「全体」指定した秒数のために一時停止し、このサブを使用することができ

+0

可能な重複[アクセス/エクセルVBA - 時間遅延](HTTPS:/ /stackoverflow.com/questions/30174395/access-excel-vba-time-delay) –

+0

'For Each BidRow In Range(" A2:A102 ")'行の直後に 'DoEvents'を追加しようとしましたか? – sktneer

+0

application.ontimeはあなたが望むことをします –

答えて

2

:たとえば

Sub Pause(delaySeconds As Integer) 
    Dim startTime As Single 
    startTime = Timer 
    Do While Timer < startTime + delaySeconds 
     DoEvents ' Yield to other processes 
    Loop 
End Sub 

Pause(3)は3秒間一時停止します。


ただし、Excelが回復不可能な方法でを "凍結" されていることを確認ですか?私は数多くのAPIを使用しています。私は数百回のループを繰り返すうちに、Excelがクラッシュしているように見えますが、ちょっとした忍耐をもってプロセスが実際に終了します。あなただけNext BidRow前に行を追加した場合、どのような代わりに一時停止(および100 × 3 seconds = 5 minutesしてサブの実行時間を延長)の

、:

DoEvents 

編集再:あたり60回の呼び出しのAPIの制限秒...

APIを提供するサイトの制限が1分あたり60コールの場合、100回のコールは100秒以内に実行する必要があります。私はあなたがその下にいると確信していますが、手続きをタイミングすることで確実にすることができます。あなたが追加することができ、あなたのループの前に

Dim LoopStart as Single 

LoopStart = Timer 

を...とループが完全に終了された後、行を追加します。あなたが制限を超えた場合は、ほとんどのAPIのでしょうが

MsgBox "Loop finished in " & Round(Timer - LoopStart,0) & " seconds." 

を単純にエラーを返し、通常2〜2秒後に再開します。理論上のように使用しているAPIの細かい印刷物に応じて例外があります。過剰な呼び出し(事前に合意する必要があります)のためにクレジットカードに課金するか、潜在的に禁止することができます繰り返し虐待された後のあなたのIP(私はこれまで見たことがない。例えば)

Google Maps Geocoding APIは非常に寛大な、 "標準" の制限があります。

2,500自由あたりの要求、および、あたり

50の要求を。デフォルトでは

、あなたEnable Billingが高いクォータロックを解除する場合を除き、(一時的な)エラーを返します。この過剰に呼び出す:あなたがなります 、その後、日中

2500自由の要求、およびを$で請求0.50 USD/100,000毎日

Source)最大1000追加要求、


あなたは、ループの各反復は、このようなもので少なくとも 1秒を取ることを確認できます。

For Each BidRow In Range("A2:A102") 
    loopStart = Timer 'reset timer for each loop 
    MyRequest.Open "GET", "https://api.someapi.com/values/" & Range("B" & RowNo) 
    MyRequest.Send 
    Set JsonBid = JsonConverter.ParseJson(MyRequest.ResponseText) 
    Range("D" & RowNo).Value = JsonBid("key") 
    RowNo = RowNo + 1 
    Do While Timer < loopStart + 1 
     DoEvents ' Yield to other processes if under 1 second has passed 
    Loop 
Next BidRow 
+0

私の問題は、UIが実行が完了するまで一時停止してしまい、完全に機能しなくなったということでした。そして、私はそのための解決策は、API呼び出しの間に遅延を使用することだと思った。しかしDoEventsという名前の行を追加するだけで完璧に動作しました!ありがとう! –

+0

Btwにはいくらかの遅延が必要ですか?私は公開APIを使用しており、1分にAPIコールの制限が60になると言っています。 –

関連する問題