Caricamento dati esterni



  • Caricamento dati esterni
    di Perry (utente non iscritto) data: 15/03/2014 14:12:06

    Buona giornata a tutti
    Vorrei cominciare ad importare i dati del sito excelvba.it dal web ma non so come iniziare, ho aperto l' etichetta "Carica dati esterni" ma tutte le fonti mi appaiono in grigio e non sono disponibili (??).

    Se qualcuno avesse la pazienza di indicarmi passo-passo cosa devo fare ne sarei infinitamente grato anche se non voglio abusarne
    Perry



  • di lepat (utente non iscritto) data: 15/03/2014 16:46:30

    che significa importare i dati del sito excelvba.it ?



  • di Perry (utente non iscritto) data: 15/03/2014 17:03:55

    In un Foglio Excel sto storicizzato tutte le discussioni man mano che vengono pubblicate e salvo gli allegati.

    Lo faccio per mia cultura e interesse creando un archivio consultabile di tutte le soluzioni proposte utili e interessanti.

    Il mio post si riferisce al fatto che oggi copio-incollo dal Web i riferimenti, ma volevo poterlo fare in automatico.
    Posso allegare il file com'è oggi se può interessare.
    Perry



  • di Mauro data: 15/03/2014 18:42:57

    Forse possono tornarti utili gli RSS che trovi in fondo a sinistra della pagina. Mi raccomando, se lo pubblichi ricordati di inserire il link al sito.



  • di Luca.Donati data: 15/03/2014 19:44:45

    Scusate, mi intrometto.
    Volevo dire che effettivamente Mauro ha ragione: la strada più corta è quella giusta, come in matematica.

    Ma nel caso del download da Internet con vba, la materia è piuttosto poco conosciuta e il poco che si trova è deludente. Quindi, se qualcuno ci si vuole misurare, o ha già esperienza, sappia che ci sono orecchie attente in giro...

    Incollo qui sotto un codice "pompato" su questo stesso forum e poi stravolto dal sottoscritto per fini miei; ho lasciato la maggior parte dei commenti dell'autore. Non funziona, credo che le modifiche che ho fatto lo rendano inutilizzabile in questo stato, ma ci sto lavorando. Se qualcuno se ne vuole ispirare, probabilmente ne approfitterò anch'io.
    Ci tolgo gli indirizzi internet, altrimenti il sito mi fa una pernacchia.

    Grazie dell'attenzione, ciao.
     
    Option Explicit
    
    Dim FINE As Boolean
    Const pagina = ... 'qui c'è l'ndirizzo di una pagina precisa
    
    Private Sub cmdAggiorna_Click()
       Dim r As Integer, p As Single
       r = 2 ' prima riga in cui scrivere (in colonna 1)
       Do While Cells(r, 1) <> ""   ' ripeti fino alla fine delle righe occupate
          Cells(r, 2).Font.Color = vbRed   'evidenzia in rosso il prezzo in corso di aggiornamento...
          p = SingoloPrezzo(Cells(r, 1))
          If p Then                  'scrive il nuovo prezzo, SOLO se <> 0
             Cells(r, 2) = p
             Cells(r, 2).Font.Color = vbBlack    'se il dato e' stato aggiornato, riporta il colore a nero.
          End If
          r = r + 1
       Loop
    End Sub
    Sub LanciaStringaSeguente10righe()
    Dim URL As String, StrgPrec As String, i As Integer, s As String
    URL = InputBox("Inserire URL")
    StrgPrec = InputBox("Inserire Stringa Precedente")
    For i = 1 To 10
        s = StringaSeguente(URL, StrgPrec)
        ActiveCell.Value = s
        ActiveCell.Offset(1, 0).Select
        StrgPrec = s
    Next i
    End Sub
    Private Function StringaSeguente(URL As String, StrgPrec As String) As String '100 caratteri dopo la stringa di partenza
       Dim txt As String ', URL As String
       Dim p As Integer, s As String, pr As String, c As String
       txt = LeggiPagina(URL)
       s = StrgPrec  ' stringa da cercare, che precede il dato che ci interessa
       p = InStr(1, txt, s, vbTextCompare)
       If p Then
          p = p + Len(s)    ' a partire da qui c'e' la parte che ci interessa
          pr = ""
          c = Mid$(txt, p, 100)
          pr = pr & c
          p = p + 1
          StringaSeguente = pr
       End If
    End Function
    
    Private Function SingoloPrezzo(ISIN As String) As String 'Single
       Dim URL As String, txt As String
       Dim p As Integer, s As String, pr As String, c As String
       
       URL = pagina
       txt = LeggiPagina(URL)
       s = "ORDRE D'ARRIVÉE"    ' stringa da cercare, che precede il dato che ci interessa
       p = InStr(1, txt, s, vbTextCompare)
       If p Then
          p = p + Len(s)    ' a partire da qui c'e' il prezzo
          pr = ""
          Do       ' leggi il prezzo, carattere per carattere
             c = Mid$(txt, p, 1)
             'If InStr(1, "0123456789,", c) Then    ' accetta cifre o virgola decimale
                pr = pr & c
                p = p + 1
             'Else     ' al primo carattere non accettabile esci dal loop (fine prezzo)
                'Exit Do ' io invece non lo faccio uscire
             'End If
          Loop
          SingoloPrezzo = pr
       End If
    End Function
    
    
    Private Function LeggiPagina(URL As String) As String
    ' legge una singola pagina Web e ne restituisce il testo contenuto...
       FINE = False
       WB.Navigate URL
       Do
          DoEvents
       Loop Until FINE
       LeggiPagina = WB.Document.body.innertext
    End Function
    
    Private Sub WB_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    ' questo evento viene generato alla fine del caricamento di OGNI frame secondario.
    ' Per accertarsi che l'intera PAGINA e' stata caricata, bisognerebbe controllare il tipo di oggetto pDisp,
    ' ma apparentemente il VBA non lo permette (!?), pertanto possono risultare dei 'fine pagina' fittizi,
    ' col risultato di ottenere (a volte, specie in caso di apparizione di pop-up) dei dati errati o duplicati !
       FINE = True
    End Sub
    
    Private Sub WB_ProgressChange(ByVal Progress As Long, ByVal ProgressMax As Long)
    ' aggiorna la percentuale di caricamento effettuato...
       Dim p As Single
       If ProgressMax Then
          p = Progress / ProgressMax
          If p > 1 Then p = 1
          PROG.Caption = FormatPercent(p, 0)
       End If
    End Sub
    
    Private Sub WB_StatusTextChange(ByVal Text As String)
    ' mostra i messaggi provenienti dal WebBrowser...
       If Text <> "" Then MSG.Caption = Text
    End Sub
    



  • di scossa data: 16/03/2014 19:44:38

    Ciao,

    cit. Luca.Donati: "Ci tolgo gli indirizzi internet, altrimenti il sito mi fa una pernacchia. "

    Come ho già avuto modo di dire, purtroppo le pagina web sono una torre di babele (html, asp, php, java, javascript, jquery .....) e creare un parser universale è impossibile, bisogna fare un "vestito su misura" per quasi ogni pagina.
    Per cui senza l'indirizzo della pagina ..... (basta omettere l'accatitipi e puoi inserirlo www.excelvba.it)



  • di scossa data: 16/03/2014 19:49:49

    In questa discussione: www.excelvba.it/Forum/thread.php?f=2&t=6035
    avevo proposto un codice, aspettavo un riscontro per sviluppare l'argomento, ma evidentemente non interessa molto.



  • di lepat (utente non iscritto) data: 16/03/2014 20:22:22

    Io credo che invece interessi molti, ma penso che non ti abbiano capito, io per primo, non hai dato molte spiegazioni.



  • di scossa data: 16/03/2014 21:23:11

    cit. lepat: "Io credo che invece interessi molti, ma penso che non ti abbiano capito, io per primo, non hai dato molte spiegazioni."

    Ciao lepat,
    se a qualcuno un argomento interessa le spiegazioni le richiede; fornirle a priori sarebbe opera meritevole ma richiede tempo ed impegno (quando sarò in pensione magari lo farò), e poi se non ottieni alcun feedback ti resta la sensazione di aver perso solo tempo.



  • di lepat (utente non iscritto) data: 17/03/2014 08:15:11

    Allora le chiedo io, so bene che creare un parser universale è impossibile, quindi occorrerebbe dare un esempio per una pagina, magari quella principale di questo sito e poi dare delle direttive generali da seguire.



  • di Luca.Donati data: 17/03/2014 09:13:01

    Ciao, scossa.
    Sì, ho visto che si può togliere l'h t t p oppure intervallare con spazi, ma funziona una volta su due, non ho capito come e perché. In più, una volta che faccio l'errore e il sito mi rifiuta il post, poi deve restare qualche porcheria nel computer che mi impedisce di postare qualsiasi cosa fino al login successivo...
    Comunque, torniamo all'essenziale.
    Del codice che ho postato l'altro giorno, la parte importante mi pare quella che estraggo qui sotto.
    Questa funzione mette tutto il contenuto della pagina in una variabile di tipo String. Dopo ci si possono fare operazioni come in una normale stringa di testo.
    Ma... che cos'è WB ? Come fa a funzionare senza essere stato definito? E poi perché funziona solo se il codice sta nel foglio e non se lo metto in un modulo?

    Da parte mia (non so se può servire anche a Perry) mi piacerebbe anche poter mettere in una variabile "solo" un pezzetto di testo: quello che viene "dopo" una determinata stringa.
     
    Private Function LeggiPagina(URL As String) As String
    ' legge una singola pagina Web e ne restituisce il testo contenuto...
       FINE = False
       WB.Navigate URL
       Do
          DoEvents
       Loop Until FINE
       LeggiPagina = WB.Document.body.innertext
    End Function



  • di lepat (utente non iscritto) data: 17/03/2014 09:29:10

    manca
    Set WB = CreateObject("InternetExplorer.Application")



  • di lepat (utente non iscritto) data: 17/03/2014 09:31:45

    per le altre domande allega un file di esempio



  • di scossa data: 17/03/2014 09:45:31

    @Luca.Donati: scusami, ma non entro nel merito di quel codice. Se posti l'url al sito posso scrivere il codice che, in relazione alla struttura della pagina web, userei io.



  • di Luca.Donati data: 17/03/2014 11:27:26

    Grazie della proposta, @scossa, sarebbe un aiuto veramente benvenuto.
    A dire il vero, mi interesserebbe avere uno strumento abbastanza "generale", cioè che possa tirarmi fuori delle stringhe in situazioni piuttosto varie:

    - una tabella; i dati che mi interessano sono in colonna (non posso aprirlo ora per problemi di firewall, ma guarda w w w .turfomania.fr/pronostics/partants-mercredi-12-mars-2014-laval-grand-prix-du-conseil-general-de-la-maye.html?idcourse=148607 - dovrebbe essere un buon esempio)

    - un quadro in una pagina html; i dati sono in riga; un esempio: (accatitipì con i suoi due punti e il doppio slash, poi...) onrefaitlescourses.rtl.fr/resultats-courses/reunions-20140310/compiegne-7770232862/prix-de-la-ville-de-compiegne-prix-de-picardie-7770270236.

    Comunque qualsiasi suggerimento anche intermedio è il benvenuto.
    P.S.: non dimentichiamo che il post originario è di @Perry, io glielo sto subdolamente piratando...



  • di Luca.Donati data: 17/03/2014 11:46:18

    Scusa, mi sono sbagliato.
    La tabella sta qui: 3w .zeturf.fr/fr/programmes-et-pronostics/course?id=139514



  • di Perry (utente non iscritto) data: 17/03/2014 17:18:38

    Grazie, grazie per i vostri suggerimenti, ma veniamo alla analisi del problema, in allegato ho messo il file che mi sono costruito, come potete vedere quello che interessa è.:

    1) - il link alla discussione che essendo nuova occorre ricercarla nell' indice.
    quando la trovo, copio il testo (una parte o tutto) come indizio informativo dell' argomento.

    2) - estrapolo il numero assegnato alla discussione, e il link completo della stessa che mi permetterà di ritrovarla.

    3) - memorizzo la versione di Excel-Word-Access... per informazioni sullo strumento usato.

    4) - memorizzo il nick di chi posta la discussione

    5) - memorizzo la data della discussione

    6) - prelevo e numero gli allegati, li zippo nel file
    EXCEL VBA - Raccolta di Esempi-Allegati.zip
    a cui assegno un collegamento ipertestuale che mi permetterà di ri-espanderli all' occorrenza

    E così via per ogni nuova discussione.
    Quando ci sono risposte analizzo la vecchia discussione e salvo gli eventuali nuovi allegati assegnando un progressivo es. 6055 - 1-cartel1,
    6065 - 2-cartel1 ...

    Come potete vedere il processo è abbastanza lungo e complesso, ecco perché ho postato questa discussione.

    Ma vi posso assicurare che non è assolutamente un lavoro inutile perché sono spesso ricorso alla lettura di post anche vecchi e trovato le soluzioni che cercavo.

    Essendo uno strumento "USE INTERNAL ONLY", non sono interessato a pubblicarlo, ma lo posso mettere a disposizione degli utenti del forum.

    ancora grazie a tutti
    Perry





  • di Mauro data: 17/03/2014 20:54:31

    @Luca.Donati cit. "Sì, ho visto che si può togliere l'h t t p oppure intervallare con spazi, ma funziona una volta su due, non ho capito come e perché. In più, una volta che faccio l'errore e il sito mi rifiuta il post, poi deve restare qualche porcheria nel computer che mi impedisce di postare qualsiasi cosa fino al login successivo... "

    Questa è la prima segnalazione di questo tipo, probabilmente dipende dalla versione del browser. Ti chiedo gentilmente se puoi contattarmi tramite il modulo contatti per darmi altre info, in modo che possa studiare il caso. Grazie.



  • di scossa data: 18/03/2014 14:29:49

    @Perry: non entro nel merito del tuo file (troppo articolato), ti propongo solo il codice per estrarre su un foglio (Foglio1) della cartella dove lo incollerai, l'elenco delle discussioni.

    Allego anche il file di esempio (ExcelVbaIt.xlsm), Vedi se può esserti utile.



     
    Sub ParseHTML()
      Dim wb As Workbook
      Dim ws As Worksheet
      Dim cella As Range
      Dim ie As Object
      Dim ie_Doc As Object
      Dim ie_Element As Object
      Dim ie_ParentEle As Object
      Dim ie_ParentPar As Object
      Dim nLoops As Long
      Dim j As Long
      Dim nData As Long
      Dim sTesto As String
        
      Const sWeb As String = "www.excelvba.it/Forum/forum.php?f=1"
      
      On Error GoTo ParseHTML_Error
      Set wb = ThisWorkbook
      Set ws = wb.Worksheets("Foglio1")
      Set ie = CreateObject("InternetExplorer.Application")
      Application.ScreenUpdating = False
      With ie
        .Silent = True
        .Visible = False
        .navigate sWeb
        Application.Wait Now + TimeValue("0:00:02")
        nLoops = 0
        Do Until .ReadyState = 4
          DoEvents
          nLoops = nLoops + 1
          If nLoops > 50000 Then
            Err.Raise vbObjectError + 513, , "Il server non risponde"
          End If
        Loop
        Set ie_Doc = .Document
        Set cella = ws.Range("A4")
        cella.Resize(ws.Cells(Rows.Count, 1).End(xlUp).Row + 1, 5).ClearContents
        For Each ie_Element In ie_Doc.getElementsByTagName("a")
          If ie_Element.className = "alink" Then
            Debug.Print ie_Element.Attributes("href").Value
            If ie_Element.Attributes("href").Value Like "*thread.php*" Then
              Set ie_ParentEle = ie_Element.parentElement
              cella.Offset(0, 0).Value = ie_Element.innerText
              cella.Offset(0, 1).Value = ie_Element.Attributes("href").Value
              ws.Hyperlinks.Add Anchor:=cella.Offset(0, 1), Address:=ie_Element.Attributes("href").Value, TextToDisplay:=ie_Element.innerText
              sTesto = ie_ParentEle.innerText
              sTesto = Trim(Replace(sTesto, ie_Element.innerText, ""))
              cella.Offset(0, 2).Value = sTesto
              For Each ie_ParentPar In ie_ParentEle.parentElement.getElementsByTagName("dd")
                If ie_ParentPar.className = "posts" Then
                  cella.Offset(0, 3).Value = ie_ParentPar.innerText
                ElseIf ie_ParentPar.className = "lastpost" Then
                  cella.Offset(0, 4).Value = ie_ParentPar.innerText
                End If
              Next
              Set cella = cella.Offset(1, 0)
            End If
          End If
        Next
      End With
    
    ParseHTML_Error:
      Application.ScreenUpdating = True
      Set cella = Nothing
      Set ws = Nothing
      Set wb = Nothing
      If Err.Number <> 0 Then
        MsgBox "Error: " & Err.Description, vbCritical, "ERRORE"
      Else
          MsgBox "Elaborazione Terminata", vbInformation
      End If
      On Error Resume Next
      ie.Quit
      Set ie_Element = Nothing
      Set ie_ParentEle = Nothing
      Set ie_ParentPar = Nothing
      Set ie_Doc = Nothing
      Set ie = Nothing
    
    End Sub
    
    
    



  • di lepat (utente non iscritto) data: 18/03/2014 15:02:43

    ottengo Errore di automazione sulla linea
    Debug.Print ie_Element.Attributes("href").Value



  • di scossa data: 18/03/2014 15:17:24

    Strano, a me funziona, comunque ho tolto quella riga (serviva solo per test), prova a scaricare di nuovo il file (l'ho sosotituito).




  • di Luca.Donati data: 18/03/2014 17:10:57

    Per il primo file, errore di automazione anche per me.
    Per il secondo, confesso che non ho capito qual è la parte di codice che carica i dati...



  • di lepat (utente non iscritto) data: 18/03/2014 18:32:57

    continuo ad avere lo stesso errore su Excel 2010, ora alla riga
    If ie_Element.Attributes("href").Value Like "*thread.php*" Then



  • di lepat (utente non iscritto) data: 18/03/2014 18:46:17

    non mi riconosce il metodo Attributes, mentre riconosce innerText
    occorre qualche libreria ?



  • di scossa data: 18/03/2014 19:16:44

    Ok, il problema è la versione di IE.

    Ho modificato il codice usando l'early binding impostando i riferimenti alle librerie Microsoft Internet Controls
    e a Microsoft HTML Object Library.

    Ho sostituito il file allegato (ExcelVbaIt.xlsm).
     
    '---------------------------------------------------------------------------------------
    ' Procedure : prova
    ' Author    : scossa
    ' Date      : 18/03/2014
    ' Purpose   :
    '---------------------------------------------------------------------------------------
    '
    ' attenzione: attivare i riferimenti a Microsoft Internet Controls
    '             e a Microsoft HTML Object Library
    '
    
    Sub ParseHTML()
      Dim wb As Workbook
      Dim ws As Worksheet
      Dim cella As Range
      Dim ie As InternetExplorer
      Dim ie_Doc As HTMLDocument
      Dim ie_Element As HTMLAnchorElement
      Dim ie_ParentEle As HTMLDTElement
      Dim ie_ParentPar As HTMLDListElement
      Dim nLoops As Long
      Dim sTesto As String
        
      Const sWeb As String = "www.excelvba.it/Forum/forum.php?f=1"
      
      On Error GoTo ParseHTML_Error
      Set wb = ThisWorkbook
      Set ws = wb.Worksheets("Foglio1")
      Set ie = CreateObject("InternetExplorer.Application")
      Application.ScreenUpdating = False
      With ie
        .Silent = True
        .Visible = False
        .navigate sWeb
        Application.Wait Now + TimeValue("0:00:02")
        nLoops = 0
        Do Until .ReadyState = 4
          DoEvents
          nLoops = nLoops + 1
          If nLoops > 50000 Then
            Err.Raise vbObjectError + 513, , "Il server non risponde"
          End If
        Loop
        Set ie_Doc = .Document
        Set cella = ws.Range("A4")
        cella.Resize(ws.Cells(Rows.Count, 1).End(xlUp).Row + 1, 5).ClearContents
        For Each ie_Element In ie_Doc.getElementsByTagName("a")
          If ie_Element.className = "alink" Then
            If ie_Element.Attributes("href").Value Like "*thread.php*" Then
              Set ie_ParentEle = ie_Element.parentElement
              cella.Offset(0, 0).Value = ie_Element.innerText
              cella.Offset(0, 1).Value = ie_Element.Attributes("href").Value
              ws.Hyperlinks.Add Anchor:=cella.Offset(0, 1), Address:=ie_Element.Attributes("href").Value, TextToDisplay:=ie_Element.innerText
              sTesto = ie_ParentEle.innerText
              sTesto = Trim(Replace(sTesto, ie_Element.innerText, ""))
              cella.Offset(0, 2).Value = sTesto
              For Each ie_ParentPar In ie_ParentEle.parentElement.getElementsByTagName("dd")
                If ie_ParentPar.className = "posts" Then
                  cella.Offset(0, 3).Value = ie_ParentPar.innerText
                ElseIf ie_ParentPar.className = "lastpost" Then
                  cella.Offset(0, 4).Value = ie_ParentPar.innerText
                End If
              Next
              Set cella = cella.Offset(1, 0)
            End If
          End If
        Next
      End With
    
    ParseHTML_Error:
      Application.ScreenUpdating = True
      Set cella = Nothing
      Set ws = Nothing
      Set wb = Nothing
      If Err.Number <> 0 Then
        MsgBox "Error: " & Err.Description, vbCritical, "ERRORE"
      Else
          MsgBox "Elaborazione Terminata", vbInformation
      End If
      On Error Resume Next
      ie.Quit
      Set ie_Element = Nothing
      Set ie_ParentEle = Nothing
      Set ie_ParentPar = Nothing
      Set ie_Doc = Nothing
      Set ie = Nothing
    
    End Sub
    
    



  • di scossa data: 18/03/2014 19:35:33

    Ho sistemato il codice per mantenere l'associazione tardiva (late binding)
    Sotto il codice aggiornato.
     
    '---------------------------------------------------------------------------------------
    ' Procedure : prova
    ' Author    : scossa
    ' Date      : 18/03/2014
    ' Purpose   :
    '---------------------------------------------------------------------------------------
    '
    '
    
    Sub ParseHTML()
      Dim wb As Workbook
      Dim ws As Worksheet
      Dim cella As Range
      Dim ie As Object
      Dim ie_Doc As Object
      Dim ie_Element As Object
      Dim ie_ParentEle As Object
      Dim ie_ParentPar As Object
      Dim nLoops As Long
      Dim sTesto As String
        
      Const sWeb As String = "www.excelvba.it/Forum/forum.php?f=1"
      
      On Error GoTo ParseHTML_Error
      Set wb = ThisWorkbook
      Set ws = wb.Worksheets("Foglio1")
      Set ie = CreateObject("InternetExplorer.Application")
      Application.ScreenUpdating = False
      With ie
        .Silent = True
        .Visible = False
        .navigate sWeb
        Application.Wait Now + TimeValue("0:00:02")
        nLoops = 0
        Do Until .ReadyState = 4
          DoEvents
          nLoops = nLoops + 1
          If nLoops > 50000 Then
            Err.Raise vbObjectError + 513, , "Il server non risponde"
          End If
        Loop
        Set ie_Doc = .Document
        Set cella = ws.Range("A4")
        cella.Resize(ws.Cells(Rows.Count, 1).End(xlUp).Row + 1, 5).ClearContents
        For Each ie_Element In ie_Doc.getElementsByTagName("a")
          If ie_Element.className = "alink" Then
            If ie_Element.href Like "*thread.php*" Then
              Set ie_ParentEle = ie_Element.parentElement
              cella.Offset(0, 0).Value = ie_Element.innerText
              cella.Offset(0, 1).Value = ie_Element.href
              ws.Hyperlinks.Add Anchor:=cella.Offset(0, 1), Address:=ie_Element.href, TextToDisplay:=ie_Element.innerText
              sTesto = ie_ParentEle.innerText
              sTesto = Trim(Replace(sTesto, ie_Element.innerText, ""))
              cella.Offset(0, 2).Value = sTesto
              For Each ie_ParentPar In ie_ParentEle.parentElement.getElementsByTagName("dd")
                If ie_ParentPar.className = "posts" Then
                  cella.Offset(0, 3).Value = ie_ParentPar.innerText
                ElseIf ie_ParentPar.className = "lastpost" Then
                  cella.Offset(0, 4).Value = ie_ParentPar.innerText
                End If
              Next
              Set cella = cella.Offset(1, 0)
            End If
          End If
        Next
      End With
    
    ParseHTML_Error:
      Application.ScreenUpdating = True
      Set cella = Nothing
      Set ws = Nothing
      Set wb = Nothing
      If Err.Number <> 0 Then
        MsgBox "Error: " & Err.Description, vbCritical, "ERRORE"
      Else
          MsgBox "Elaborazione Terminata", vbInformation
      End If
      On Error Resume Next
      ie.Quit
      Set ie_Element = Nothing
      Set ie_ParentEle = Nothing
      Set ie_ParentPar = Nothing
      Set ie_Doc = Nothing
      Set ie = Nothing
    
    End Sub
    
    



  • di scossa data: 18/03/2014 19:37:27

    Quindi non è necessario impostare i riferimenti alle librerie.

    Sostituito il file (domani lo testo con la vecchia versione di IE).



  • di lepat (utente non iscritto) data: 18/03/2014 20:54:59

    Grazie scossa, ora funziona anche con IE 10.
    Quali sono le parti da modificare per ottenere lo stesso risultato su un sito in html puro ?
    per esempio www.nicalivo.com



  • di scossa data: 18/03/2014 23:01:33

    cit. lepat: "Quali sono le parti da modificare per ottenere lo stesso risultato su un sito in html puro ?
    per esempio www.nicalivo.com"

    Premesso che nel sito indicato mi sembra ci sia poco di "utile" per excel, posso solo indicarti il workflow da seguire:

    1) stabilire quali sono i dati da estrapolare;
    2) analizzare il sorgente della pagina per capire "dove" sono questi dati;
    3) scegliere la strategia di estrazione più efficace

    Ovviamente i punti 2 e 3 richiedono la conoscenza, quanto meno, del linguaggio HTML; se poi nella pagina ci sono script javascript, sarebbe bene conoscere anche questo linguaggio.

    Ti ripeto che un parser "unisex" per le pagine web non è pensabile, ma va scritto su misura per la singola pagina.

    Ho postato, in questo e altri thread, degli esempi di codice che illustrano alcune tecniche:

    a) memorizzare il contenuto "html" della pagina in una stringa, da analizzare ed elaborare con le regular expression;

    b) memorizzare il contenuto "testo" della pagina in una stringa, da analizzare ed elaborare con le sole funzioni di testo del vba e/o con le regex;

    c) lavorare sugli "elementi" che compongono la pagina web, attraverso le loro proprietà e metodi.

    Sul mio sito, potete trovare un file (cerca_treno_v7a.xlsm) per monitorare un treno durante il suo viaggio, mediante la lettura dei dati dal sito accatitipi://mobile.viaggiatreno.it
    La pagina web di questo sito è praticamente solo plain-text, quindi ho dovuto usare la tecnica indicata al punto b).

    Questo il link per scaricare il file:
    scossavr.altervista.org/Downloads/Excel/Public/cerca_treno_v7a.xlsm



  • di lepat (utente non iscritto) data: 19/03/2014 07:47:24

    Ottimo scossa, sapevo che il sito che ti ho indicato non era adatto, ma era solo per darti un esempio di cui ero sicuro



  • di Luca.Donati data: 19/03/2014 11:47:18

    Molto interessante, il tuo codice, Scossa!
    Ho tentato di modificarlo, dicendogli di prendersi l’indirizzo web da visitare nella cella A1:
    (…)
    Dim pagina As String
    pagina = Range("A1").Value
    'MsgBox (pagina)
    Const sWeb As String = pagina
    (…)
    Ma non ne vuole sapere: dice che è necessaria un’espressione costante.
    Ma perché, “Const ecc…” non è un’espressione costante?



  • di scossa data: 19/03/2014 12:27:24

    cit.: "Ma perché, “Const ecc…” non è un’espressione costante? "

    Se dichiari una costante (parola chiave Const anziché Dim) non puoi assegnarle il valore di una variabile, ma solo un valore "costante" (p.e. "pippo" se String, 4 se Integer, etc.)

    Per fare quello che vuoi tu devi cambiare
    Const sWeb As String = pagina
    in
    Dim sWeb As String = pagina

    puoi anche evitare di usare la variabile pagina:

    ........ CUT
    Dim nLoops As Long
    Dim sTesto As String

    Dim sWeb As String
    ...
    sWeb= Range("A1").Value


     
      
    



  • di Luca.Donati data: 19/03/2014 16:40:24

    Ottimo! Adesso effettivamente funziona.
    Se non rompo troppo, in un post che non ho iniziato io, posso chiederti scossa come organizzeresti la stessa identica procedura per una pagina come (accatitipì, due punti, doppio slash) onrefaitlescourses.rtl.fr/resultats-courses/reunions-20140319/beaumont-de-lomagne-7770516214 ?
    Mi servirebbe proprio la stessa cosa, cioè importare nel foglio la lista delle corse del giorno con i relativi links.
    Ho provato sostituendo
    'If ie_Element.href Like "*thread.php*" Then
    con
    If ie_Element.href Like "*2014*" Then
    Ma non basta: mi dice che non risponde il server. Evidentemente, la pagina è strutturata in un modo diverso...



  • di Perry (utente non iscritto) data: 19/03/2014 17:00:02

    Grazie Scossa,
    Trovo la tua proposta interessantissima, anche se non corrisponde ai miei obiettivi.

    L' ho provata e funziona, l' unico problema sta nella formattazione delle celle completamente diversa da quella prodotta nel tuo esempio (ExcelVbaIt.xlsm), ho saltato qualche passaggio ??.
    Perry



  • di Perry (utente non iscritto) data: 19/03/2014 17:12:46

    A proposito come si deve operare per

    attenzione: attivare i riferimenti a Microsoft Internet Controls
    ' e a Microsoft HTML Object Library
    Grazie



  • di lepat (utente non iscritto) data: 19/03/2014 18:28:25

    dalla finestra vba, Strumenti, Riferimenti



  • di scossa data: 20/03/2014 07:51:53

    @Perry:
    se usi l'ultimo codice che ho proposto, non serve mettere alcun riferimento.
    Riguardo la formattazione, semplicemente non c'è. Puoi metterla tu come gradisci, oppure puoi usare i dati estratti solo come "fonte" per leggerli e metterli nelle tue celle già formattate.

    Il mio scopo non era fornire una soluzione "vestita a festa" ma mostrare come leggere quella particolare pagina web.

    @Luca.Donati: al momento non posso accedere a quel tipo di siti, sorry.