Condividi:        

Versioni diverse Office

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: Versioni diverse Office

Postdi brtbrn » 30/01/25 11:18

@Dylan
non so se può essere utile:
sul pc nuovo è installato office 2019 MSO versione 2412 (build 16.0.................) a 32 bit
sul pc vecchio è installato office 2013 MSO (build 15.0.................) a 32 bit

@Anthony
Domanda da profano:
il file che NON riesce a funzionare, vedendo il codice VBA, utilizza i dati ricavati da una query fornita da Yahoo... se ho capito bene.
il file Portafoglio_fondi V0 (che ho scaricato da un thread presente qui sul sito) invece, va a "recuperare" i dati direttamente sul sito (mi pare che questa operazione si dica scraping)...o no?
brtbrn
Utente Junior
 
Post: 35
Iscritto il: 05/01/25 18:41

Sponsor
 

Re: Versioni diverse Office

Postdi Anthony47 » 30/01/25 17:32

Il "web scraping" si puo' fare con Chrome oppure Edge usando l'ambiente "Selenium", descritto qui: viewtopic.php?f=26&t=112225
(Si potrebbe anche provare con InternetExplorer, ma vista la sempre minore tolleranza dei siti a interfacciarsi con IE io non lo supporto)

Potrebbe essere molto piu' lento di una query
Se ti interessa, predisponi il tuo pc con l'ambiente Selenium e collaudalo col file di test (vedi la discussione che ho linkato prima) e quando sei pronto ne riparliamo

Ci ricordi (soprattutto per Dylan) la versione di Sistema Operativo che usi?
Avatar utente
Anthony47
Moderatore
 
Post: 19569
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Versioni diverse Office

Postdi brtbrn » 30/01/25 19:34

@Dylan
la versione del Sistema Operativo sul pc nuovo è 24H2 build SO 26100.2884 con Windows 11, mentre su quello vecchio è 22H2 build SO 19045.5771 con Windows 10.

