Condividi:        

Download intera tabella dati

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Download intera tabella dati

Postdi Gianca532011 » 23/04/24 13:07

Ciao,
con selenium vorrei copiare tutti i dati da una tabella web, allo scopo sto tentando di applicare la Caller di Anthony, la macro non mi da errore e si conclude correttamente però non scarica nulla. Secondo me è errata la riga di codice secondo la quale si dovrebbe copiare i dati su foglio excel . Nel debug con F8 viene saltata e non capisco quale errore ci sia .
Qui il codice :
Codice: Seleziona tutto
Option Explicit
Dim web As Object
Sub Test()
    Dim web As New ChromeDriver
    Dim allTabs, j As Long, k As Long, L As Long, myHead As String, P As Long
    Dim mTable As Selenium.WebElement
    Dim tr As Selenium.WebElement
    Dim td As Selenium.WebElement
    Dim i As Integer
    Dim Last1 As Long, LastA As Long
    Dim MyUrl As String
    Sheets("Isin").Activate
    Sheets("Isin").Cells.ClearContents
    '

    With Sheets("Isin")
        Range("A1:G1").Value = Array("Société émettrice", "Code ISIN", "Devise", "Coupon", "Montant minimal", "Maturité", "Prix sur le marché")
    End With

    Last1 = Cells(1, Columns.Count).End(xlToLeft).Column    'Quante colonne?

    Dim bln As Boolean
    bln = False
    MyUrl = "https://www.xxxxxxx.com/bonds.php"

    If web Is Nothing Then
        Set web = CreateObject("Selenium.ChromeDriver")
        web.Start "Chrome"
        'Web.AddArgument ("--headless")
    End If

    With web
        .Get MyUrl

        ' interruttore boleano e di attesa, la pagina web è agibile x modifiche.
        bln = (MsgBox("Sicuro di voler continuare ?", vbYesNo) = vbYes)    '
        '=vbYes, in questo caso (si) Bln =true; con =vbNo si avrebbe Bln = false.

        'Debug.Print bln

        If bln = True Then
            Dim Row As Integer
            Row = 2

            Set allTabs = web.FindElementsByXPath("//*[@id='content']/table")
            allTabs = GimmeTablesArr(web, MyUrl)      'Ottieni la matrice delle tabelle
            If Not IsEmpty(allTabs(2)) Then                                   '<<< IF /END IF Aggiuntivo
                For j = 1 To Last1                          'Cerca l'intestazione di ogni colonna...
                    myHead = Cells(1, j).Value
                    For k = 1 To UBound(allTabs)            '... in tutte le tabelle della pagina...
                        For L = 1 To UBound(allTabs(k))     '.... in tutte le righe di ogni tabella
                            'Se "Trovato" allora scrivi il valore:
                            If InStr(1, allTabs(k)(L, 1), myHead, vbTextCompare) = 1 Then
                                 Cells(Row, j) = allTabs(k)(L, 2)  '<<<<<<<<<<<< questa viene saltata <<<<<<<<<<<<<<<<<<<<<<<<
                                '.allTabs.AsTable.ToExcel Range("A2").Value
                            End If
                            Row = Row + 1
                        Next L
                    Next k
                Next j
            End If
            ' ActiveWindow.ScrollRow = i
            'Next i
        Else
            Exit Sub
        End If
    End With
    web.Close
    web.Quit

    ' elimina righe con null o ""
    Dim uREnd As Long, Y As Long
    uREnd = Cells(Rows.Count, "A").End(xlUp).Row
    For Y = uREnd To 2 Step -1
        If Cells(Y, "A") = "" Then
            Cells(Y, "A").EntireRow.Delete
        End If
    Next Y

    Columns("A:H").EntireColumn.AutoFit

    ' aggiusta colonne
    Range("A1").ColumnWidth = 40
    Dim uR As Long
    uR = Cells(Rows.Count, 1).End(xlUp).Row

    Range("B1:H1").Select
    Selection.ColumnWidth = 14
    With Selection
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlCenter
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    ' trova ultima


    Range("B2:G" & uR).Select
    With Selection
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    MsgBox "Lista Obbligazioni aggiornata", vbInformation, "Ok"
End Sub

Function GimmeTablesArr(lDriver As Object, MyUrl As String) As Variant
    Dim PColl As WebElements, myItm As Object, TBColl As Object, pCount As Long
    Dim i As Long, myTim As Single
    Dim TArr()
    '

    With lDriver
        On Error Resume Next
        .Get MyUrl
        Application.Wait (Now + TimeValue("00:00:02"))
        On Error GoTo 0

        myTim = Timer

        Set TBColl = lDriver.FindElementsByTag("table")
        If TBColl.Count > 0 Then i = TBColl.Count Else i = 1    'Aggiunta
        ReDim TArr(1 To i)

        '
        For i = 1 To TBColl.Count
            TArr(i) = TBColl(i).AsTable.Data
        Next i
        GimmeTablesArr = TArr
    End With

    Debug.Print "GTArr:", "Tables: " & i - 1, Format(Timer - myTim, "0.00"), MyUrl
End Function
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 330
Iscritto il: 27/05/11 10:18

Sponsor
 

Re: Download intera tabella dati

Postdi Anthony47 » 23/04/24 20:33

Non ho capito che cosa vorresti fare, la macro raccoglie tutte le tabelle da una pagina web e le memorizza in un array; successivamente cerca in questo array una voce e di quella voce ne carica in Excel il valore.
La riga che hai evidenziato e' quella che controlla se la voce cercata corrisponde alla voce cercata:
Codice: Seleziona tutto
If InStr(1, allTabs(k)(L, 1), myHead, vbTextCompare) = 1 Then

La voce cercata e' in myHead (e la prendi da riga 1); la tabella esaminata e' la n° K alla riga L

Se vuoi debuggare correttamente, metti un breakpoint sulla riga successiva ( Cells(Row, j) = allTabs(k)(L, 2) ) e un'altro su Next J, e controlla se il vba va o meno in stop con quella voce di myHead prima di arrivare a Next J (cioe' alla prossima intestazione). In parallelo controlla se sulla pagina web esiste una tabella con le intestazioni di cui tu cerchi il valore.

Per i suggerimenti su come debuggare una macro (e come mettere un brakpoint) vedi viewtopic.php?f=26&t=103893&p=647677#p647677
Avatar utente
Anthony47
Moderatore
 
Post: 19266
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Download intera tabella dati

Postdi Anthony47 » 23/04/24 22:36

Mi accorgo che ho fatto confusione...
La riga che io ho evidenziato (chiamiamola A) e' quella che controlla se la riga in esame della tabella in esame corrisponde all'intestazione cercata (indicata in myHead); se Sì allora viene eseguita l'istruzione evidenziata da Gianca (chiamiamola B), se No allora si continua con la prossima riga e poi con la prossima tabella.
Se la riga B non viene eseguita e' perche' l'istruzione A dice "No, non e' l'intestazione cercata".
L'operazione di debug che ho suggerita e' corretta, e mira a controllare se prima o poi l'intestazione cercata viene trovata prima di aver esaurito il controllo in tutte le righe di tutte le tabelle.
Avatar utente
Anthony47
Moderatore
 
Post: 19266
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Download intera tabella dati":


Chi c’è in linea

Visitano il forum: Nessuno e 30 ospiti