Condividi:        

[Excel] Lettura dati da pagina 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

[Excel] Lettura dati da pagina web

Postdi foreights » 08/09/06 17:32

Salve a tutta la comunità.
Mi sto scontrando con questo problema. So che la soluzione esiste, ho anche un codice VBA, ma ho difficoltà ad adattarlo al caso mio.
L'idea, se siete d'accordo, è quella di analizzare questo codice esistente per capire, col vostro aiuto, come adattarlo al caso mio.
Posso cominciare a postare?
(... pian pianino?)
:)
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Sponsor
 

Postdi foreights » 08/09/06 18:29

Anche se nessuno mi ha risposto, sottopongo comunque il codice. Spero di essere aiutato da qualcuno. ;)

Allora, il codice qui indicato legge la pagina web in oggetto e la scrive in un file .txt depositandolo sul desktop.
Mi sembra anche di capire, dall'esecuzione della macro, che viene anche aperto un foglio excel temporaneo (non so bene per quale motivo).

C'è qualche anima pia che riesce a spiegarmi il codice?

Ringrazio molto.
Codice: Seleziona tutto
Sub ScaricaDatiDaWeb()
Workbooks.Open Filename:= _
        "http://www.eurexchange.com/quotes/delayed/options/DAX/ODAX_C_200609.html"
ActiveWindow.Visible = True
ActiveWorkbook.SaveAs Filename:="..\Desktop\Scarico.txt", FileFormat _
        :=xlText, CreateBackup:=False
Windows("Scarico.txt").Activate
ActiveWindow.Close False
End Sub
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi Alexsandra » 08/09/06 20:27

Spiega prima le tue esigenze in modo da farci capire quello che vuoi fare e poi analizziamo il codice Ok. :D
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi Anthony47 » 09/09/06 17:59

Hi x88,
Condivido la posizione di Alexsandra; non ha senso fare il reverse engineering di macro, e' molto piu' facile aiutarti se dici "vorrei fare questo", "ho provato cosi'" "ma mi succede questo", o cose del genere.