@Anthony
In merito alla tua proposta, io confido di trovare una soluzione che, almeno per ora, possa andare bene per entrambi i pc.
Se mi metto a creare a modificare il pc, ad installare software diversi su uno dei due per gestire lo stesso file, rischio di incasinarmi nella gestione dei dati stessi... non ne vengo più fuori... :-(

Tornando alla mia domanda di stamane, quindi dici che un file come Portafoglio_fondi V0 (che legge una pagina di BI), non possa essere modificato/adattato alla pagina yahoo? Hanno una struttura web diversa, più complessa... oppure è proprio la tua ritrosia a non voler più supportare tali operazioni?

grazie ancora
brtbrn
Utente Junior
 
Post: 35
Iscritto il: 05/01/25 18:41

Re: Versioni diverse Office

Postdi Anthony47 » 31/01/25 10:29

Do per scontato quindi che il file Portafoglio_fondi V0, basato su InternetExplorer, funziona correttamente sui tuoi dispositivi; quindi una automazione verso yahoo.com basata su I.E. analogamente funzionerebbe.
Bene, ma quali sono i dati che tu vorresti estrarre dal sito? Prima di rispondere apri yahoo tramite I.E. e assicurati che le informazioni siano disponibili!
Avatar utente
Anthony47
Moderatore
 
Post: 19569
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Versioni diverse Office

Postdi brtbrn » 31/01/25 13:45

si, quel file funziona sia sul pc nuovo che in quello vecchio. In entrambi i casi apre temporaneamente una finestra di IE ed estrapola i dati.
La pagina di BorsaItaliana, graficamente e come disposizione dei dati, è identica sia con IE che con Chrome/Edge... (almeno visivamente, non so dal punto di vista software).
C'è invece una differenza abissale fra la pagina yahoo aperta con IE e la stessa aperta con Crhome/Edge
I dati sono riportati in maniera spartana (quasi tabellare direi)... ma ci sono.

Nel mio caso, vorrei estrarre dal sito il dato relativo alla quotazione del titolo (nell'esempio sottostante 124,65).
Nella fattispecie del titolo NVDA ad esempio - (link https://it.finance.yahoo.com/quote/NVDA/, ma vale anche per il sito .com) - il dato si trova (contando le righe che appaiono) in 14^ posizione e riporta la quotazione (124,65), la variazione assoluta e quella in percentuale.

ecco un copia-incolla di quello che si vede con IE (solo dati su sfondo bianco):

Summary
News
Chart
Statistics
Historical Data
Profile
Financials
Analysis
Options
Holders
Sustainability
NasdaqGS - Delayed Quote • USD
NVIDIA Corporation (NVDA)

124,65 +0,95 (+0,77%)

At close: 30 gennaio alle ore 16:00:01 GMT-5

122,77 -1,88 (-1,51%)

Spero di essere riuscito a spiegarmi :-)
brtbrn
Utente Junior
 
Post: 35
Iscritto il: 05/01/25 18:41

Re: Versioni diverse Office

Postdi Anthony47 » 01/02/25 19:38

Un possibile codice che restituisce le quotazioni di un elenco di Titoli, prelevando i risultati da https://finance.yahoo.com/quote:
Codice: Seleziona tutto
#If VBA7 Then       '!!! ON  TOP  OF  THE  VBA  MODULE   !!!!
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Sub IEFinance()
Dim lStart As Range, qStart As Range, cTick As String, tCnt As Long
Dim IE As Object, myTim As Single, myC As Object
'
Set lStart = Sheets("Foglio4").Range("A2")      'Dove comincia l'elenco dei Titoli
Set qStart = Sheets("Foglio4").Range("F2")      'Dove cominciare a scrivere i risultati

If IE Is Nothing Then Set IE = CreateObject("InternetExplorer.Application")
'
myUrl = "https://finance.yahoo.com/quote/"
myTim = Timer
'
Do
    tCnt = tCnt + 1
    cTick = lStart.Cells(tCnt, 1)
    If Len(cTick) < 2 Then Exit Do
    With IE
        .Visible = True                 '... rendi visibile IE
        .navigate myUrl & cTick         '....vai all'url
        Sleep 100               '
        Do While .Busy: DoEvents: Sleep (20): Loop              'Attesa not busy
        Do While .readyState <> 4: DoEvents: Sleep (20): Loop   'Attesa document
    End With
    Debug.Print cTick, Format(Timer - myTim, "0.00")
    Set myC = IE.document.getElementsByClassName("yf-ipw1h0")
    If myC.Length > 0 Then
        qStart.Cells(tCnt, 1) = CSng(Replace(myC(0).innerText, ".", ",", , , vbTextCompare))
    Else
        qStart.Cells(tCnt, 1) = CVErr(xlErrNA)
    End If
    DoEvents
Loop
'
'Chiusura
On Error Resume Next
IE.Quit
Set IE = Nothing
End Sub

Il codice va copiato in un Modulo standard del vba inizialmente vuoto
Le due righe marcate <<< vanno personalizzate come da commento

La macro da lanciare e' la Sub IEFinance
Essa si aspetta di trovare nella posizione dichiarata un elenco valido di Titoli di cui, usando I.E. sul sito yahoo, preleva l'ultimo prezzo di negoziazione o di chiusura, e scrive il risultato a partire dall'indirizzo dichiarato; la lettura continua fintanto che non viene trovato una cella vuota nella colonna dei Titoli

Prova...

RIF: D:\DDownloads\[MULTI_C10120.xlsm]Foglio4
Avatar utente
Anthony47
Moderatore
 
Post: 19569
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Versioni diverse Office

Postdi brtbrn » 02/02/25 22:11

Ciao Anthony, innanzitutto sei un grande!! Grazie!
La nuova query (o macro?) funziona correttamente su entrambi i pc (nuovo e vecchio). ;-)

E' molto più lenta dell'altra versione (tieni presente che io, attualmente, controllo i prezzi di una cinquantina di titoli) ma l'importante è che estrapoli il dato che mi interessa.

L'unico appunto che mi permetto di far notare, è che ogni tanto, in qualche riga mi appare il messaggio di errore #N/D...
Finita l'esecuzione, faccio dunque ripartire la macro e magari l'errore in quella cella/riga sparisce, facendo apparire correttamente il dato che mi serve... solo che appare in un altra cella/riga... e allora ricomincio... sperando che tutto sia corretto.

Non so a cosa sia dovuto...
La devo provare domani a mercati aperti, per vedere se questi errori #N/D (di mancata estrapolazione dato) che ogni tanto riporta nello scorrere delle righe, sono dovuti ad una connessione internet non sempre "uniforme" della mia linea o se magari ci possono essere "interferenze" nella disponibilità dei dati sulla pagina web...

Io ho fatto la prova stasera, con borse chiuse (e dunque dati praticamente fermi)... non vorrei che, a mercati aperti, e dunque con valori sempre in aggiornamento, mi andasse in errore più frequentemente...

Sarebbe una cosa che vanificherebbe il tutto... :-(

Ti aggiorno, e comunque sempre grazie per la gentilezza e disponibilità.
brtbrn
Utente Junior
 
Post: 35
Iscritto il: 05/01/25 18:41

Re: Versioni diverse Office

Postdi Anthony47 » 03/02/25 16:53

Che la macro fosse drasticamente piu' lenta della funzione precedente era atteso; infatti in questa versione dobbiamo aspettare che l'intera pagina web venga riempita, compreso fronzoli e pubblicità, mentre nella versione "query" si aspettava solo che il sito fornisse la risposta alla query.

Quanto agli errori #ND essi sono dovuti a errori di sincronizzazione; purtroppo per migliorare questo aspetto non possiamo che perdere ulteriore tempo per controlli e riprove. Ma immagino che la precisione sia piu' importante che la velocità...

Prova questa nuova Sub IEFinance2, che va a sostituire il codice della Sub IEFinance:
Codice: Seleziona tutto
Sub IEFinance2()
Dim lStart As Range, qStart As Range, cTick As String, tCnt As Long
Dim IE As Object, myTim As Single, myC As Object
Dim I As Long
'
Set lStart = Sheets("Foglio4").Range("A2")      'Dove comincia l'elenco dei Titoli
Set qStart = Sheets("Foglio4").Range("F2")      'Dove cominciare a scrivere i risultati

If IE Is Nothing Then Set IE = CreateObject("InternetExplorer.Application")
'
myurl = "https://finance.yahoo.com/quote/"
myTim = Timer
'
Do
    tCnt = tCnt + 1: I = 0
    cTick = lStart.Cells(tCnt, 1)
    If Len(cTick) < 2 Then Exit Do
    With IE
        .Visible = True                 '... rendi visibile IE
        .navigate myurl & cTick         '....vai all'url
        Sleep 100               '
        Do While .Busy: DoEvents: Sleep (20): Loop              'Attesa not busy
        Do While .readyState <> 4: DoEvents: Sleep (20): Loop   'Attesa document
    End With
'
    On Error Resume Next
    qStart.Cells(tCnt, 1).ClearContents
    If IE.LocationUrl = myurl & cTick & "/" Then
        For I = 1 To 5
            Set myC = IE.document.getElementsByClassName("yf-ipw1h0")
            If myC.Length > 0 Then
                qStart.Cells(tCnt, 1) = CSng(Replace(myC(0).innerText, ".", ",", , , vbTextCompare))
                Exit For
            Else
                Sleep 80
            End If
        Next I
    Else
        qStart.Cells(tCnt, 1) = CVErr(xlErrNA)
    End If
    Debug.Print cTick, Format(Timer - myTim, "0.00"), I, IE.LocationUrl
    On Error GoTo 0
    DoEvents
Loop
'
'Chiusura
On Error Resume Next
IE.Quit
Set IE = Nothing
Beep
End Sub

NB: le prime righe in testa al Modulo non vanno eliminate

Qualora la quotazione non sia presente la macro esegue fino a 5 verifiche ulteriori, con una attesa di 80msec, prima di restituire l'errore

Prova e fai sapere...
Avatar utente
Anthony47
Moderatore
 
Post: 19569
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Versioni diverse Office

Postdi brtbrn » 03/02/25 18:41

Ciao Anthony

inizio la disamina ripotando una tua frase "immagino che la precisione sia piu' importante che la velocità..."
Hai perfettamente ragione!

Tornando ai file, ho provato oggi "a mercati aperti" e non ha dato alcun msg di errore... probabilmente ieri era qualche problema di connessione...
In ogni caso ho creato un file anche con la tua nuova Sub, che, coi controlli che hai inserito, probabilmente è più sicura nel recuperare (o quanto meno provarci) il dato.

In merito alla tua riflessione sulla velocità "...aspettare che l'intera pagina web venga riempita, compreso fronzoli e pubblicità..." mi coglie dubbioso: se apro la pagina con IE (sia sul pc nuovo che vecchio), io vedo solo una pagina bianca, coi dati e qualche link... non vedo pubblicità, colori, immagini e fronzoli vari... quindi, in teoria dovrebbe essere una pagina abbastanza veloce da caricare... o mi sbaglio?

Un'altra cosa, se mi posso permettere: è possibile avere una colonna anche con la data di quella quotazione?

Questo dato mi sarebbe utile in quanto, ad esempio nel caso di ETF, mi fornisce il giorno in cui quel titolo ha realmente avuto scambi sul mercato...
Nella famosa Query di yahoo (di cui sopra), tale dato, era indicato come "regularMarketTime"...
se non è possibile, non importa.
brtbrn
Utente Junior
 
Post: 35
Iscritto il: 05/01/25 18:41

Re: Versioni diverse Office

Postdi Anthony47 » 03/02/25 19:35

Questa ulteriore versione inserisce in seconda una colonna, il cui offset rispetto alla colonna del prezzo puo' essere impostato nel codice, l'informazione relativa al tempo. Quel campo contiene altre informazioni, quindi e' visibile in formato testo (non "orario")

Il codice:
Codice: Seleziona tutto
Sub IEFinance2()
Dim lStart As Range, qStart As Range, cTick As String, tCnt As Long
Dim IE As Object, myTim As Single, myC As Object
Dim I As Long, offCol As Long
'
Set lStart = Sheets("Foglio4").Range("A2")      'Dove comincia l'elenco dei Titoli
Set qStart = Sheets("Foglio4").Range("F2")      'Dove cominciare a scrivere i risultati
offCol = 1                                      'Quante colonne a destra del Prezzo per l'Orario
'
If IE Is Nothing Then Set IE = CreateObject("InternetExplorer.Application")
'
myurl = "https://finance.yahoo.com/quote/"
myTim = Timer
'
Do
    tCnt = tCnt + 1: I = 0
    cTick = lStart.Cells(tCnt, 1)
    If Len(cTick) < 2 Then Exit Do
    With IE
        .Visible = True                 '... rendi visibile IE
        .navigate myurl & cTick         '....vai all'url
        Sleep 100               '
        Do While .Busy: DoEvents: Sleep (20): Loop              'Attesa not busy
        Do While .readyState <> 4: DoEvents: Sleep (20): Loop   'Attesa document
    End With
'
    On Error Resume Next
    qStart.Cells(tCnt, 1).Resize(1, 2).ClearContents
    If IE.LocationUrl = myurl & cTick & "/" Then
        For I = 1 To 5
            Set myC = IE.document.getElementsByClassName("yf-ipw1h0")
            If myC.Length > 0 Then
                qStart.Cells(tCnt, 1) = CSng(Replace(Replace(myC(0).innerText, ",", "", , , vbTextCompare), ".", ",", , , vbTextCompare))
                qStart.Cells(tCnt, 1 + offCol) = myC(3).innerText
                Exit For
            Else
                Sleep 80
            End If
        Next I
    Else
        qStart.Cells(tCnt, 1) = CVErr(xlErrNA)
    End If
    Debug.Print cTick, Format(Timer - myTim, "0.00"), I, IE.LocationUrl
    On Error GoTo 0
    DoEvents
Loop
'
'Chiusura
On Error Resume Next
IE.Quit
Set IE = Nothing
Beep
End Sub


Quanto ai tempi di attesa, e' IE che non riesce a rappresentare altre informazioni ("fronzoli e pubblicità") ma il server quelle cose le prepara e le invia. E in ogni caso "interpretare" un sorgente htm e visualizzarlo (che e' quello che fa un browser) in ogni caso richiede tempo che con la query non c'era. Sul mio PC, il tempo di risposta a una Query e' dell'ordine di 0.15 secondi; per la pagina web 1.5 secondi!
Avatar utente
Anthony47
Moderatore
 
Post: 19569
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Versioni diverse Office

Postdi brtbrn » 03/02/25 21:36

Mi scuso Anthony se ho posto una domanda inutile (quella sulla pagina web bianca)... ma purtroppo, come ho scritto più volte, non sono molto esperto... ed anche i termini che uso, immagino siano spesso impropri...

In merito alla seconda domanda, grazie per la variazione della function
Non è esattamente quello che volevo (e che si riusciva ad avere con la query) ma è pur sempre un informazione.

D'altronde (sempre da profano), nella pagina Web non vedo un "campo" dove sia riportata la data del giorno di quotazione...

Probabilmente la data in timestamp (presente dopo la stringa di testo "regularMarketTime" nella famosa query yahoo) non è disponibile nella pagine WEB ma era un "accrocchio" informatico.
brtbrn
Utente Junior
 
Post: 35
Iscritto il: 05/01/25 18:41

Re: Versioni diverse Office

Postdi Anthony47 » 04/02/25 00:31

D'altronde (sempre da profano), nella pagina Web non vedo un "campo" dove sia riportata la data del giorno di quotazione...
Infatti; pero' di quel che c'è non manca niente :D
Avatar utente
Anthony47
Moderatore
 
Post: 19569
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Versioni diverse Office

Postdi brtbrn » 04/02/25 18:10

ah beh, sicuramente! :-)

