Condividi:        

Importare tabelle da web

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

Importare tabelle da web

Postdi aggittoriu » 01/07/20 16:15

Salve a tutti.

Sto rispolverando una vecchia macro che mi avevate dato, per importare tabelle da web a excel. Allegherei un file di esempio, ma non trovo il tasto per caricare il file. :oops:

Comunque, in pratica ho:
in colonna B: nomi di partite (es. Parma - Juventus, ecc)
in colonna C: i vari indirizzi web delle tabelle da importare (es. https://www.betexplorer.com/soccer/ital ... /nPbjV5Df/ ecc.)
in colonna D: il numero progressivo (es. 1 per la prima, 2 per la seconda, ecc)

Quello che cerco di ottenere è il nome della partita in colonna J e a fianco, quindi nella colonna K la tabella con le varie quote.

La macro che uso è questa:
Codice: Seleziona tutto
Sub Imp_Quote_BetExp()
       
        Range("E:Z").Select
    Selection.ClearContents
   
    On Error Resume Next

Dim riga As Range

Ultimo = Range("D" & Rows.Count).End(xlUp).Row
Set riga = Range("D1:D" & Ultimo)
'Set riga = Worksheets("BetExplorer").Range("D1:D" & Ultimo)

For Each Ordine In riga

Cells(Range("K" & Rows.Count).End(xlUp).Row + 1, 10).Value = Range("B" & Ordine)
'Sheets("BetExplorer").Cells(Range("K" & Rows.Count).End(xlUp).Row + 1, 10).Value = Range("B" & Ordine)


myURL = Range("C" & Ordine)
Set IE = CreateObject("InternetExplorer.Application")
   
With IE
    .navigate myURL
    .Visible = True
    Do While .Busy: DoEvents: Loop    'Attesa not busy
    Do While .ReadyState <> 4: DoEvents: Loop 'Attesa documento
End With
'
myStart = Timer  'attesa addizionale
Do
    DoEvents
    If Timer > myStart + 1 Or Timer < myStart Then Exit Do
Loop

Set myColl = IE.document.getElementsByTagName("TABLE")

'Non so se serve
If myColl.Length < 5 Then ' Questo numero non ho la più pallida idea di cosa sia e a che cosa serva
   ' MsgBox ("Numero anomalo di tabelle, abortito")
    GoTo IEQuit
End If

With myColl(0)  ' Questo numero indica la tabella da importare. Dove la tabella numero 1 è indicata dalla 0 e così tutte le altre.
    For Each trtr In .Rows
        For Each tdtd In trtr.Cells
            Cells(Range("Q" & Rows.Count).End(xlUp).Row + 1, j + 11) = tdtd.innertext
            j = j + 1
        Next tdtd
        i = i + 1: j = 0
    Next trtr
i = i + 2
End With
'SendKeys "{F5}", True
 '       SendKeys "{ENTER}", True

IEQuit:
IE.Quit
Set IE = Nothing

newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 2
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime

Next Ordine

End Sub


Ma funziona solo con partite da giocare ancora. Se invece voglio quelle già giocate, la macro non funziona più.

Mi sapete dire come correggerla per farla funzionare anche con quest'ultime?
E come si fa a caricare un file di esempio, così sarebbe tutto più chiaro. :oops:
aggittoriu
Utente Senior
 
Post: 156
Iscritto il: 24/06/14 08:49

Sponsor
 

Re: Importare tabelle da web

Postdi Anthony47 » 01/07/20 16:41

Il codice e la richiesta e' interpretabile solo conoscendo i dati del file cui fa riferimento; per le istrruzioni su come allegarlo: vedi viewtopic.php?f=26&t=103893&p=605487#p605487

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare tabelle da web

Postdi aggittoriu » 01/07/20 17:38

Ok. Grazie. Pensavo si dovesse caricare direttamente qui.

Comunque il file è questo.

Nel foglio Funziona ci sono le partite ancora da giocare. E la macro funziona.
Nel foglio NonFunziona, ci sono partite già giocate. E la macro non funziona.
Ho provato a cambiare anche il numero identificativo della colonna, ma non funziona lo stesso.
aggittoriu
Utente Senior
 
Post: 156
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi Anthony47 » 01/07/20 20:32

La pagina restituisce un numero aleatorio di Tabelle, ma fortunatamente la tabella che ci interessa e' indirizzabile direttamente tramite il suo ID.
Inoltre, dovendosi esaminare molte pagine web, ho modificato la sequenza di CreateObject("InternetExplorer.Application") /IE.Quit per rendere la sequenza piu' lineare e piu' rapida.
Il risultato di questi ragionamenti e' questa macro:
Codice: Seleziona tutto
Sub Imp_Quote_BetExp()
'
Range("E:Z").ClearContents
''    On Error Resume Next
Dim riga As Range
Ultimo = Range("D" & Rows.Count).End(xlUp).Row
Set riga = Range("D1:D" & Ultimo)
'Set riga = Worksheets("BetExplorer").Range("D1:D" & Ultimo)
Set IE = CreateObject("InternetExplorer.Application")
'
For Each Ordine In riga
    Cells(Range("K" & Rows.Count).End(xlUp).Row + 1, 10).Value = Range("B" & Ordine)
    'Sheets("BetExplorer").Cells(Range("K" & Rows.Count).End(xlUp).Row + 1, 10).Value = Range("B" & Ordine)
    myURL = Range("C" & Ordine)
'
    With IE
        .navigate myURL
        .Visible = True
        Do While .Busy: DoEvents: Loop    'Attesa not busy
        Do While .ReadyState <> 4: DoEvents: Loop 'Attesa documento
    End With
    '
    myStart = Timer  'attesa addizionale
    Do
        DoEvents
        If Timer > myStart + 1 Or Timer < myStart Then Exit Do
    Loop
    Set myColl = IE.document.getElementById("sortable-1")   ' Questa e' la tabella da importare
    With myColl
        For Each trtr In .Rows
        yy = yy + 1
            For Each tdtd In trtr.Cells
                Cells(yy, j + 11) = tdtd.innertext
                j = j + 1
            Next tdtd
            i = i + 1: j = 0
        Next trtr
    i = i + 2
    End With
Next Ordine
'
IEQuit:
    IE.Quit
    Set IE = Nothing
End Sub

Prova anche tu...
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare tabelle da web

Postdi aggittoriu » 01/07/20 22:46

Ottimo!

Grazie Anthony47! Questa va che è una meraviglia! :)

