Je n'ai aucune connaissance de VBA. Seul l'enregistreur de macro est utilisé. J'ai besoin de télécharger les données d'une page Web à une feuille de calcul Excel et avec mes connaissances de VBA, je ne suis pas capable.
En particulier, ce que je veux faire une macro à télécharger pour exceler une table de données de la page: https://www.investing.com/equiités/cellnex-telecom-historical-Data P>
Ce téléchargement devrait être configuré en termes de temps, de plage de dates et de commande. p>
Les étapes seraient les suivantes: 1.- L'objectif est de copier les données de la table "ClnX Historical Data" à une feuille de calcul Excel. 2.- Ce téléchargement doit être effectué en sélectionnant précédemment "Mensuel" dans le menu déroulant en appelant "Terme". 3.- Que le téléchargement est effectué en sélectionnant précédemment la gamme de dates depuis 2 ans. 4.- Enfin, commandez le tableau en ordre décroissant par la colonne "maximum". 5.- Une fois le terme, la plage de date et la commande sont sélectionnés, copiez les données de la table "CLNX Historical Data" à une feuille de calcul Excel. P>
J'ai essayé avec l'enregistreur macro, mais je ne suis pas Capable de configurer le terme, la plage de date ou la commande. p>
Quelqu'un pourrait-il m'aider? p>
Merci pour votre aide. P>
Le code: P> >
Sub DataInvesting() Dim IE As Object Set IE = CreateObject("InternetExplorer.Application") IE.navigate "https://www.investing.com/equities/cellnex-telecom-historical-data" Do Until IE.readyState = 4 DoEvents Loop IE.Document.getElementsByClassName("newInput selectBox float_lang_base_1")(0).Value = "Monthly" IE.Visible = True Set IE = Nothing Set appIE = Nothing End Sub
3 Réponses :
Je ne peux pas tester cela comme malgré la mise en place d'un compte gratuit, il continue à dire que le mot de passe est faux. Marre avec 5 réinitiations de mot de passe et même problème et soupçonnez que mes informations sur les médias sociaux.
Les mesures suivantes décrivent largement les étapes que je considérerais bien que certaines attentes chronométrées sont probablement nécessaires. P>
Option Explicit 'VBE > Tools > References: ' Microsoft Internet Controls Public Sub Info() Dim ie As New InternetExplorer Const URL As String = ""https://www.investing.com/equities/cellnex-telecom-historical-data"" With ie .Visible = True .Navigate2 URL While .Busy Or .readyState < 4: DoEvents: Wend .document.querySelector(".login").Click While .Busy Or .readyState < 4: DoEvents: Wend .Navigate2 URL While .Busy Or .readyState < 4: DoEvents: Wend With .document.querySelector("#loginFormUser_email") .Focus .Value = "Bob@gmail.com" End With With .document.querySelector("#loginForm_password") .Focus .Value = "systemSucksDoesn'tAcceptMyPassword" End With Application.Wait Now + TimeSerial(0, 0, 2) .document.querySelector("[onclick*=submitLogin]").Click While .Busy Or .readyState < 4: DoEvents: Wend .document.querySelector("#data_interval").Click .document.querySelector("[value=Monthly]").Click With .document.querySelector("#picker") .Focus .Value = "03/08/2017 - 03/08/2019" .FireEvent "onchange" End With 'TODO Sorting column when clarified which column .document.querySelector("[title='Download Data']").Click Application.Wait Now + TimeSerial(0, 0, 10) Stop .Quit End With End Sub
Essayez ceci.
Je viens de tester le code suivant et cela fonctionne, au lieu de créer une instance d'Internet Explorer chaque fois que nous devons exécuter cette macro, nous utiliserons des demandes XMLHTTP. Copiez simplement le code entier et collez-le dans un module dans VBA. N'oubliez pas d'ajouter des références (outils / références) à Microsoft HTML Object Library et Microsoft XML V6.0.
Option Explicit Sub Export_Table() 'Html Objects---------------------------------------' Dim htmlDoc As MSHTML.HTMLDocument Dim htmlBody As MSHTML.htmlBody Dim ieTable As MSHTML.HTMLTable Dim Element As MSHTML.HTMLElementCollection 'Workbooks, Worksheets, Ranges, LastRow, Incrementers ----------------' Dim wb As Workbook Dim Table As Worksheet Dim i As Long Set wb = ThisWorkbook Set Table = wb.Worksheets("Sheet1") '-------------------------------------------' Dim xmlHttpRequest As New MSXML2.XMLHTTP60 ' '-------------------------------------------' i = 2 'Web Request --------------------------------------------------------------------------' With xmlHttpRequest .Open "POST", "https://www.investing.com/instruments/HistoricalDataAjax", False .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" .setRequestHeader "X-Requested-With", "XMLHttpRequest" .send "curr_id=951681&smlID=1695217&header=CLNX+Historical+Data&st_date=01%2F01%2F2017&end_date=03%2F01%2F2019&interval_sec=Monthly&sort_col=date&sort_ord=DESC&action=historical_data" If .Status = 200 Then Set htmlDoc = CreateHTMLDoc Set htmlBody = htmlDoc.body htmlBody.innerHTML = xmlHttpRequest.responseText Set ieTable = htmlDoc.getElementById("curr_table") For Each Element In ieTable.getElementsByTagName("tr") Table.Cells(i, 1) = Element.Children(0).innerText Table.Cells(i, 2) = Element.Children(1).innerText Table.Cells(i, 3) = Element.Children(2).innerText Table.Cells(i, 4) = Element.Children(3).innerText Table.Cells(i, 5) = Element.Children(4).innerText Table.Cells(i, 6) = Element.Children(5).innerText Table.Cells(i, 7) = Element.Children(6).innerText i = i + 1 DoEvents: Next Element End If End With Set xmlHttpRequest = Nothing Set htmlDoc = Nothing Set htmlBody = Nothing Set ieTable = Nothing Set Element = Nothing End Sub Public Function CreateHTMLDoc() As MSHTML.HTMLDocument Set CreateHTMLDoc = CreateObject("htmlfile") End Function
Cela effectue-t-il 2 ans dans des intervalles mensuels et triés?
J'ai édité le code pour vous adapter, juste la colonne de données que vous devez formater en tant que texte dans Excel, alors donnez-le d'essayer.
ça a l'air mieux! J'aurai une option avec elle, bien que cela ne soit pas sûr de disposer d'une fonction complète dont le seul but est de générer un fichier HTML lié tardé qui est transmis comme une liaison précoce.
Nice, bien que vous aideriez probablement à op si vous avez inclus une partie d'urlencode plutôt que de l'utilisation déjà codée afin de pouvoir le transmettre des paramètres alternatifs. En outre, votre écriture peut être effectuée avec une seule boucle si vous utilisez une boucle à la longueur -1 (réduire les lignes de code). +1 BTW Ceci est inefficace: set ietable = htmldoc.all.item ("curr_table"), pouvez-vous saisir par ID?
Oui, il peut être saisi par ID, juste testé. Mais de toute façon n'a aucun impact sur la vitesse, comme pour la boucle, je pense que c'est plus propre comme ceci et c'est une boucle unique. Je ne comprends pas la partie où vous dites "d'inclure une partie d'urlencodage plutôt que d'utiliser déjà codée afin de pouvoir passer des paramètres alternatifs" Pouvez-vous expliquer davantage je suis intéressé?
Le point sur ID est la meilleure pratique dans une certaine mesure est le refactoring de la boucle. Il est plus propre de ne pas répéter des lignes inutilement. Mais c'est ta réponse! Le bit d'urlencode est que ceci: "Cour_id = 951681 & SMLID = 1695217 & SMLID = 1695217 & SMLID = CLNX + HISTORIQUE + DATA & ST _DATE = 01% 2F01% 2f2017 & End_Date = 03% 2f01% 2f 2019 & intervalle_sec = MO Nthly & Sort_col = Date et Sort_ord = Desc & Action = Historical_Data est codé (les paramètres de dates), préensément pris à Dev Outils où le navigateur a pris soin des espaces, etc. Vous pouvez utiliser la fonction Encodurl pour faire la même chose.
Vous avez raison, je vais essayer d'essayer d'Urlencode. Merci
Partagez le code que vous avez et expliquez ce qui ne fonctionne pas. Limite à une question par message que je suggérerais.
Sub Datainvesting () Dim Ie comme clé d'objet IE = CreateObject ("Internetexplorer.application") ie.navigater " es.investing.com/equitivities/acs-cons-y-serv-historical-data " faire jusqu'à ce que IE.Readystate = 4 Doopents boucle IE.Document.getelementsBlassName ("newinput Selectbox float_lang_base_1 ") (0) .Value =" Mensuel "IE.Visible = VRAI SET IE = Rien défini appie = rien de fin
Maximum quoi? Changer (dernière colonne?) Et est une option de liste déroulante?
Avez-vous essayé les solutions qui vous sont données?