Condividi:        

Estrazione dati dal sito dinamico

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

Re: Estrazione dati dal sito dinamico

Postdi davide2574 » 01/12/15 09:14

Ciao Anthony

si funziona alla grande. Se invece voglio posizionare nella cella particolare ?
Per esempio la prima colonna A va bene ok e se voglio mettere altro nella cella Z50

Range("Z50").Insert Shift:=xlToRight?

ho provato a modificare ma non funziona.
davide2574
Utente Junior
 
Post: 46
Iscritto il: 15/11/15 16:42

Sponsor
 

Re: Estrazione dati dal sito dinamico

Postdi Anthony47 » 01/12/15 23:04

Quelle macro importano "tutto" a cominciare da A1.
Nella macro che importa da due url nello stesso foglio, dopo la prima importazione (che avviene nella colonna A) inserisco N colonne in modo da spostare la precedente colonna A fino a colonna T; la seconda importazione ripopola da colonna A.
Non e' difficile modificare il codice affinche' cominci a importare da una riga /colonna predeterminata, pero' questo lavoro tocca a voi farlo, se non vi basta l'iportazione standard.
Ti segnalo anche la disponibilita' di una versione che e' in grado di sostituire la web query (ovviamente nei siti in cui la web query standard non funziona); si tratta della Function GetTabRaim222(ByVal uurrll As String, ByVal ttAAbb As Long, myDest As Range) As Variant, che trovi descritta qui: viewtopic.php?f=26&t=104895&p=612528#p612528
Va richiamata "passandogli" l'url, il numero tabella (va letto nel codice html del sito), la cella di destinazione. Immagino pero' che questa variante possa servire quando avrai fatto un po' piu' di pratica con le macro attuali.

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

Re: Estrazione dati dal sito dinamico

Postdi davide2574 » 03/12/15 09:46

ciao antonhy

grazie per avermi indicato, ho copiato quel codice del tuo post:

Postdi Anthony47 » 25/06/15 23:39

Codice: Seleziona tutto
Function GetTabRaim222(ByVal uurrll As String, ByVal ttAAbb As Long, myDest As Range) As Variant
Dim BetFlag As Boolean, myColl, my2Coll, IE As Object, LnkCnt As Long
Dim myRetr As Long, ....................


e ho messo nel modulo1 e cambiando il link del sito.
e ho provato ad avviare ma mi appare la finestra Nome Macro :eeh: devo assegnare qualcosa nome?
Questo avevo già visto tante volte e non sono mai riuscito a capire come devo far funzionare. Nonostante ho inserito le spunte su Microsoft HTML Object Library e Microsoft Internet Controls.
davide2574
Utente Junior
 
Post: 46
Iscritto il: 15/11/15 16:42

Re: Estrazione dati dal sito dinamico

Postdi Anthony47 » 03/12/15 13:20

Anthony ha scritto:Immagino pero' che questa variante possa servire quando avrai fatto un po' piu' di pratica con le macro attuali.
Eh eh, hai saltato il mio commento finale?

Comunque quella Function e' da richiamare tramite altra macro, hai fatto cosi' o come?

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

Re: Estrazione dati dal sito dinamico

Postdi davide2574 » 07/12/15 08:44

Ciao Antonhy,

ci ho provato a leggere tutto che mi hai indicato ma non sono riuscito a capire.
Forse perché sono limitato a leggere l'italiano.
Ho provato a scaricare quel file di Raimea in quel topic viewtopic.php?f=26&t=104895&p=612528#p612528 cosi mi facilità a capire il meccanismo e il funzionamento ma purtroppo è scaduta o tolto di disponibilità a scaricare.

