Condividi:        

[Excel] Acquisizione dati Web in realtime

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: [Excel] Acquisizione dati Web in realtime

Postdi mpsinf » 04/12/12 08:20

Su Excel 2003 mi riporta errore di run-time -2147023706 (800704a6)
su Excel 2007 mi riporta errore di run-time -2147467259 (80004005)
questo il codice della macro che viene richiamata e dove da l'errore

Codice: Seleziona tutto
Sub A2_Estrai_valori()

 Dim myURL As String
 myURL = Range("B1").Value
 namefg = Range("A1").Value
 
   Set IE = CreateObject("InternetExplorer.Application") ' --->  si BLOCCA QUI
    With IE
        .Navigate myURL
        .Visible = False
        Do While .Busy: DoEvents: Loop    'Attesa not busy
        Do While .readyState <> 4: DoEvents: Loop 'Attesa documento
    End With
         
    Range("D:G").Clear ' cancella la sezione di acquisizione dei nuovi dati
    Range("D:D").NumberFormat = "dd/mm/yyyy hh\:mm\:ss"
    Range("B4").NumberFormat = "dd/mm/yyyy hh\:mm\:ss"
       

MyDoc = IE.Document.body.innertext
man = "non è consentito"  '<<< La stringa da controllare"
man1 = "non si sono"  '<<< La stringa da controllare"
manExist = Len(MyDoc) = (Len(man) + Len(Replace(MyDoc, man, "")))
man1Exist = Len(MyDoc) = (Len(man1) + Len(Replace(MyDoc, man1, "")))
 If manExist Then
  Range("A2") = "MANUALE"
 Else
  Range("A2") = "AUTOMATICO"
 End If
 
 If man1Exist Then Range("A4") = "New"
     
Set TagColl = IE.Document.getElementsByTagName("TD")

For Each myTag In TagColl
     
   If myTag.className = "items_list_timebid" Then
     Range("B2") = Left(myTag.innertext, (InStr(myTag.innertext, ":") + 5)) 
   End If
       
   If myTag.className = "items_list_price" Then
     Range("B3") = myTag.innertext
   End If
         
   If Left(myTag.ID, 19) = "last_bids_datetime_" Or MyFound Then
     If Len(myTag.innertext) > 1 Then
      If j = 0 Then
       Range("D1").Offset(i, j) = CDate(myTag.innertext)
      Else
       Range("D1").Offset(i, j) = myTag.innertext
      End If
     End If
      MyFound = True
      j = (j + 1) Mod 4
      i = i - 1 * (j = 0)
      If i > 9 Then Exit For ' Per uscire dal ciclo dopo aver acquisito i 10 dati
   End If

Next myTag

' per inserire i dati persi
If Range("F10").Value <> "" Then
  For a = 0 To (Range("F10").Value - Range("M1").Value) * 100 - 1
   If Range("M1").Value > 0.01 Then
   
    If Range("G10").Value = "Automatica" And x = 0 Then
    Range("D10:G10").Select ' se quello che rilancia è in automatico allora prendi l'ultimo altrimenti duplica con offerente vecchio
    x = 1
    Else
    Range("K2:N2").Select
    End If
   
    Selection.Copy
    Range("K1:N1").Select
    Selection.Insert Shift:=xlDown
    Range("M1").Value = Range("M2").Value + 0.01
    Selection.Font.ColorIndex = 3
   End If
  Next a
End If
     
  For a = 10 To 1 Step -1
   If Range("D1").Offset(a - 1, 2).Value <> " " And Range("D1").Offset(a - 1, 2).Value > Range("M1").Value Then
     Range("D" & a & ":G" & a).Select  'brutto codice a vedersi
     Selection.Copy
     Range("K1:N1").Select
     Selection.Insert Shift:=xlDown
   End If
  Next a
 
Columns("A:Z").EntireColumn.AutoFit

    Call A3_ChiQt

