Web scraping VBA (problème syntaxe)

Bonjour à tous, je cherche à automatiser la collecte des Financial Statements de compagnies sur le site Wall Street Journal. Malheureusement, lors de ma collecte de données, je tombe sur un problème de taille lié aux tables d'importation. En faisant tourner l'enregistreur de macro, on obtient le code suivant :

sans titre

J'aimerais de par l'automatisation modifier les zones soulignées en rouge par "Table k" ou k serait la boucle et la zone en vert par une cellule. Je n'arrive pas à avoir la bonne syntaxe et je tourne donc en rond. Par ailleurs, je ne comprends pas toutes les lignes, même en faisant des recherches dans les aides, sur Youtube et le forum donc toute explication est bienvenue. Il est difficile de décrire ce que je cherche et souhaite. N'hésitez pas à apporter votre grain de sel même s'il ne répond pas à ma demande.

Très bonne soirée,

Auxence.

Bonsoir,

un essai pour les "Table 0", ce qui est écrit entre parenthèse est une valeur alphanumérique, afin de rendre cette donnée variable par une boucle, il faut "sortir" la partie à modifier de la valeur alphanumérique pour "créer" une "fenêtre VBA" dans laquelle on peut mettre une variable qui prendra la valeur voulue :

* Name:="Table_0" => Name:="Table_" & K
* Location=""Table_0"";Extended => ici attention ! Le double guillemet est mis pour que VBA comprenne que le deuxième guillemet est à considérer comme un guillemet et non pas que le premier est une délimitation de valeur alphanumérique, donc on aura => Location=""Table_" & K & """;Extended
Il y a deux guillemets au début afin que VBA comprenne ceci : "Table, puis un guillemet de découpe de valeur alphanumérique où l'on va "coller" notre variable K, puis trois guillemets car il y a le premier pour fermer "la fenêtre de la variable K, puis les deux guillemets afin que VBA comprenne qu'il faut considérer le deuxième comme un guillemet alphanumérique.
* DisplayName:= "Table_0" => c'est comme le premier : DisplayName:="Table_" & K, dans ce dernier cas comme dans le premier vu qu'il n'y a plus de donnée après la variable K il n'est pas utile d'ajouter le guillemet de fermeture de fenêtre, mais si vous voulez le mettre il faudra aussi ajouter celui de fermeture de la valeur alphanumérique :
Name:="Table_" & K = Name:="Table_" & K& ""

Pour l'adresse il suffit de faire à l'identique dans le principe sauf que K est à remplacer par une référence de cellule :
Web.Contents(""" & Range("A1").Value & """"... Ici vu que la valeur de l'adresse ne comportera que la valeur de la cellule est que cette donnée doit être entre guillemet, il y a les 3 guillemets de chaque coté de la référence de la cellule => le premier pour dire à VBA de considérer le deuxième comme un guillemet et le troisième pour ouvrir la "fenêtre VBA" dans laquelle on intègre la valeur de la cellule A1, les trois autres c'est le même principe ...

Pour le reste des lignes de code, désolé, je ne connais pas.

@ bientôt

LouReeD

Bonjour,

On va commencer par structurer l'import Web.

Ensuite tu préciseras ce que tu veux faire.

ALT F8 et exécuter ImportWeb.

Cordialement

14pq-auxence.xlsm (22.32 Ko)
Option Explicit

Public Sub ImportWeb()
Dim wb As Workbook, ws As Worksheet
Dim Qry As WorkbookQuery, lo As ListObject, qt As QueryTable
Dim QryName As String, QryFormula As String, QryDescription As String

    With Application
        .EnableEvents = False
        .ScreenUpdating = False
    End With

    Set wb = ThisWorkbook
    Set ws = wb.Worksheets.Add(after:=ActiveSheet)
    ws.Name = "Import Web"

    QryName = "Import Web"
    QryDescription = "PQ - Import Web"
    QryFormula = "let" & Chr(13) & Chr(10)
    QryFormula = QryFormula & "    Source = Web.Page(Web.Contents(""https://www.wsj.com/market-data/quotes/JPM/financials/annual/income-statement""))," & Chr(13) & "" & Chr(10)
    QryFormula = QryFormula & "    Data0 = Source{0}[Data]" & Chr(13) & "" & Chr(10)
    QryFormula = QryFormula & "in" & Chr(13) & Chr(10)
    QryFormula = QryFormula & "    Data0"

    Set Qry = wb.Queries.Add(QryName, QryFormula, QryDescription)

    Set lo = ws.ListObjects.Add( _
             SourceType:=0, _
             Source:="OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & QryName, _
             Destination:=Range("$A$1"))

    Set qt = lo.QueryTable

    With qt
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [" & QryName & "]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "T_Import_Web"
        .Refresh BackgroundQuery:=False
    End With

    wb.Connections(1).Delete
    wb.Queries(1).Delete

    ActiveWindow.DisplayGridlines = False

    Application.EnableEvents = True

End Sub

Bonjour Auxence, bonjour les forumers LouReeD et Jean-Eric

Quelle est ta version d'excel ?

Pourquoi ne pas utiliser PowerQuery ?

nota : vérifie que le site autorise le web scraping tel que tu veux le pratiquer ...

19www-wsj-com.xlsx (21.97 Ko)

Bonjour,

@Steelson,

La proposition VBA crée la requête et charge les données dans un tableau !

Excel 2016 et +.

Pour la suite, je pense qu' Auxence veut reproduire la chose pour plusieurs compagnies.

Attendons son retour !

Cdlt.

Rechercher des sujets similaires à "web scraping vba probleme syntaxe"