Comment puis-je post-traiter les données d'une requête Web Excel lorsque la requête est complète?
en tant que développeur de tableur, j'essaie de assembler deux ensembles de lignes: l'un d'une requête web à un service web que je possède, et l'autre un ensemble de lignes manuelles ajoutées par l'utilisateur du tableur (pas moi).
Excel construit dans L'objet Web Query / Connections ne fournit que deux modes: je peux activer "Enable background refresh" qui rend la Web query asynchrone, ou la décocher.
sans contrôle, Excel gèle pendant que la requête s'exécute, ce qui n'est pas souhaitable. Une fois vérifié, il ne semble pas y avoir de type de rappel ou de crochet d'événement disponible pour être avisé, de sorte que je puisse opérer contre les données Web rafraîchies.
y a-t-il un autre moyen de faire ça?
2 réponses
une requête Web Excel utilise un objet appelé un QueryTable pour effectuer le travail d'extraire et d'afficher les données.
un QueryTable est accessible par VBA.
et tout comme l'objet graphique un objet querytable a des événements qui ne peuvent être répondus qu'en utilisant le mot-clé WithEvents
d'un module de classe , comme ceci:
Private WithEvents MyQueryTable As QueryTable
Private Sub MyQueryTable_AfterRefresh(ByVal Success As Boolean)
'Do your post processing here...
End Sub
Excel supporte la possibilité d'ouvrir une URL comme un autre classeur Excel, via les classeurs .Méthode ouverte :
Sub OpenUSDRatesPage()
Dim objBK As Workbook
Dim objRng As Range
'Open the page as a workbook.
Set objBK = Workbooks.Open("http://www.x-rates.com/tables/USD.HTML")
'Find the Canadian Dollar cell.
Set objRng = objBK.Worksheets(1).Cells.Find("Canadian Dollar")
'Retrieve the exchange rate.
MsgBox "The CAD/USD exchange rate is " & objRng.Offset(-6, -1).Value
End Sub
l'appel est synchrone, de sorte que vous pouvez opérer sur les données résultantes dans le nouveau classeur immédiatement après l'appel ouvert.
pendant le chargement du classeur, Excel affichera une barre de progression. Quand tu auras fini, tu pourras appeler .Proche fermez le cahier de données web. (par exemple, pour L'exemple MSDN, vous appelleriez objBK.Close
quand vous avez terminé.)
Les mises en garde de l'utilisation de cette approche:
- vous êtes sur le point de migrer les données du classeur web vers votre propre (
ThisWorkbook
) vous-même, contrairement à une requête Excel rafraîchissable qui a une destination définie. - si votre web point de terminaison d'un nom de document qui correspond au nom d'un document ouvert dans Excel, l'utilisateur recevra un avertissement qu'un document portant le même nom est ouvert.