Permettimi di dire che le battute (come capita spesso), nascondono anche le risposte a certe domande...
mi è venuto in mente infatti, che se la data nella famosa query era riportata in secondi (formato timestamp, che io poi con una formula convertivo nel formato normale GG/MM/AAA), probabilmente quel valore sta proprio racchiuso in quell'informazione che tu, con la nuova function, hai riportato in formato testo nella colonna a fianco...

Ho detto una eresia informatica?
brtbrn
Utente Junior
 
Post: 35
Iscritto il: 05/01/25 18:41

Re: Versioni diverse Office

Postdi Anthony47 » 05/02/25 10:48

Se volevi suggerirmi un modo per estrarre solo data + orario dalla stringa disponibile la risposta e' che il campo disponibile non ha una struttura stabile. Esempi di contenuti che ho rilevato:
Codice: Seleziona tutto
At close: 6:00:00 PM GMT+1
As of 1:02:58 PM EST. Market Open.
As of June 28 at 6:07:38 PM EDT. Market Open
At close: February 4 at 4:00:02 PM EST

Se vuoi possiamo eliminare le eventuali scritte As of, At close: e . Market Open.

Il timestamp che figura nel risultato della query (tempo universale in formato Unix) certamente ha partecipato alla compilazione del campo, ma dove pero' e' stata eliminata la data e sono state aggiunte altre informazioni
Avatar utente
Anthony47
Moderatore
 