MyDoc = IE.Document.body.innertext
chs = "chiusa."  '<<< La stringa da controllare" ' ******** controlla sopra visto che se prima è negativo è chiusa
chsExist = Len(MyDoc) = (Len(chs) + Len(Replace(MyDoc, chs, "")))
If chsExist Then
  For i = 1 To Cells(Rows.Count, "N").End(xlUp).Row
     Cells(i, 15).Value = myURL
  Next i
 
 Worksheets("Raccolta").Range("CA:CE").Value = ActiveSheet.Range("K:O").Value

    Call A4_Vittorie
 
 Application.DisplayAlerts = False ' per evitare che si fermi per conferma nella cancellazione del foglio
 ActiveSheet.Delete
 Application.DisplayAlerts = True
 nfg = nfg - 1
 
End If

IE.Quit
Set IE = Nothing

End Sub


Sai suggerirmi eventuali sistemi per gestire l'errore e fare ripartire la macro o ciclo in automatico da solo ?
XP + Excel 2003 Ita
W7 + Excel 2007 Ita
mpsinf
Utente Senior
 
Post: 168
Iscritto il: 03/09/03 18:33

Sponsor
 

Re: [Excel] Acquisizione dati Web in realtime

Postdi Anthony47 » 04/12/12 13:14

Puoi allegare uno screenshot dell' errore, o citare l' intero messaggio di errore? Mi servono anche le risposte alle altre domande, relativamente alla situazione al momento dell' errore.
Come pure, immagino che la macro sara' eseguita "piu' di una volta": dove e come viene rieseguita? Puoi delineare cosa avviene nelle A3_ChiQt e A4_Vittorie?

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

Re: [Excel] Acquisizione dati Web in realtime

Postdi mpsinf » 20/12/12 09:05

Dalla seguente pagine web dovrei estrarre la stinga "il 19 dicembre 2012 alle 20:08

<!-- <span class=grigio>Prezzo di riserva: 0 &euro;</span><br /> -->
<span class=grigio>Timer: 50 secondi</span><br />
<span class="bianco"><strike>73.76 &euro;</strike><br>7.38 &euro;</span><br />

Prodotto aggiudicato a: <a onclick="window.open('/profilo_pop_vinte.php?asta=90213', 'profilo','top=50, left=50, width=450, height=120, status=no, menubar=no, toolbar=no, scrollbars=yes');" href="#">huet44<br /><img src="http://img.prezzipazzi.com/fb_profile/huet44.jpg"></a> <br/>
il 19 dicembre 2012 alle 20:08<br/>Spesa in pacchetti per vincere quest'asta: 375.02 &euro;

<br /><br />

<a href="/fatture.php?asta=90213" style="text-align: center; background: yellow; color: black">&nbsp;&nbsp;&nbsp;<u>Controlla se &egrave; stata spedita</u>&nbsp;&nbsp;&nbsp;</a>


ma con il solito
Codice: Seleziona tutto
    Set TagColl = IE.Document.getElementsByTagName("SPAN")
    oppure
 Set TagColl = IE.Document.getElementsByTagName("A")
  For Each myTag In TagColl
  MsgBox myTag.innertext
   MsgBox myTag.href
    Next myTag
 


non riesco ad estrarlo .... a cosa posso fare riferimento nell'analisi del codice ?
XP + Excel 2003 Ita
W7 + Excel 2007 Ita
mpsinf
Utente Senior
 
Post: 168
Iscritto il: 03/09/03 18:33

Re: [Excel] Acquisizione dati Web in realtime

Postdi Anthony47 » 20/12/12 10:59

La voce a cui fai riferimento non ha nessun Id, ne' appartiene a un tag; devi quindi partire dal document.body.innertext e poi parcellizzarlo; da quel che vedo mi sembra la 12ma riga nel testo.

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

Re: [Excel] Acquisizione dati Web in realtime

Postdi mpsinf » 23/12/12 11:50

Ok... ma per parcelizzarlo cosa intendi ? c'è un codice "universale" per estrarre da un testo tutto quello che è presente tra 2 stringhe ?