:(

Non sto cercando di voler avere un piatto pronto ma vorrei tanto imparare e infatti alcune cose sto capendo un po'.
davide2574
Utente Junior
 
Post: 46
Iscritto il: 15/11/15 16:42

Re: Estrazione dati dal sito dinamico

Postdi Anthony47 » 08/12/15 00:04

Non e' questione di lingua, e' che l'argomento ha una sua complessita' tecnica e quella macro rappresenta un punto di partenza... E' per questo che avevo commentato che quella soluzione probabilmente ti avrebbe aiutato dopo aver fatto qualche esperienza in piu'.

Comunque, indipendentemente dal punto in cui arriverai, penso di pubblicare prossimamente un "prodotto quasi finito" che dovrebbe essere di ausilio per queste situazioni.

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

Re: Estrazione dati dal sito dinamico

Postdi davide2574 » 11/12/15 07:50

Ciao Anthony,

Dunque :

If FlErr = 0 Then
aazzz = myStab

Call myWait(myStab)
End If

devo cambiare da aazzz a zzz con questo:

zzz = GetTabRaim222("http://www.betonews.com/table.asp?tp=2002&lang=en&dd=" & [ab3] & "&dm=" & [ab4] & "&dy=" & [ab5] & "&df=1&dw=3", 25, Range("G4")) ? :undecided:
davide2574
Utente Junior
 
Post: 46
Iscritto il: 15/11/15 16:42

Re: Estrazione dati dal sito dinamico

Postdi Anthony47 » 12/12/15 03:00

Parliamo di come usare il codice della Function GetTabRaim222 per prelevare una tabella specifica, vero?
Copia tutto il codice presente nel messaggio gia' linkato(vedi viewtopic.php?f=26&t=104895&p=612528#p612528) in un "Modulo standard" del vba.

Poi da un'altra macro "richiama" quella Function passandogli l'url della tabella, il numero della tabella e la posizione in cui mettere la tabella.

Esempio:
Codice: Seleziona tutto
Sub pippo()
zzz = GetTabRaim222("http://bloomberg.finanza.repubblica.it/", 6, Range("G4"))
If zzz = 0 Then
    MsgBox ("Importazione fallita")
Else
    MsgBox ("Completato...")
End If
End Sub
Questa macro ti mettera' in G4 [Destinazione = Range("G4")] la tabella N° 6 della pagina http://bloomberg.finanza.repubblica.it/
La n° 6 corrisponde a "Obbligazioni governi eurozona"; il N° tabella lo trovi per tentativi oppure decodificando il codice sorgente della pagina web.

Pero' c'e' un "ma"...
-con l'obiettivo di inserire la tabella in un'area "pulita", la Function cancella un'area di 20 colonne a destra del range di Destinazione x 500 righe
Quindi se vuoi usare la Function per importare sullo stesso foglio piu' tabelle, slegando le loro importazioni, devi ricordarti di spaziare le destinazioni di almeno 20 colonne.
Esempio; la Sub pippo() gia' vista che importa la tabella 6 in G4; separatamente
Sub pippo2()
zzz = GetTabRaim222("http://bloomberg.finanza.repubblica.it/", 5, Range("AA4"))
If zzz = 0 Then
MsgBox ("Importazione fallita")
Else
MsgBox ("Completato...")
End If
End Sub
[/code]Questa ti importera' la tabella 6 in posizione AA4, quindi anche rieseguendo Sub pippo il suo contenuto non sara' azzerato.

Ma sono possibili anche altre soluzioni, tipo
Sub pippo()
zzz = GetTabRaim222("http://bloomberg.finanza.repubblica.it/", 3, Range("A4"))
zzz = GetTabRaim222("http://bloomberg.finanza.repubblica.it/", 5, Range("G4"))
zzz = GetTabRaim222("http://bloomberg.finanza.repubblica.it/", 5, Range("L4"))
End Sub
Questa importera' le tabelle 3, 5 e 6 in A4, G4 e L4... Quindi fregandosene della distanza di 20 colonne tra Destinazione1 e Destinazione2:
1, perche' io so che le tabelle in realta' sono larga solo 2 o 3 colonne
2, perche' popolo le tabelle procedendo verso destra
3, perche' il popolamento delle tabelle avviene in sequenza, non in modo slegato.

Spero che questi esempi ti siano di aiuto.

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

Re: Estrazione dati dal sito dinamico

Postdi davide2574 » 04/01/16 13:02

Antohny,Volevo sapere se è possibile bloccare in una cella la tabella della classifica che importo con i codici? perché ogni volta che li aggiorno e scopro che viene spostato in un'altra colonna oppure in una riga sopra o sotto e cosi sballa tutti i calcoli di formule.
Si potrebbe rimanere blocco fisso?
davide2574
Utente Junior
 
Post: 46
Iscritto il: 15/11/15 16:42

Re: Estrazione dati dal sito dinamico

Postdi Anthony47 » 05/01/16 21:05

Non so adesso quale codice stai usando, ma usando la GetTabRaim222 sei tu che definisci a partire da quale cella la tabella prescelta andra' inserita.
Ad esempio questo richiamo inserisce la tabella N° 3 in cella A4 e adiacenti:
Codice: Seleziona tutto
zzz = GetTabRaim222("http://bloomberg.finanza.repubblica.it/", 3, Range("A4"))

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

Re: Estrazione dati dal sito dinamico

Postdi davide2574 » 06/01/16 17:10

scusami, mi ero dimenticato di dirti quale funzione, intendevo questo:

Codice: Seleziona tutto
Sub GetTabbbSub(ByVal myURL As String)
'Va Chiamata passandogli l'URL da leggere
'myURL = "http://www.nhl.com/stats/team?reportType=game&report=teamsummary&season=20152016&gameType=2&aggregate=1&gameLocation=H"
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 + 2 Or Timer < myStart Then Exit Do
Loop

'Leggi le tabelle SUL FOGLIO ATTIVO
''Sheets("Classifica Home").Select
''Cells.Clear
Set mycoll = ie.document.getElementsByTagName("TABLE")
For Each myItm In mycoll
    For Each trtr In myItm.Rows
        For Each tdtd In trtr.Cells
            Cells(i + 1, j + 1) = tdtd.innerText
            j = j + 1
        Next tdtd
        i = i + 1: j = 0
    Next trtr
i = i + 1
Next myItm

''Stop     'Vedi testo

'Chiusura IE
ie.Quit
Set ie = Nothing
End Sub
Sub QTRefreshAll()
For i = 1 To Worksheets.Count
    Sheets(i).Select
    mmm = ""
    aaa = ActiveSheet.QueryTables.Count
    For j = 1 To aaa
        mmm = mmm & ActiveSheet.QueryTables(j).Destination.Address & "_"
        ActiveSheet.QueryTables(j).Refresh BackgroundQuery:=False
    Next j
    Debug.Print i & " - " & aaa & mmm
Next i
End Sub

Sub Agg_Classifica_Principale()
    Sheets("Classifica Principale").Select
    'Cells.ClearContents
    Call GetTabbbSub("http://www.nhl.com/ice/standings.htm?type=lea#&navid=nav-stn-league", Range("A4"))
End Sub

Sub Agg_Classifica_Generale()
    Sheets("Classifica Generale").Select
    'Cells.ClearContents
    Call GetTabbbSub("http://www.nhl.com/stats/team?reportType=game&report=teamsummary&season=20152016&gameType=2&aggregate=1",Range("Z4"))
End Sub
Sub RunAll()
    Call Agg_Classifica_Principale
    Call Agg_Classifica_Generale
End Sub


Secondo te, sono giusti? oppure sbagliato?
Quella GetTabRaim222 va benissimo solo che li uso altro. perchè avevo già il file con tutte formule e mi scocciava a rifare tutto per questo uso quello GetTabbbSub
davide2574
Utente Junior
 
Post: 46
Iscritto il: 15/11/15 16:42

Re: Estrazione dati dal sito dinamico

Postdi Anthony47 » 07/01/16 15:21

La Sub GetTabbbSub e' fatta per importare tutte le tabelle contenute in una pagina web, pertanto la posizione dove sara' posizionata una tabella dipende dalla dimensione della tabelle precedenti.
Tuttavia aggiungendo nel codice della Sub GetTabbbSub questa riga in questa posizione ogni tabella sara' preceduta dall'intestazione "Table# XX"
Codice: Seleziona tutto
    For Each myItm In mycoll
    Cells(i + 1, 1) = "Table# " & mytbi + 1: i = i + 1: mytbi = mytbi + 1
        For Each trtr In myItm.Rows

Questo ti aiutera' a selezionare la tabella giusta nelle elaborazioni successive.
Oppure usi la GetTabRaim222 per prelevare la tabella giusta e posizionarla nell'area che ti serve; tra l'altro la GetTabRaim222 e' piu' precisa della GetTabbbSub, in quanto consente di impostare un eventuale timeout sulla pagina con retry automatico.

L'uso della GetTabbbSub (per prelevare tutto) non preclude l'uso della GetTabRaim222 (per prelevare qualcosa), anche se il codice e l'esecuzione non saranno ottimizzati.

Ti ricordo che usando la GetTabbbSub l'are di destinazione non viene ripulita prima dell'estrazione, quindi dovrai farlo tu all'atto del richiamo; tipo
Codice: Seleziona tutto
        Sheets("Classifica Principale").Select
        Range("A:D").ClearContents                'Ripulisce colonne A:D prima di prelevare
        Call GetTabbbSub("http://www.nhl.com/ice/standings.htm?type=lea#&navid=nav-stn-league", Range("A4"))

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

Re: Estrazione dati dal sito dinamico

Postdi davide2574 » 14/01/16 00:10

Ciao Antonhy

Allora come mi avevi detto che nelle celle deve essere messo formato tipo Testo.
ok, se uso la formula come questa:

Codice: Seleziona tutto
Function Strinum(Txt, n, Separator) As String
     Strinum = Split(Application.Trim(Txt), Separator)(n - 1)
End Function


perchè vorrei separare i numeri da "-", per esempio:

16-3-1 16-4-2 2-1 8-1-1

e si separa i numeri per ogni cella purtroppo con questa funzione non riesco ad estrarre a causa del formato testo. ho provato a modificare Generale ma sbalza le date e non trovo altra soluzione oppure l'unica cosa da fare è j + 1 vero?
Una curiosità, come mai questo sito http://espn.go.com/nhl/standings/_/group/1 non si riesce nemmeno ad importare?
Sto usando quello che mi hai consigliato GetTabRaim222.
Grazie.
davide2574
Utente Junior
 
Post: 46
Iscritto il: 15/11/15 16:42

Re: Estrazione dati dal sito dinamico

Postdi Anthony47 » 14/01/16 02:14

Per quanto riguarda l'importazione dal sito http://espn.go.com/nhl/standings/_/group/1, e' necessario aggiornare nel codice della Function GetTabRaim222 la riga If myColl.Length > ttAAbb Then in If myColl.Length >= ttAAbb Then altrimenti non si importa da pagine con una sola tabella.

Quanto alla Function Strinum mi permetto di ipotizzare che se non funziona e' perche' l'hai usata impropriamente; in che formula l'hai inserita, quale e' il testo di partenza, che cosa ottieni dalla fomula e che cosa invece ti aspettavi?
D'altra parte una funzione che manipola le stringhe non puo' non funzionare "a causa del formato testo".

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

Re: Estrazione dati dal sito dinamico

Postdi davide2574 » 14/01/16 10:06

Allego il file

Cartel1.xlsm

Nel primo foglio , vorrei sapere come si può eliminare gli spazi delle righe perché si sono allargate tanto a causa delle immagini accanto ai nomi dei teams nel sito.

Nel secondo foglio come vede la funziona Strinum non estrarre i numeri nel formato di testo.

Ok funziona che mi hai indicato per la modifica If myColl.Length > ttAAbb Then in If myColl.Length >= ttAAbb Then
davide2574
Utente Junior
 
Post: 46
Iscritto il: 15/11/15 16:42

Re: Estrazione dati dal sito dinamico

Postdi davide2574 » 14/01/16 10:47

davide2574 ha scritto:Allego il file

Cartel1.xlsm

Nel primo foglio , vorrei sapere come si può eliminare gli spazi delle righe perché si sono allargate tanto a causa delle immagini accanto ai nomi dei teams nel sito.

Nel secondo foglio come vede la funziona Strinum non estrarre i numeri nel formato di testo.

Ok funziona che mi hai indicato per la modifica If myColl.Length > ttAAbb Then in If myColl.Length >= ttAAbb Then




Sub pippo()
zzz = GetTabRaim222("http://www.nhl.com/ice/standings.htm?type=lea#&navid=nav-stn-league", 1, Sheets("Foglio1").Range("A3"))
If zzz = 0 Then
MsgBox ("Importazione fallita")
Else
MsgBox ("Completato...")
End If
End Sub


ho provato ad aggiungere questo foglio1 perché potrei inserire nei diversi fogli. Mi confermi che ho sbagliato il codice?
davide2574
Utente Junior
 
Post: 46
Iscritto il: 15/11/15 16:42

Re: Estrazione dati dal sito dinamico

Postdi davide2574 » 14/01/16 11:32

davide2574 ha scritto:
davide2574 ha scritto:Allego il file

Cartel1.xlsm

Nel primo foglio , vorrei sapere come si può eliminare gli spazi delle righe perché si sono allargate tanto a causa delle immagini accanto ai nomi dei teams nel sito.

Nel secondo foglio come vede la funziona Strinum non estrarre i numeri nel formato di testo.

Ok funziona che mi hai indicato per la modifica If myColl.Length > ttAAbb Then in If myColl.Length >= ttAAbb Then
davide2574
Utente Junior
 
Post: 46
Iscritto il: 15/11/15 16:42

Re: Estrazione dati dal sito dinamico

Postdi Anthony47 » 14/01/16 23:44

Ah... Ho capito a cosa alludi!
La raccomandazione di formattare "Testo" vale per l'area destinata a importare i dati dal web, non per il resto del foglio e degli altri fogli, che saranno formattati come esigenza comanda: qualche cella come testo, qualche altra come numero a N decimali, altre in formato orario e cosi' via... E "ovviamente" le celle destinate a contenere formule non vanno formattate come testo.

Le righe si sono "allungate in altezza" perche' i nomi delle squadre sono preceduti per 2 volte dai caratteri CR/LF, per cui la scritta compare sulla terza riga della cella.
Pero' se formatti per "No testo a capo" quelle sequenze saranno ignorate; questa formattazione devi applicarla dopo aver importato i dati, quindi lo farai nelle macro che richiama la GetTabRaim222; ad esempio:
Codice: Seleziona tutto
Sub pippo()
zzz = GetTabRaim222("http://www.nhl.com/ice/standings.htm?type=lea#&navid=nav-stn-league", 2, Range("A3"))
If zzz = 0 Then
    MsgBox ("Importazione fallita")
Else
    Columns("B:B").WrapText = False
    MsgBox ("Completato...")
End If
End Sub

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

Re: Estrazione dati dal sito dinamico

Postdi davide2574 » 16/01/16 13:47

ciao

ho creato tutto i codici e aggiunti i links ma mi scarica solo uno e non altri dove ho sbagliato? :eeh: :undecided:
ecco il file

https://www.dropbox.com/s/e7qvz72bpuea8a6/PRoblema%20ICe%20Hockey%20Formula%20VBA1.xlsm?dl=0
davide2574
Utente Junior
 
Post: 46
Iscritto il: 15/11/15 16:42

Re: Estrazione dati dal sito dinamico

Postdi Anthony47 » 17/01/16 01:52

Lanciando la Sub pippo del tuo Modulo1 vengono importate tabelle su Foglio1, Foglio3, Foglio4 e Foglio5; Foglio2 risulta invece vuoto, perche' la "Tabella 1" (quella richiesta tramite la GetTabRaim222) e' vuota.
Forse tu vuoi importare su Foglio2 la Tabella 2, che esiste e contiene 30 righe per 20 colonne?

Un commento sull'ultima parte della macro:
Codice: Seleziona tutto
'Schedule (quinta tabella)
zzz = GetTabRaim222("http://stats.betradar.com/s4/?clientid=1271&language=en#2_4,3_37,22_2,5_11202,9_fixtures,231_full,23_3", 1, Sheets("Foglio5").Range("A3"))
If zzz = 0 Then
    MsgBox ("Importazione fallita")
Else
    MsgBox ("Completato...")
End If
Il test di "zzz" controllera' solo l'esito dell'importazione della quinta tabella; se vuoi conrollare l'importazione delle singole tabelle dovrai mettere un test dopo ogni importazione, es
Codice: Seleziona tutto
Sub pippo()
zzz = GetTabRaim222("http://espn.go.com/nhl/standings/_/group/1", 1, Sheets("Foglio1").Range("A3"))
If zzz <> 1 Then MsgBox ("Importazione di xyz fallita")

'Classifica Generale
zzz = GetTabRaim222("http://www.nhl.com/stats/team?reportType=game&report=teamsummary&season=20152016&gameType=2&aggregate=1", 2, Sheets("Foglio2").Range("A3"))
If zzz <> 1 Then MsgBox ("Importazione di 123 fallita")
'etc etc


Infine: ma lo "Stop" all'interno della GetTabRaim222 quando e' che lo togli (il commento alla funzione dicevea "All'interno della GetTabRaim222 ho inserito uno Stop assolutamente di prova, che serve a verificare visivamente che quanto importato corrisponda alla tabella visualizzata; terminato il collaudo lo Stop va rimosso")

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

PrecedenteProssimo

Torna a Applicazioni Office Windows


Topic correlati a "Estrazione dati dal sito dinamico":


Chi c’è in linea

Visitano il forum: Nessuno e 39 ospiti