Post: 19569
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Versioni diverse Office

Postdi brtbrn » 05/02/25 16:39

Alla fin fine era come avevo supposto nel messaggio precedente, ossia che quell'informazione era frutto di un accrocchio informatico... ;-)

Comunque il file va bene così Anthony, è già molto che riesca ad avere lo stesso strumento (foglio excel) che mi funziona su entrambi i pc e di questo ti ringrazio nuovamente.
Speriamo non cambino frequentemente le impostazioni/layout/dati della pagina web (o che la tolgano proprio), altrimenti mi toccherà disturbare di nuovo! ;-)

Resta il rammarico di non aver capito/trovato dov'è questa differenza fra le due versioni di office (o meglio di qualche sua componente software, dll, librerie, autorizzazioni, etc.)... non tanto per il file in sè (visto che ora ho un altro strumento), ma nel caso avessi una situazione simile in futuro con altri file.
Magari lascia aperto il thread se qualcuno vuole intervenire proprio in merito a tale questione (che era quella iniziale)

Avrei anche altre curiosità informatiche, ma per ora mi fermo. Non vorrei abusare troppo della tua cortesia/tempo.

Ciao
brtbrn
Utente Junior
 
Post: 35
Iscritto il: 05/01/25 18:41

Re: Versioni diverse Office