Comunque la macro fa quello che promette:
-apre un file (il formato html e' uno di quelli aperti da excel)
-salva questo file in formato txt
-chiude il file; qui il False serve a indicare a excel che non si vuol salvare il file (che comunque e' stato appena salvato; nel formato txt serve comunque)

Le istruzioni .Visible = True e .Activate credo siano superflue: un file appena aperto e' certamente visibile e non nascosto, e un file appena salvato e' certamente attivo.

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

Postdi foreights » 09/09/06 18:38

Intanto grazie per le spiegazioni.
Allora, come dicevo nel titolo, l'obiettivo della macro è quello di leggere i dati contenuti in una pagina web e depositarli in un foglio excel per poi poterne fare alcune elaborazioni di tipo statistico.
La pagina in questione è:
http://www.eurexchange.com/quotes/delay ... 00609.html
che, come si può osservare, contiene una tabella di alcune righe per 12 colonne. Il primo campo di ciascuna riga (ovvero la prima colonna) è lo "strike price" che varia da 3000 a 7000 con incrementi di 50 (7000, 6950, 6900, ...). In realtà gli incrementi non sono sempre di 50: qualche volta lo sono di 100. Ma credo che questo non sia un problema.

La routine di cui accennavo e della quale, al post precedente, avevo già sottoposto la prima parte, è indicata più avanti. L'autore l'ha elaborata per raggiungere, all'incirca, lo stesso obiettivo che mi sono proposto io. Nel caso della routine in questione l'autore legge i dati da una pagina web del sole24ore (open,high,low e close) relativamente a 4 titoli della borsa italiana.
Questo è quanto.
Ho provato a decodificarla ma non sono riuscito nell'intento. Ecomi qui, dunque, a chiedervi una mano.
Si può fare?
Grazie.
Codice: Seleziona tutto
Sub ScaricaDatiDaWeb()
Workbooks.Open Filename:= _
   "http://www.24oreborsaonline.ilsole24ore.com/fc?chId=43&sezId=10029"
    ActiveWindow.Visible = True
    ActiveWorkbook.SaveAs Filename:="..\Desktop\Scarico.txt", FileFormat _
        :=xlText, CreateBackup:=False
    Windows("Scarico.txt").Activate
    ActiveWindow.Close False


       Workbooks.OpenText Filename:= _
        "..\Desktop\Scarico.txt", Origin:= _
        xlWindows, StartRow:=3, DataType:=xlDelimited, TextQualifier:= _
        xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
        Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), _
        Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), _
        Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15 _
        , 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 1), _
        Array(22, 1), Array(23, 1)) ', DecimalSeparator:=",", ThousandsSeparator:="."

       
    Windows("Scarico.txt").Activate
    Cells.Find(What:="Capitalia", After:=ActiveCell, LookIn:= _
        xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _
        xlNext, MatchCase:=False).Activate
   
    ActiveCell.Offset(0, 2).Range("A1:A1").Activate
    ClCap = ActiveCell
    ActiveCell.Offset(0, 5).Range("A1:A1").Activate
    OpCap = ActiveCell
    ActiveCell.Offset(0, 1).Range("A1:A1").Activate
    MiCap = ActiveCell
    ActiveCell.Offset(0, 1).Range("A1:A1").Activate
    MaCap = ActiveCell
   
    Cells.Find(What:="Enel", After:=ActiveCell, LookIn:= _
        xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _
        xlNext, MatchCase:=False).Activate
   
    ActiveCell.Offset(0, 2).Range("A1:A1").Activate
    ClEnel = ActiveCell
    ActiveCell.Offset(0, 5).Range("A1:A1").Activate
    OpEnel = ActiveCell
    ActiveCell.Offset(0, 1).Range("A1:A1").Activate
    MiEnel = ActiveCell
    ActiveCell.Offset(0, 1).Range("A1:A1").Activate
    MaEnel = ActiveCell
   
    Cells.Find(What:="Eni", After:=ActiveCell, LookIn:= _
        xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _
        xlNext, MatchCase:=False).Activate
   
    ActiveCell.Offset(0, 2).Range("A1:A1").Activate
    ClEni = ActiveCell
    ActiveCell.Offset(0, 5).Range("A1:A1").Activate
    OpEni = ActiveCell
    ActiveCell.Offset(0, 1).Range("A1:A1").Activate
    MiEni = ActiveCell
    ActiveCell.Offset(0, 1).Range("A1:A1").Activate
    MaEni = ActiveCell

    Cells.Find(What:="Stmicroelectronics", After:=ActiveCell, LookIn:= _
        xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _
        xlNext, MatchCase:=False).Activate
   
    ActiveCell.Offset(0, 2).Range("A1:A1").Activate
    ClStm = ActiveCell
    ActiveCell.Offset(0, 5).Range("A1:A1").Activate
    OpStm = ActiveCell
    ActiveCell.Offset(0, 1).Range("A1:A1").Activate
    MiStm = ActiveCell
    ActiveCell.Offset(0, 1).Range("A1:A1").Activate
    MaStm = ActiveCell
   
        Windows("Esempio 3 - Scarico dati daily da Borsaitalia.xls").Activate
    Sheets("Azioni").Select
    Cells(5, 3) = OpCap
    Cells(5, 4) = MaCap
    Cells(5, 5) = MiCap
    Cells(5, 6) = ClCap
   
    Cells(7, 3) = OpEni
    Cells(7, 4) = MaEni
    Cells(7, 5) = MiEni
    Cells(7, 6) = ClEni
   
    Cells(6, 3) = OpEnel
    Cells(6, 4) = MaEnel
    Cells(6, 5) = MiEnel
    Cells(6, 6) = ClEnel
   
    Cells(8, 3) = OpStm
    Cells(8, 4) = MaStm
    Cells(8, 5) = MiStm
    Cells(8, 6) = ClStm
   
    Windows("Scarico.txt").Activate
    ActiveWindow.Close False
   
    Kill "..\Desktop\Scarico.txt"

End Sub


*** I codici vanno racchiusi entro i tag [ ] cliccando sul tasto Code
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi Alexsandra » 09/09/06 20:25

Hai provato a leggere questa discussione
http://www.pc-facile.com/forum/viewtopic.php?t=47108
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi foreights » 09/09/06 20:38

D'accordo, me la studio.
Grazie Alexsandra.
:)
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi Alexsandra » 09/09/06 20:54

Prova a guardarla e poi ne parliamo, mi sembra che il codice sia più semplice e lineare.

Poi posta le tue impressioni e vediamo di continuare
ciao
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi foreights » 09/09/06 21:08

Allora, l'ho vista e l'ho provata: funziona spendidamente.
Purtroppo non so come adattarla al caso mio.

Intanto sono andato avanti con la routine che avevo prima, ho remmato le istruzioni che Anthony indicava come non necessarie, ed ho salvato il tutto su un file .xls, denominato Scarico.xls.
Le informazioni, quindi, ora le ho. Ciò che ora vorrei fare:

1. cercare le coordinate della cella che contiene la parola "Strike" e quelle della cella che contiene la parola "Total";
2. trasformare il contenuto della cella D39 che al momento corrisponde a 7000.00.00 ( e che Excel interpreta come data e ora), in 7000.
3. aggiungere un nuovo foglio excel avente come nome la data del giorno in cui viene effettuata la lettura nella forma, ad esempio, 8set06.