Mi hai levato un inutile mal di testa! :)
aggittoriu
Utente Senior
 
Post: 156
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi Flash30005 » 05/07/20 22:02

aggittoriu ha scritto:Ottimo!

Grazie Anthony47! Questa va che è una meraviglia! :)

Mi hai levato un inutile mal di testa! :)


ma Anthony è extraterrestre :lol: :lol: :lol:
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Importare tabelle da web

Postdi aggittoriu » 13/02/22 11:18

Ciao. Riesumo questa mia discussione, perchè tanto quello che mi serve fare è più o meno la stessa cosa.
Ciò che cambia è il sito dal quale voglio prelevare le quote.

Per esempio, per prelevare le quote da http://www.bmbets.com/football/italy/serie-a/empoli-v-cagliari-5393375/#!/correct-score, ho modificato
Codice: Seleziona tutto
Set myColl = IE.document.getElementById("sortable-1")
con
Codice: Seleziona tutto
Set myColl = IE.document.getelementbyid("oddsContent")
, ma mi esce l'errore "proprietà o metodo non supportati dall'oggetto" riferito alla riga di codice
Codice: Seleziona tutto
For Each trtr In .Rows
.

Sbaglio io qualcosa o non funzion in questo sito? :?:
aggittoriu
Utente Senior
 
Post: 156
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi Anthony47 » 13/02/22 15:49

[… ho modificato …]
Codice: Seleziona tutto
    Set myColl = IE.document.getelementbyid("oddsContent")


, ma mi esce l'errore "proprietà o metodo non supportati dall'oggetto" riferito alla riga di codice
Codice: Seleziona tutto
    For Each trtr In .Rows


Sbaglio io qualcosa o non funzion in questo sito?

