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.

Excel web query properties dialog

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?

0
demandé sur mcw0933 2015-10-06 19:04:27

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
1
répondu Excel Hero 2015-10-06 16:45:09

Excel supporte la possibilité d'ouvrir une URL comme un autre classeur Excel, via les classeurs .Méthode ouverte :

à Partir de MSDN:

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é.)

enter image description here

Les mises en garde de l'utilisation de cette approche:

  1. 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.
  2. 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.
1
répondu mcw0933 2015-10-06 16:04:27