Postdi brtbrn » 07/02/25 18:44

Ciao Anthony
Ritorno su questa discussione per chiederti se è possibile implementare la funzione che mi hai gentilmente preparato nei giorni scorsi.
La richiesta nasce dal fatto che, come avevo paventato in un msg precedente, ogni tanto (causa connessione, o del sito, o di altro) mancano dei dati nella sequenza delle righe da estrapolare. Faccio girare nuovamente la macro... il problema si risolve su quelle celle ma magari si ripropone in altre... :-(

E' possibile far si che, tramite un filtro righe (o una colonna di appoggio che, con apposita formula, indichi se il valore è stato estratto o meno), la macro possa essere eseguita solo per le righe dove, appunto, manca il dato da estrapolare, lasciando già compilate quelle della precedente esecuzione?

ho provato a fare qualche ricerca sul forum e sul web... qualcosa di simile mi pare si faccia usando il comando SpecialCells(xlCellTypeVisible)... ma le mie poche conoscenze VBA non mi hanno aiutato ad "arrangiarmi" nel modificare il tuo codice...

Puoi darmi una soluzione? Grazie anticipatamente
brtbrn
Utente Junior
 
Post: 35
Iscritto il: 05/01/25 18:41

Re: Versioni diverse Office

Postdi Anthony47 » 08/02/25 16:14

Ho creato un elenco di una cinquantina di titoli e non ho mai visto errori random; comunque pensavo che la versione Sub IEFinance2 potesse fronteggiare la situazione. Vedo che non e' così...

Questa penultima Sub esegue fino a 5 cicli di query, ripetendo la ricerca per i titoli in errore, fintanto che gli errori si azzerano o rimangono costanti per due cicli consecutivi.
Il codice, che sostituisce la precedente Sub IEFinance2:
Codice: Seleziona tutto
Sub IEFinance33()
Dim lStart As Range, qStart As Range, cTick As String, tCnt As Long
Dim IE As Object, myTim As Single, myC As Object
Dim I As Long, offCol As Long
Dim TArr, CErr(1 To 5), JJ As Long, II As Long
'
Set lStart = Sheets("Foglio4").Range("A2")      'Dove comincia l'elenco dei Titoli
Set qStart = Sheets("Foglio4").Range("F2")      'Dove cominciare a scrivere i risultati
offCol = 1                                      'Quante colonne a destra del Prezzo per l'Orario
'
If IE Is Nothing Then Set IE = CreateObject("InternetExplorer.Application")
'
myurl = "https://finance.yahoo.com/quote/"
myTim = Timer

TArr = Range(lStart, lStart.End(xlDown)).Value
tCnt = 0
'
'Do
Debug.Print ">>>>", UBound(TArr)
For II = 1 To 5
    tCnt = 0
    For JJ = 1 To UBound(TArr)
        tCnt = tCnt + 1: I = 0
        cTick = TArr(tCnt, 1)
        If Len(cTick) > 1 Then
       
            With IE
                .Visible = True                 '... rendi visibile IE
                .navigate myurl & cTick         '....vai all'url
                Sleep 100               '
                Do While .Busy: DoEvents: Sleep (20): Loop              'Attesa not busy
                Do While .readyState <> 4: DoEvents: Sleep (20): Loop   'Attesa document
            End With
        '
            On Error Resume Next
            qStart.Cells(tCnt, 1).Resize(1, 2).ClearContents
            If IE.LocationUrl = myurl & cTick & "/" Then
                For I = 1 To 5
                    Set myC = IE.document.getElementsByClassName("yf-ipw1h0")
                    If myC.Length > 0 Then
                        qStart.Cells(tCnt, 1) = CSng(Replace(Replace(myC(0).innerText, ",", "", , , vbTextCompare), ".", ",", , , vbTextCompare))
                        qStart.Cells(tCnt, 1 + offCol) = myC(3).innerText
                        TArr(tCnt, 1) = ""
                        Exit For
                    Else
                        Sleep 80
                    End If
                Next I
            Else
                CErr(II) = CErr(II) + 1
                qStart.Cells(tCnt, 1) = CVErr(xlErrNA)
            End If
            Debug.Print cTick, Format(Timer - myTim, "0.00"), I, "Errs:" & CErr(II), IE.LocationUrl
            On Error GoTo 0
        End If
        DoEvents
    Next JJ
    Debug.Print "II=" & II, "Errs=" & CErr(II), Format(Timer - myTim, "0.00")
    If CErr(II) = 0 Then Exit For
    If II > 2 Then
        If CErr(II) = CErr(II - 2) Then Exit For
    End If
Next II
'
'Chiusura
Debug.Print "<<<<<<", II, CErr(II)
On Error Resume Next
IE.Quit
Set IE = Nothing
Beep
End Sub

La dichiarazione in testa al modulo (#If VBA7 Then / #End If) rimangono immutate
Prova
Avatar utente
Anthony47
Moderatore
 
Post: 19569
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Versioni diverse Office

Postdi brtbrn » 08/02/25 19:52

Grazie Anthony
ho provato la nuova sub e non dà alcun problema... mi riservo di vedere l'esecuzione durante i mercati aperti.

Approfitto per chiederti anche un altra cosa: come ti avevo scritto, ho recuperato il file Portafoglio_fondi V0 (dal thread "i vostri lavori") e ho provato a fare delle modifiche alla sub per recuperare le quotazioni da BI anche delle obbligazioni.

Per farti una domanda in merito a quel file, devo postare sull'apposito thread?

Grazie ancora e buon WE
brtbrn
Utente Junior
 
Post: 35
Iscritto il: 05/01/25 18:41

Re: Versioni diverse Office

Postdi Anthony47 » 09/02/25 00:38

Manteniamo questa discussione per la gestione del problema originario e di come e' evoluto.

L'altra questione e' meglio se la apri nella discussione da cui hai prelevato il file
Avatar utente
Anthony47
Moderatore
 
Post: 19569
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Versioni diverse Office

Postdi brtbrn » 13/02/25 20:52

Ciao Anthony,
la terza variante della sub, non ha dato problemi/errori neppure a mercati aperti. Ritengo che se ne dovesse dare, sia per problemi di connessione della mia linea... per cui direi che va bene.

Piuttosto, volevo renderti partecipe di quello che, a tentativi, ho implementato con la tua sub.
Sono infatti riuscito a recuperare anche altri dati relativi al titolo.
E' una mia piccola soddisfazione, da principiante del VBA. :-)

Ti allego la sub (se vuoi migliorarla o ottimizzarla, ben venga!)

Codice: Seleziona tutto
Sub IEFinance3my()                                '3^ versione, esegue fino a 5 cicli di query ripetendo la ricerca per i titoli in errore fintanto che gli errori si azzerano o rimangono costanti per due cicli consecutivi
Dim lStart As Range, qStart As Range, cTick As String, tCnt As Long
Dim IE As Object, myTim As Single, myC As Object
Dim I As Long, offCol As Long
Dim TArr, CErr(1 To 5), JJ As Long, II As Long
'
Set lStart = Sheets("Foglio4").Range("A2")        'Dove comincia l'elenco dei Titoli
Set qStart = Sheets("Foglio4").Range("G2")        'Dove cominciare a scrivere i risultati
offCol = -4                                       'Quante colonne a sinistra della colonna di riferimento (Prezzo ultimo) --> Data Elaborazione
'offCol0 = 5                                      'Quante colonne a destra della colonna di riferimento
offcol1 = -3                                      'Quante colonne a sinistra della colonna di riferimento --> Apertura
offcol2 = -2                                      'Quante colonne a sinistra della colonna di riferimento --> Minimo
offCol3 = -1                                      'Quante colonne a sinistra della colonna di riferimento --> Massimo
offCol4 = 1                                       'Quante colonne a destra della colonna di riferimento --> Volume

'
If IE Is Nothing Then Set IE = CreateObject("InternetExplorer.Application")
'
myurl = "https://finance.yahoo.com/quote/"
myTim = Timer

TArr = Range(lStart, lStart.End(xlDown)).Value
tCnt = 0
'
'Do
Debug.Print ">>>>", UBound(TArr)
For II = 1 To 5
    tCnt = 0
    For JJ = 1 To UBound(TArr)
        tCnt = tCnt + 1: I = 0
        cTick = TArr(tCnt, 1)
        If Len(cTick) > 0 Then                                         'il Ticker deve avere un nr di caratteri superiore a ZERO
       
            With IE
                .Visible = False                                        'nascondi IE
                .navigate myurl & cTick                                 '....vai all'url
                Sleep 100               '
                Do While .Busy: DoEvents: Sleep (20): Loop              'Attesa not busy
                Do While .readyState <> 4: DoEvents: Sleep (20): Loop   'Attesa document
            End With
        '
            On Error Resume Next
            qStart.Cells(tCnt, 1).Resize(1, 2).ClearContents
            If IE.LocationUrl = myurl & cTick & "/" Then
        For I = 1 To 5
            Set myC = IE.document.getElementsByClassName("yf-ipw1h0")                                                            'la classe "yf-ipw1h0" recupera la tabella iniziale (ultimo, variazione, ass/%, orario di mercato)
' riga iniziale                 qStart.Cells(tCnt, 1) = Application.WorksheetFunction.Round(myC(0).innerText, 4)                 'myC(0)=quotazione, myC(1)=variazione assoluta, myC(2)= variazione % (ma occorre togliere le varie opzioni per il formato testo)
                qStart.Cells(tCnt, 1) = Application.WorksheetFunction.Round(CSng(Replace(Replace(myC(0).innerText, ",", "", , , vbTextCompare), ".", ",", , , vbTextCompare)), 4) 'tolto la funzione CSng in quanto estrapola già il dato in formato numerico corretto
            Set myC = IE.document.getElementsByClassName("yf-gn3zu3")
            If myC.Length > 0 Then
                qStart.Cells(tCnt, 1 + offCol) = Date                                            'Data elaborazione
'                qStart.Cells(tCnt, 1 + offCol0) = myC(4).innerText                               '4=Chiusura precedente (attualmente non utilizzato)
                qStart.Cells(tCnt, 1 + offcol1) = myC(8).innerText                               '8=Apertura
                qStart.Cells(tCnt, 1 + offcol2) = Split(myC(18).innerText, " - ")(0)             '18=Days range (accoppiati) 19=Days range (accoppiati)
                qStart.Cells(tCnt, 1 + offCol3) = Split(myC(18).innerText, " - ")(1)
                qStart.Cells(tCnt, 1 + offCol4) = CSng(Replace(Replace(myC(24).innerText, ",", "", , , vbTextCompare), "Volume", "", , , vbTextCompare))       '24=Volume (togliere testo "Volume")
                Exit For
            Else
                        Sleep 80
                    End If
                Next I
            Else
                CErr(II) = CErr(II) + 1
                qStart.Cells(tCnt, 1) = CVErr(xlErrNA)
            End If
            Debug.Print cTick, Format(Timer - myTim, "0.00"), I, "Errs:" & CErr(II), IE.LocationUrl
            On Error GoTo 0
        End If
        DoEvents
    Next JJ
    Debug.Print "II=" & II, "Errs=" & CErr(II), Format(Timer - myTim, "0.00")
    If CErr(II) = 0 Then Exit For
    If II > 2 Then
        If CErr(II) = CErr(II - 2) Then Exit For
    End If
Next II
'
'Chiusura
Debug.Print "<<<<<<", II, CErr(II)
On Error Resume Next
IE.Quit
Set IE = Nothing
Beep
End Sub


Grazie!
brtbrn
Utente Junior
 
Post: 35
Iscritto il: 05/01/25 18:41

PrecedenteProssimo

Torna a Applicazioni Office Windows


Topic correlati a "Versioni diverse Office":


Chi c’è in linea

Visitano il forum: Nessuno e 27 ospiti