Eric 888
XLDnaute Nouveau
Bonjour
J'ai développé un outil permettant de calculer le bilan carbone d'un événement à partir des codes postaux des participants
Pour ça, je requête le service en ligne de calcul d'itinéraires du Géoportail, qui me donne la distance routière entre deux codes postaux
Ce qui marchait très bien... jusqu'à ce que je me retrouve bloqué par une limite du Géoportail: pas plus de 5 requêtes par seconde
=>comment faire en sorte de limiter le nombre d'exécution d'une boucle à 5 itérations par secondes ?
la boucle que je souhaite contrôler est la suivante:
si le Géoportail détecte plus de 5 requêtes pendant 1 seconde à un moment ou un autre de l'exécution de la boucle, il renvoie un message d'erreur au lieu du code attendu, ce qui forcément plante la macro
d'où ma question: comment faire en sorte de limiter à 5 par seconde le nombre d'exécutions d'une boucle?
j'ai bien pensé à mettre en place un timer:
start = timer avant i-ème exécution
end = timer après i-ème exécution
si end - start < 1/5 seconde alors "attendre un peu" sinon exécution suivante
j'ai deux problèmes que je n'arrive pas à résoudre:
- "attendre un peu" => je ne trouve que l'instruction "wait" pour faire ça, mais pas d'intervalle en-dessous de la seconde => trop long, délai potentiel pour une 100aine de requêtes trop long pour l'utilisateur
- moins problématique mais quand même: pas optimal de limiter une exécution à 1/5e de seconde au lieu de 5 exécutions à 1 seconde (chaque requête peut prendre un temps variable, donc si une requête prend plus d'1/5e de seconde on se retrouve à ralentir inutilement les 4 requêtes suivantes
merci d'avance pour vos idées / solutions
Eric
J'ai développé un outil permettant de calculer le bilan carbone d'un événement à partir des codes postaux des participants
Pour ça, je requête le service en ligne de calcul d'itinéraires du Géoportail, qui me donne la distance routière entre deux codes postaux
Ce qui marchait très bien... jusqu'à ce que je me retrouve bloqué par une limite du Géoportail: pas plus de 5 requêtes par seconde
=>comment faire en sorte de limiter le nombre d'exécution d'une boucle à 5 itérations par secondes ?
la boucle que je souhaite contrôler est la suivante:
VB:
For i = 2 To lg
'lg est la ligne de la dernière URL stockée dans ma feuille Excel
'les URL calculées à partir des codes postaux permettent de requêter le Géoportail
Url = .Range("BP" & i).Value 'pour chaque URL
With CreateObject("WINHTTP.WinHTTPRequest.5.1")
.Open "GET", Url, False
.send
Txt = .responseText
'réponse du Géoportail: suite de coordonnées GPS et de valeurs distance et temps annoncées par une suite de caractères normalisée
End With
.Range("BQ" & i).Value = Split(Split(Txt, """distance"":")(1), ",""duration""")(0)
'découpage de la réponse du Géoportail pour récupérer la distance du trajet calculé par le Géoportail
'la valeur que je cherche est encadrée par les chaînes de caractères "distance": et ",duration"
Next i
si le Géoportail détecte plus de 5 requêtes pendant 1 seconde à un moment ou un autre de l'exécution de la boucle, il renvoie un message d'erreur au lieu du code attendu, ce qui forcément plante la macro
d'où ma question: comment faire en sorte de limiter à 5 par seconde le nombre d'exécutions d'une boucle?
j'ai bien pensé à mettre en place un timer:
start = timer avant i-ème exécution
end = timer après i-ème exécution
si end - start < 1/5 seconde alors "attendre un peu" sinon exécution suivante
j'ai deux problèmes que je n'arrive pas à résoudre:
- "attendre un peu" => je ne trouve que l'instruction "wait" pour faire ça, mais pas d'intervalle en-dessous de la seconde => trop long, délai potentiel pour une 100aine de requêtes trop long pour l'utilisateur
- moins problématique mais quand même: pas optimal de limiter une exécution à 1/5e de seconde au lieu de 5 exécutions à 1 seconde (chaque requête peut prendre un temps variable, donc si une requête prend plus d'1/5e de seconde on se retrouve à ralentir inutilement les 4 requêtes suivantes
merci d'avance pour vos idées / solutions
Eric