E per estrarre i due valori da questo pezzo di codice ?
<span class="bianco"><strike>73.76 &euro;</strike><br>7.38 &euro;</span><br />

Il primo riesco ad estrarlo con
Set TagColl = IE.Document.getElementsByTagName("strike")
ma il 2° come faccio ho prova to con "/strike" , "strike br" e "br" ma senza esito..
XP + Excel 2003 Ita
W7 + Excel 2007 Ita
mpsinf
Utente Senior
 
Post: 168
Iscritto il: 03/09/03 18:33

Re: [Excel] Acquisizione dati Web in realtime

Postdi Anthony47 » 23/12/12 18:07

Qualche giorno fa, vedi viewtopic.php?p=562419#p562419, ti ho suggerito l' uso di "split"
Ho usato la funzione Split (vedi help on line), parcellizzando le varie componenti, in parti sempre piu' piccole: Split0 contiene le N righe del sorgente [le prime due sono vuote, quindi ho sotto-diviso la Split(2)]; Split1 contiene i vari campi separati dalla virgola; Split2 separa ad esempio "attiva[89767]" e il suo valore "0"

Direi che in quella risposta c' e' anche la risposta al tuo quesito odierno.

Quanto all' estrazione dei due prezzi dal sorgente <span class="bianco"><strike>73.76 &euro;</strike><br>7.38 &euro;</span><br />: se la ClassName "bianco" e' usata solo in questa parte, allora esamina la collezione ByTag("span"), poi esamina ogni item della collezione cercando quello con ClassName="bianco" e ne leggi il suo innerText; qualcosa come:
Codice: Seleziona tutto
For each myItm in myColl
If myItm.Classname="bianco" then
   MioTesto=myItm.Innertext
   Ext For
End if
Next myItm

Poi "parcellizzi" con Split il contenuto di MioTesto, tenendo presente che il "br" inserisce un chr(10) nella stringa di MioTesto.
Il codice dato sopra e' un "concept", che va quindi controllato e debuggato; ma di casi simili ne abbiamo trattato oramai decine.

Se invece Classname=bianco e' usato anche in altre parti del sorgente allora devi trovare l' elemento che racchiude gerarchicamente il sorgente che hai pubblicato, e lavorare sul suo contenuto.

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

Re: [Excel] Acquisizione dati Web in realtime

Postdi mpsinf » 19/01/13 15:34

Proseguo su questo post per avere un aiuto visto che si parla ancora di acquisizione dati in realtime.
Tramite l'analisi dei fogli disponibili apro tante sessioni IE

Codice: Seleziona tutto
Do Until Sheets(nfg + 1).Name = "Home"
 nfg = nfg + 1
 Set IE(nfg) = CreateObject("InternetExplorer.Application")
 Sheets(Sheets(nfg).Name).Select
 fg = Range("A1").Value
   
   With IE(nfg)
    .navigate "http://www.sito-analisi&id=" & fg
    .Visible = False
    Do While .Busy: DoEvents: Loop    'Attesa not busy
    Do While .readyState <> 4: DoEvents: Loop 'Attesa documento
  End With
Loop


successivamente il codice
Codice: Seleziona tutto
 
For fg = 1 To nfg
   Set TagColl = IE(fg).document.getElementsByTagName("TD")
  For Each myTag In TagColl
  If myTag.innertext <> "" Or MyFound Then
 ecc. ecc.


mi analizza la pagina che viene normalmente aggiornata ogni minuto, però se io navigo normalmente e premo F5 (aggiorna) la schermata viene aggiornata subito senza attendere il minuto.
Volevo sapere che comando usare in VBA per aggiornare la pagina da analizzare prima di eseguire l' innertext.
XP + Excel 2003 Ita
W7 + Excel 2007 Ita
mpsinf
Utente Senior
 
Post: 168
Iscritto il: 03/09/03 18:33

Re: [Excel] Acquisizione dati Web in realtime

Postdi Anthony47 » 19/01/13 15:50

