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?