Il resto, poi, dovrei riuscire a farlo da solo.
;)

Grazie
Codice: Seleziona tutto
Sub Scariyahoo()

       Workbooks.Open Filename:= _
        "http://www.eurexchange.com/quotes/delayed/options/DAX/ODAX_C_200609.html"
    ' ActiveWindow.Visible = True
    ActiveWorkbook.SaveAs Filename:="..\Desktop\Scarico.xls", FileFormat _
        :=xlText, CreateBackup:=False
    ' Windows("Scarico.txt").Activate
    ActiveWindow.Close False
End Sub
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi foreights » 10/09/06 11:38

Il primo dei tre quesiti l'ho risolto con il codice che qui allego. Forse non sarà il massimo dell'efficienza ma funziona. :!:

Mi concentro sui quesiti successivi.

A beneficio dei membri di questa comunità cui può interessare, ecco il codice.
Codice: Seleziona tutto
Sub CercaRigaEColonna()
Dim r, c, Riga1, Riga2, Colonna1, Colonna2 As Integer
For c = 1 To 15
For r = 1 To 250
If Cells(r, c) = "Strike" Then
    Riga1 = r  'ho trovato la riga "Strike"
    Colonna1 = c 'ho trovato la colonna "Strike"
End If
If Cells(r, c) = "Total" Then
    Riga2 = r  'ho trovato la riga "Total"
    Colonna2 = c 'ho trovato la colonna "Total"
End If
Next r                                 'scan per 250 righe
Next c                                 '... e per 15 colonne
MsgBox ("'Strike' ha coordinate:" & Riga1 & " " & Colonna1)
MsgBox ("'Total' ha coordinate:" & Riga2 & " " & Colonna2)
End Sub
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi foreights » 10/09/06 16:00

E anche questa è fatta. La routine che segue aggiunge alla cartella Option.xls un nuovo foglio e lo rinomina con una stringa che rappresenta la data corrente (nella forma, ad esempio, 09set06). Il foglio aggiunto è posizionato in coda rispetto ai fogli già esistenti nella cartella.
A beneficio di tutti coloro che seguono questo thread.
Alla prossima.
;)
Codice: Seleziona tutto
Sub AggiungiNuovoFoglio()
' aggiunge un nuovo foglio, in coda, e lo rinomina col nome della data corrente
Dim NomeFoglio As String
Dim k As Integer
k = Workbooks("Option.xls").Sheets.Count
Worksheets.Add.Move after:=Worksheets(Worksheets.Count)
NomeFoglio = Left(Date, 2) & Format(Month(Date), "mmm") & Right(Date, 2)
Sheets.Item(k + 1).Name = NomeFoglio
End Sub
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi foreights » 10/09/06 17:21

Ho controllato meglio e mi sono accorto di un problema con
Format(Month(Date), "mmm")

Mi dovrebbe restituire set ma, in realtà, mi restituisce gen. Qualcuno ha qualche idea?
Grazie.
:x
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi foreights » 10/09/06 17:49

Oltre al problema segnalato prima, inerente la funzione format, ne riscontro un altro.
I dati letti e salvati in Scarico.xls con la porzione di routine indicata in calce al presente messaggio, non vengono sempre interpretati come numeri (interi). La cosa strana è che nella stragrande maggioranza dei casi (oltre 80) ciò avviene. Solo in tre o quattro casi, invece, non avviene.
Entro meglio nel merito specificando i tipi di dati letti. Allora, nella prima riga undicesima colonna della pagina web sorgente c'è il dato:
9,325
ebbene, la routine legge il dato (correttamente) come:
9325 .
In quinta riga (medesima colonna) c'è 23,693 e questo viene letto come 23693. Insomma, si comporta quasi sempre bene. Alla riga 9 c'è 2,200. Questo viene letto come 2.02 e, se interrogo il formato celle, mi risponde che è un campo ora.
Alla riga corrispondente allo strike 5750 il dato in pagina web è 18,750. Il dato letto è 0,802083333; se interrogo il formato celle, mi risponde che è un campo 'generale'.

Come ne posso uscire secondo voi?
Ancora grazie.
:evil:
Codice: Seleziona tutto
Workbooks.Open Filename:= _
"http://www.eurexchange.com/quotes/delayed/options/DAX/ODAX_C_200609.html"
ActiveWorkbook.SaveAs Filename:="..\Desktop\Scarico.xls", FileFormat _
:=xlText, CreateBackup:=False
ActiveWindow.Close False
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi Alexsandra » 10/09/06 19:37

foreights ha scritto:...Come ne posso uscire secondo voi?
Cominciando ad usare il tasto CODE quando posti il codice VBA, ti ho modificato tutti i post :D