L'elemento con id "oddsContent" non e' una tabella, quindi non ha "righe" in cui navigare...

Pertanto, riguardo alla domanda che poni, "è la prima che hai detto" :D

Ora, un po' per pigrizia e un po' perche' non si puo' inseguire tutto quello che viene pubblicato sul web, io ti rimanderei a questa discussione, dove e' descritto il codice che consente di importare tutte le tabelle presenti su una pagina web: viewtopic.php?f=26&t=106072&p=620716

Nel codice della Sub GetTabbbSub e' presente uno Stop che potrebbe consentire all'utente di navigare a mano verso una destinazione particolare (se questo fosse diverso dall'url usato per attivare la Sub); nel tuo caso puoi rimuoverlo e aspettare il completamento dell'importazione (che durera' parecchi secondi).

La suddetta Sub GetTabbbSub deve essere richiamata da una sub ulteriore, che sceglie il foglio su cui salvare e l'url da leggere; nella discussione che ti ho linkato e' la Sub Call1.

Facendo l'importazione scoprirai che la tabella che si vede sulla tua pagina e' in realta' prodotta da due tabelle visualizzate affiancate, Table #2 e Table #4; non e' difficile spostare le intestazioni di riga da Table #2 a Table #4, se ti interessa una vista completa.

Prova...
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare tabelle da web

Postdi aggittoriu » 13/02/22 15:58

Ok. Provo a leggere (e a capire) poi magari... torno. :oops:

Per ora grazie! :)
aggittoriu
Utente Senior
 
Post: 156
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi aggittoriu » 13/02/22 16:47

No. Ho provato, ma non ho capito. A me importa solo la Table# 1 con il nome delle squadre e in mezzo data e ora.
Per avere le quote? Dove e come bisogna frugare? :(
aggittoriu
Utente Senior
 
Post: 156
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi Anthony47 » 13/02/22 17:50

A me importa fino a Table #10, circa 380 righe; sei sicuro che non hai altro?
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare tabelle da web

Postdi aggittoriu » 13/02/22 20:19

A me solo la prima tabella.
Io ho eliminato lo stop e ho cambiato l'indirizzo web che mi interessa, nella macro.
Codice: Seleziona tutto
Sub call1()
    Sheets("Foglio1").Select       '<<< Il foglio su cui si fara' l'importazione
    Cells.ClearContents            'NB: Il fofglio SARA' AZZERATO senza preavviso
    Call GetTabbbSub("http://www.bmbets.com/football/italy/serie-a/spezia-calcio-v-fiorentina-5393374/#!/correct-score")
    Cells.WrapText = False
End Sub

Poi? Bisogna cambiare altro?
aggittoriu
Utente Senior
 
Post: 156
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi Anthony47 » 13/02/22 21:20

A me, in questo momento, importa fino a Table #10, ultima riga occupata 380
Impieghera' 15 secondi...
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare tabelle da web

Postdi aggittoriu » 13/02/22 23:39

Eppure allora ci dev'essere qualcosa che sbaglio.

Ho registrato quello che faccio. Il link del filmato è questo.

Dov'è l'inghippo? :cry:
aggittoriu
Utente Senior
 
Post: 156
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi Anthony47 » 14/02/22 00:08

Mah, sarebbe stato utile se si fosse visto il contenuto della pagina Web...
Comunque modifica questa istruzione:
Codice: Seleziona tutto
If Timer > myStart + 2 Or Timer < myStart Then Exit Do
portando quel 2 a 5 (secondi di attesa)

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare tabelle da web

Postdi aggittoriu » 14/02/22 01:02

Ok. Ora ce l'abbiamo fatta. C'è voluta un'eternità, ma ce l'abbiamo fatta.
Probabilmente per velocizzare tutto, devo creare un nuovo file leggerissimo, solo per questo foglio.

Grazie ancora Anthony! ;)
aggittoriu
Utente Senior
 
Post: 156
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi aggittoriu » 14/02/22 14:15

Ho esultato troppo presto. :cry:
Non funziona più. Mi esce questo avviso.
Ho provato anche ad aumentare a 30 il numero che mi hai detto, ma niente da fare. A te funziona ancora?
aggittoriu
Utente Senior
 
Post: 156
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi Anthony47 » 14/02/22 17:08

Credo che quel messaggio significhi che il sito non ama essere consultato da I. E.
Apri IE e prova manualmente ad accedere e vedi se funziona.
In prospettiva però io mi porterei avanti: guarda questa discussione è installa l'ambiente Selenium per Chrome :
viewtopic.php?f=26&t=112225

Poi vai a quest'altra discussione:
viewtopic.php?f=26&t=112311

Qui, nel mio secondo messaggio datato 30 gennaio, troverai la Sub GetallTablesArr che dovrebbe consentiti di importare tutte le tabelle di una pagina web. Dovrai "chiamare" quella Sub da una Sub superiore, passando l'url e opzionalmente riga e colonna di dove, nel foglio attivo, posizionare le tabelle.
Nella discussione la Sub "superiore" è la Sub Printable.

Vedi se utilizzando quel lavoro riesci a creare la tua Sub superiore, io fino a stasera tardi non sono in grado di fare prove
Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare tabelle da web

Postdi aggittoriu » 14/02/22 19:09

I. E. non ce l'ho più. Io uso firefox, ma ho anche edge e crome. E si, anche aprendo manualmente quelle pagine, esce quel messaggio, ma di solito dura poco. Se apro tante pagine di quel sito, spesso non mi carica neanche la pagina web. E devo aspettare un'eternità, per riuscire a fare copia e incolla di tutte le pagine web che mi interessano. Ecco perchè volevo automatizzare tutto.

Provo a seguire il tuo consiglio. Spero solo non sia troppo complicato per me (speranza vana... già lo so :cry: ).
aggittoriu
Utente Senior
 
Post: 156
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi Anthony47 » 15/02/22 01:22

Se la macro funziona allora il tuo pc ha IE, anche se tu non lo usi.
La notizia e' che a me stasera la macro di ieri funziona ancora regolarmente.

Ho anche la "buona notizia" che con il codice presente nel file allegato nella discussione con Gianca532011 che ti ho linkato, ho provato a inserire il tuo link nella Sub PrintTables e mi ha importato le stesse tabelle sia con Edge che con Chrome, browser che dovrebbero essere meglio supportato dalle pagine web.
Ovviamente la mia macchina e' gia' predisposta con l'ambiente "Selenium" che consente di interagire con quei browser dal vba.

Nel file allegato alla discussione con Gianca532011, la Sub PrintTables e' presente nel Modulo1 del vba; il codice modificato che ho usato:
Codice: Seleziona tutto
Sub PrintTables()
Dim myIsin As String, myUrl As String
'
'Crea Driver:
If WPage Is Nothing Then
'    Set WPage = CreateObject("Selenium.EdgeDriver")
    Set WPage = CreateObject("Selenium.CHRomedriver")
End If
Sheets("AllTables").Select
Range("A:M").ClearContents
'
''myIsin = "CH0508208748"
myUrl = "http://www.bmbets.com/football/italy/serie-a/spezia-calcio-v-fiorentina-5393374/#!/correct-score"
'
'Prima pagina:
'WPage.Start "edge"
WPage.Start "chrome"
Call GetAllTablesArr(myUrl)         'Posiziona in colonna A
'
GoTo SQuit
'Seconda pagina:
myUrl = "https://www.borsaitaliana.it/borsa/cw-e-certificates/dati-mercato.html?isin=" & myIsin & "&lang=it"
Call GetAllTablesArr(myUrl, 1, 5)   'Posiziona in colonna E
'
SQuit:
'Quit Selenium
WPage.Quit
Set WPage = Nothing
MsgBox ("Informazioni raccolte...")
End Sub

Essa si appoggia sulla Sub GetAllTablesArr presente nello stesso modulo.
Semplificando potremmo dire che Sub GetAllTablesArr e' l'equivalente della Sub GetTabbbSub e Sub PrintTables l'equivalente di Sub Call1

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Importare tabelle da web":


Chi c’è in linea

Visitano il forum: Nessuno e 40 ospiti