Devi rieseguire il .navigate e l' attesa del documento (cicli Do While .Busy e Do While .readyState) subito prima del Set TagColl = IE(fg).etc.etc
Ovviamente questo potrebbe rendere superfluo gli analoghi comandi inseriti nel ciclo With IE(nfg) /End With, ma dipende da come sono globalmente organizzate le macro.

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

Re: [Excel] Acquisizione dati Web in realtime

Postdi mpsinf » 19/01/13 16:11

Si... ma così ho paura di ritrovarmi di nuovo con la saturazione della RAM.. (farò comunque delle prove)
Così come era l'innertext ora, analizzava la pagina che si riaggiornavano in automatico ogni minuto... senza "rinavigare"
la pagine e avere problemi con il readystate.

Responso ... nessuna alternativa ?
XP + Excel 2003 Ita
W7 + Excel 2007 Ita
mpsinf
Utente Senior
 
Post: 168
Iscritto il: 03/09/03 18:33

Re: [Excel] Acquisizione dati Web in realtime

Postdi Anthony47 » 19/01/13 16:14

Chiudere periodicamente tutti gli oggetti IE (esempio ogni 10 minuti) e ricrearli?
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Acquisizione dati Web in realtime

Postdi mpsinf » 09/03/13 17:18

Anthony47 ha scritto:Devi rieseguire il .navigate e l' attesa del documento (cicli Do While .Busy e Do While .readyState) subito prima del Set TagColl = IE(fg).etc.etc
Ovviamente questo potrebbe rendere superfluo gli analoghi comandi inseriti nel ciclo With IE(nfg) /End With, ma dipende da come sono globalmente organizzate le macro.

Mi sono accorto che la pagina che stò analizzando si aggiorna in automatico ogni minuto, però con F5 mi si riaggiorna in tempo reale anche prima dell'attesa del minuto previsto (diciamo un refresh manuale più frequente).
Mi dici che non c'è una maniera di fare il refresh da VBA (io ho provato anche con IE.refresh).

Quindi da tuo consiglio nel codice VBA vado a ricaricarmi la pagina con
Codice: Seleziona tutto
.navigate "http://www.xxxx.com/xx.php?refresh=1&id=" & "990099"
però mi sono accorto che mi mantiene la stessa "vecchia" schermata... e si aggiorna solo quando è passato il fatidico minuto !!

Mi spiego meglio, se visualizzo con .Visible = True la pagina Web analizzata e nella barra dell'url modifico ....php?refresh=2&id=990099 mi carica una pagina aggiornata rispetto a quando è scritto refresh=1 come è inizialmente.
se cambio refresh=1 con qualsiasi altro numero es refresh=9 mi fa vedere i dati aggiornati, ma se ridigito una refresh=n con n già utilizzato mi fa vedere la vecchia lista dei dati.
Secondo te da cosa può dipendere e come posso risolvere il problema ?
XP + Excel 2003 Ita
W7 + Excel 2007 Ita
mpsinf
Utente Senior
 
Post: 168
Iscritto il: 03/09/03 18:33

Re: [Excel] Acquisizione dati Web in realtime

Postdi Anthony47 » 10/03/13 00:23

Si tratta di una query fatta al web server, non so che cosa fa il server a fronte di quei parametri; magari si puo' dedurre con una serie di osservazioni.

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

Re: [Excel] Acquisizione dati Web in realtime

Postdi mpsinf » 10/03/13 10:39

Ho risolto con un attesa di un secondo dopo il refresh
Codice: Seleziona tutto
IE1.refresh
 Application.Wait (Now + TimeValue("0:00:01"))
 

il PC "troppo veloce" :D non permetteva di fare il refresh in tempo
XP + Excel 2003 Ita
W7 + Excel 2007 Ita
mpsinf
Utente Senior
 
Post: 168
Iscritto il: 03/09/03 18:33

Precedente

Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Acquisizione dati Web in realtime":


Chi c’è in linea

Visitano il forum: Gianca532011 e 85 ospiti