PS. Secondo te come potresti uscirne?
secondo mè se usi il tasto CODE e una volta importati i dati formatti scarico.xls potresti risolvere i tuoi problemi
http://www.pc-facile.com/forum/viewtopi ... 015#264015
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi foreights » 10/09/06 19:50

Aspetta ...
... ho capito bene!?
Mi hai formattato tutti i codici? Ti ringrazio e ti prego di scusarmi.
:(

Il tasto Code lo devo utilizzare un carattere prima del codice ed un carattere dopo?

E poi, a parte questo, non ho capito il tuo suggerimento.
Mi spieghi meglio per favore?

Ti ringrazio.
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi Alexsandra » 10/09/06 20:51

clicca sul link del mio ultimo post.
Il tasto code lo clicchi prima di incollare il codice, incolli il codice e vedrai che il tasto code diventa *code (per ricordarti che hai il tag aperto) lo clicchi ancora e vedrai il codice come nei tuoi post che ho editato.

Fai una prova e clicca su anteprima, è molto utile per mettere in evidenza il codice
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi foreights » 10/09/06 20:58

Ok, ho capito.
Faccio la prova che mi suggerisci e poi vado a vedermi il link.
Grazie ancora.
:)
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi Anthony47 » 10/09/06 23:11

Ciao x88,
Per l' aggiunta e rinominazione del foglio potresti usare

Codice: Seleziona tutto
Sub AggiungiNuovoFoglio()
Worksheets.Add After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = Format(Date, "yy-mm-dd")
End Sub

Il nome e' tutto numerico (es. 06-09-10), ma se vuoi puoi usare altri formati, es "yy-mmm-dd" per 06-set-10.

Per il problema dell' errata interpretazione di numeri importati, prova a cambiare il settaggio come segue:
Menu ->Strumenti ->Opzioni; seleziona tab "Internazionale", rimuovi lo spunto su "Utilizza separatori di sistema" e inserisci "Separatore decimale"= . (segno "punto") e "Separatore delle migliaia" = , (segno "virgola").
Sia chiaro che con questo settaggio dovrai scrivere 3.14 e non piu' 3,14; intanto vediamo se si risolve il problema dell' importazione (problema che io non ho ricreato, ma ho un settaggio "internazionale" tipo "U.S.").

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

Postdi Anthony47 » 11/09/06 10:28

Penso sempre che la query web dovrebbe essere una via piu' diretta per accedere ai dati.
Nel caso specifico, ho registrato la seguente macro che fa l' operazione:

Codice: Seleziona tutto
Sub Eurex()
'
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://www.eurexchange.com/quotes/delayed/options/DAX/ODAX_C_200609.html" _
        , Destination:=Range("A1"))
        .Name = "ODAX_C_200609"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = False
'        .RefreshStyle = xlInsertDeleteCells
        .RefreshStyle = xlOverwriteCells
'        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingNone
        .WebTables = "7"
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
    Range("A1").Select
       
End Sub


Puo' essere utile?

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

Postdi foreights » 11/09/06 21:38

Se può essere utile?
Grazie Anthony 47. Sei un fenomeno. Funziona alla meraviglia. Ora me la studio, in quanto oltre a risolvere i problemi che ho vorrei anche cercare di crescere (e magari dare una mano a qualcun altro in difficoltà!).

Una cosa, comunque, ho dovuto "remmare" l'istruzione:

.WebDisableRedirections = False

in quanto mi dava errore. Dopo di ciò, tutto a posto.
Ma a cosa serve questa istruzione?


Una domanda, ora. Ho visto che i numeri sulla pagina web utilizzano la virgola come separatore delle migliaia mentre, per excel, la virgola è interpretata come separatore decimale.

Una prima idea che mi è venuta per risolvere il problema è quella di trasformarmi il numero in stringa, eliminare la virgola e poi ritrasformare il tutto in numero (con Val). Questo metodo, però, è affetto da un problema che ti rendo con un esempio. In sesta riga undicesima colonna troviamo la costante 28,590. Excel la interpreta come 28,59 e quindi, se adotto il metodo che ti ho indicato, il risultato finale sarà 2859 (in luogo di 28590).

Una seconda idea è quella di utilizzare lo stesso metodo ma, prima, effettuare una moltiplicazione per 1000 di tutti quei numeri che contengono la virgola. Così dovrei risolvere.

Oppure, qualcos'altro? Magari un particolare settaggio che dica a VBA di interpretare la virgola come separatore delle migliaia e non come separatore decimale?

Grazie mille e più.
:)
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Lettura dati da pagina web":


Chi c’è in linea

Visitano il forum: Nessuno e 124 ospiti