Condividi:        

Resume next non funziona

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

Resume next non funziona

Postdi Gianca532011 » 03/10/24 07:29

Ciao, sono alle prese con un problema al quale non riesco a trovare soluzione alcuna., ovvero devo fare una interrogazione su un sito web per il download di alcuni dati. Gli url sono riferiti a due pagine differenti , sempre sullo stesso sito. Il mio Url ingloba il riferimento da cercare e se procede alla ricerca sul sito che NON contiene il mio riferimento mi dà errore 424 . La domanda è come evitare tale errore e procedere nella esecuzione della macro. Ovvero : se non va su questo url vai sull'altro...
Metodo utilizzato MsXml

allego lo spezzone di macro incriminato .

Codice: Seleziona tutto
Set Html = CreateObject("htmlfile")
        With CreateObject("WINHTTP.WinHTTPRequest.5.1")
             

            For N = 2 To uR
                   MyIsin =cells(N,1)  ' qui elenco isin 

For i = 2 To 14
                    dati = Array(0, 0, 14, 28, 1, 3, 16, 17, 18, 19, 23, 24, 25, 26, 27)

                    If MyIsin <> "" Then

                        .Open "GET", "https://www.borsaitaliana.it/borsa/obbligazioni/eurotlx/scheda/" & Cells(N, 1) & ".html?lang=it", False    ' tlx
                        .send
                        Html.body.innerHTML = .responseText
                        Application.Wait Now + TimeValue("00:00:01")    'pausa di 1 secondi
                         Cells(N, i) = Html.getElementsByClassName("t-text -right")(dati(i)).innerText
                       
                        Ws1.Range("O" & N) = "T"
                   
                        Else

                        .Open "GET", "https://www.borsaitaliana.it/borsa/obbligazioni/mot/euro-obbligazioni/scheda/" & Cells(N, 1) & ".html?lang=it", False    ' Mot
                        .send
                        Html.body.innerHTML = .responseText
                        Application.Wait Now + TimeValue("00:00:01")    'pausa di 1 secondi
                        On Error GoTo salto
                        Cells(N, i) = Html.getElementsByClassName("t-text -right")(dati(i)).innerText
                       On Error GoTo 0
                            Ws1.Range("O" & N) = "M"
                        End If
         
                Next i
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 349
Iscritto il: 27/05/11 10:18

Sponsor
 

Re: Resume next non funziona

Postdi Anthony47 » 03/10/24 10:21

Il codice pubblicato non contiene nessuna Resume Mext
Contiene pero' un On Error GoTo Salto ma l'etichetta "salto" non so a cosa corrisponde.

Per quel che vedo posso solo dare un warning: dopo un On Error GoTo XXXX la procedura che intercetta gli errori e' sospesa fintanto che non si esegue una Resume; nel frattempo si presume che il codice in esecuzione faccia parte della procedura di gestione errore, e ovviamente non si puo' gestire un errore mentre si sta gestendo un errore (a rileggerlo sembra contorto anche a me, figuriamoci a te)
Per un suggerimento piu' preciso dovrei vedere il costrutto del tuo codice; basandomi su precedenti mie cappellate, potrebbe anche darsi che a te basti:
-modificare On Error GoTo Salto in On Error GoTo GErr

-poi inserire in fondo al tuo codice la finta procedura di gestione errore:
Codice: Seleziona tutto
'tuo codice
'tuo codice
Exit Sub
GErr:
Resume salto
End Sub
Avatar utente
Anthony47
Moderatore
 
Post: 19469
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Resume next non funziona

Postdi Gianca532011 » 03/10/24 11:04

Ciao, ho provato a seguire i tuoi suggerimenti, vedi macro completa, ma compare sempre l'errore 424 , in pratica accade quando riporta un riferimento in (N,1) che non trova nell'url , quindi giustamente mi da errore 424. Il problema secondo me è che non ho riferimenti Utili per dimensionare L'IF iniziale nel senso che If myisin <> "" è valido sempre, ma se non è presente sul mercato Mot ma invece sul Tlx è impossibile saperlo a priori , quindi ecco che la gestione dell'errore dovrebbe essere d'aiuto. In pratica : Se non lo trovi qui vai dall'altra parte . Ma qui mi sono bloccato .

Codice: Seleziona tutto
Option Explicit
Public Sub test2()
    Dim Html As Object
    Dim N As Long, i As Integer
    Dim dati As Variant
    Dim intest As Variant
    Dim var As String
    Dim MyIsin As String
    Dim uR As Long
    Dim uRFine As Long
    Dim R
    Dim Ws1 As Worksheet
    Set Ws1 = Sheets("Isin")
    Ws1.Select
    Ws1.Activate
    Application.EnableEvents = False

    intest = Array("Isin", "Descrizione", "Ultimo", "Chiusura", "Variazione % ", "Valuta", "Lotto", "Cedola Periodale", "Cedola annua", "Rendimento a scadenza Lordo", "Rendimento a scadenza netto", _
                   "Rateo Lordo %", "Rateo Netto %", "Duration", "Mkt")   ' la scadenza trovasi sulla scheda Dati completi "Scadenza", Come ci arrivo ???
    Range("A1:O1") = intest

    uR = Ws1.Cells(Rows.Count, 1).End(xlUp).Row

    Ws1.Range("B2:O" & uR).Clear

    ' codifica come stringa
    With Ws1
        .Range("C2:N" & uR).NumberFormat = "@"

        ' --------------converti isin a maiuscolo-------------------------------
        Dim X As Object
        For Each X In Range("A2:A" & uR)
            X.Value = UCase(X.Value)
        Next

        '-----------------------------------

        Set Html = CreateObject("htmlfile")
        With CreateObject("WINHTTP.WinHTTPRequest.5.1")

            For N = 2 To uR
                MyIsin = Cells(N, 1)
                For i = 2 To 14
                    dati = Array(0, 0, 14, 28, 1, 3, 16, 17, 18, 19, 23, 24, 25, 26, 27)

                    If MyIsin <> "" Then

                        .Open "GET", "https://www.borsaitaliana.it/borsa/obbligazioni/eurotlx/scheda/" & Cells(N, 1) & ".html?lang=it", False    ' tlx
                        .send
                        Html.body.innerHTML = .responseText
                        Application.Wait Now + TimeValue("00:00:01")    'pausa di 1 secondi
                        On Error GoTo GErr
                        Cells(N, i) = Html.getElementsByClassName("t-text -right")(dati(i)).innerText
                        On Error GoTo 0
                        Ws1.Range("O" & N) = "T"

                    Else

                        .Open "GET", "https://www.borsaitaliana.it/borsa/obbligazioni/mot/euro-obbligazioni/scheda/" & Cells(N, 1) & ".html?lang=it", False    ' Mot
                        .send
                        Html.body.innerHTML = .responseText
                        Application.Wait Now + TimeValue("00:00:01")    'pausa di 1 secondi
                        On Error GoTo GErr
                        Cells(N, i) = Html.getElementsByClassName("t-text -right")(dati(i)).innerText
                        On Error GoTo 0
                        Ws1.Range("O" & N) = "M"
                    End If

                Next i
salto:
            Next N

        End With
    End With

    ' --------------------converte testo a numero--------------------------------
    For Each R In Sheets("Isin").UsedRange.SpecialCells(xlCellTypeConstants)
        If IsNumeric(R) Then
            R.Value = CSng(R.Value)
            R.NumberFormat = "0.00"
        End If
    Next

    Range("C2:D" & uR).NumberFormat = "#,##0.00"
    Range("F2:F" & uR).NumberFormat = "#,##"
    Exit Sub
GErr:
    Resume GErr
End Sub



Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 349
Iscritto il: 27/05/11 10:18

Re: Resume next non funziona

Postdi maxpit » 03/10/24 14:13

Buon pomeriggio Giancarlo532011,

visto che
Codice: Seleziona tutto
   If MyIsin <> "" Then

ha significato solo per iniziare le elaborazioni se un codice è presente, dovresti utilizzare altro per discernere su quale Url è possibile recuperare i dati seguendo una logica tipo:

  • leggo il primo URL;
  • esamino il contenuto: contiene ciò che mi aspetto o no?
  • --- si -> estraggo i dati e riprendo con un nuovo codice dall'ultimo punto;
  • --- no -> leggo il secondo URL;
  • ------ esamino il contenuto del secondo URL: è ciò che mi aspetto?
  • --------- si -> estraggo i dati;
  • --------- no -> non ho trovato il codice nei due URL
  • riprendo dall'inizio con il prossimo codice finché è valorizzato
Lascio a te la codifica della logica esposta.

A presto
Avatar utente
maxpit
Utente Junior
 
Post: 19
Iscritto il: 04/08/24 11:59

Re: Resume next non funziona

Postdi Gianca532011 » 03/10/24 15:09

@maxpit
Ciao, si, questa tua logica è corretta, ma il mio problema è fare la verifica.
Ho provato con : se cella corrispondente a (N,1) resta vuota "" , vuol dire che non c'è corrispondenza con l'isin, ovvero che non si trova su quel listino , quindi ... vai a else ma ho sempre avuto error 424.
Tieni conto che l'elenco degli Isin in (N,1) è casuale , nel senso che possono essere anche alterni : Mot e Tlx , quindi devo trovare un metodo che funzioni in entrambe le direzioni :undecided: In pratica non riesco a trovare un argomento valido da dare al mio IF ...
tanto da evitare che questa riga sotto dia errore 424 perchè l'isin NON è su quel listino e quindi manca l'oggetto .

Codice: Seleziona tutto
Cells(N, i) = Html.getElementsByClassName("t-text -right")(dati(i)).innerText


Aggiungo che lo stesso costrutto , ma con Selenium, funziona egregiamente con error resume next
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 349
Iscritto il: 27/05/11 10:18

Re: Resume next non funziona

Postdi Gianca532011 » 03/10/24 15:28

provato anche cosi :
Codice: Seleziona tutto
Debug.Print Html.getElementsByClassName("t-text -right")


e se l'sin viene trovato mi restituisce
Codice: Seleziona tutto
[object HTMLCollection]


MA, se invece non trova l'isin, va subito in errore 424.
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 349
Iscritto il: 27/05/11 10:18

Re: Resume next non funziona

Postdi Anthony47 » 03/10/24 16:47

Perdona, trovo confuso ed errato il flow del tuo codice...

Allora mi pare che il problema e' che non sai su quale mercato un certo isin viene trattato, quindi vorresti determinarlo provando a leggere i dati da ognuna delle piattaforme fintanto che non trovi quella buona.
Prendendo lo spunto dal tuo codice, un possibile approccio e' costituito da questo codice:
Codice: Seleziona tutto
Public Sub test22()
    Dim Html As Object
    Dim N As Long, i As Integer
    Dim dati As Variant
    Dim intest As Variant
    Dim var As String
    Dim MyIsin As String
    Dim uR As Long
    Dim uRFine As Long
    Dim R
    Dim Ws1 As Worksheet
    Dim CollA As Object
'
    Set Ws1 = Sheets("Isin")
    Ws1.Select
    Ws1.Activate
    Application.EnableEvents = False
'
    intest = Array("Isin", "Descrizione", "Ultimo", "Chiusura", "Variazione % ", "Valuta", "Lotto", "Cedola Periodale", "Cedola annua", "Rendimento a scadenza Lordo", "Rendimento a scadenza netto", _
                   "Rateo Lordo %", "Rateo Netto %", "Duration", "Mkt")   ' la scadenza trovasi sulla scheda Dati completi "Scadenza", Come ci arrivo ???
    Range("A1:O1") = intest
    uR = Ws1.Cells(Rows.Count, 1).End(xlUp).Row
    Ws1.Range("B2:O" & uR).Clear
    ' codifica come stringa
    With Ws1
        .Range("C2:N" & uR).NumberFormat = "@"

        ' --------------converti isin a maiuscolo-------------------------------
        Dim X As Object
        For Each X In Range("A2:A" & uR)
            X.Value = UCase(X.Value)
        Next

        '------------------->>>>>>>>>>>>>>>>
        Set Html = CreateObject("htmlfile")
        With CreateObject("WINHTTP.WinHTTPRequest.5.1")
        dati = Array(0, 0, 14, 28, 1, 3, 16, 17, 18, 19, 23, 24, 25, 26, 27)
            For N = 2 To uR
                MyIsin = Cells(N, 1)
                If MyIsin <> "" Then
            'Provo su tlx:
                    .Open "GET", "https://www.borsaitaliana.it/borsa/obbligazioni/eurotlx/scheda/" & Cells(N, 1) & ".html?lang=it", False    ' tlx
                    .Send
                    Html.body.innerHTML = .responseText
                    Application.Wait Now + TimeValue("00:00:01")    'pausa di 1 secondi
                    Set CollA = Nothing
                    On Error Resume Next
                        CollA = Html.getElementsByClassName("t-text -right")
                    On Error GoTo 0
                    If Not CollA Is Nothing Then
                        'trovato su tlx:
                        'gestisci i dati da tlx
                        'gestisci i dati da tlx
                        '
                        '
                        Debug.Print N, MyIsin, "Su Tlx"
                        GoTo PROX
                    End If
            'Provo su Mot:
                    .Open "GET", "https://www.borsaitaliana.it/borsa/obbligazioni/mot/euro-obbligazioni/scheda/" & Cells(N, 1) & ".html?lang=it", False    ' Mot
                    .Send
                    Html.body.innerHTML = .responseText
                    Application.Wait Now + TimeValue("00:00:01")    'pausa di 1 secondi
                    On Error Resume Next
                        CollA = Html.getElementsByClassName("t-text -right")
                    On Error GoTo 0
                    If Not CollA Is Nothing Then
                        'trovato su Mot:
                        'gestisci i dati da Mot
                        'gestisci i dati da Mot
                        '
                        '
                        Debug.Print N, MyIsin, "Su Mot"
                        GoTo PROX
                    End If
            'Provare su altri Mercati?
                    '..
                    '..
                    '..
                    '..
                End If
PROX:
            Next N
        End With
    End With
    ' --------------------converte testo a numero--------------------------------
    For Each R In Sheets("Isin").UsedRange.SpecialCells(xlCellTypeConstants)
        If IsNumeric(R) Then
            R.Value = CSng(R.Value)
            R.NumberFormat = "0.00"
        End If
    Next
'
    Range("C2:D" & uR).NumberFormat = "#,##0.00"
    Range("F2:F" & uR).NumberFormat = "#,##"
End Sub

Le modifiche sono radicali a partire dalla riga '------------------->>>>>>>>>>>>>>>>
Come vedi il controllo e' fatto testando se si riesce a estrarre una CollA (collezione dei nodi con quella ClassName)
Non ho riempilo le righe 'gestisci i dati da tlx e 'gestisci i dati da Mot, perche' mi sembra strano che in ambedue i casi leggi la collezione avente stessa ClassName e lo stesso pointer; ma se e' proprio così allora in ambedue i casi la gestione la fai con questo codice:
Codice: Seleziona tutto
            On Error Resume Next
            For i = 2 To 14
                Cells(N, i) = CollA(dati(i)).innerText
            Next i
            On Error GoTo 0

Spero sia comprensibile e soprattutto adattabile al tuo bisogno
Avatar utente
Anthony47
Moderatore
 
Post: 19469
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Resume next non funziona

Postdi Gianca532011 » 03/10/24 20:20

Grazie Anthony,
provato il tuo codice ma mi da errore 91 proprio su questa :
Codice: Seleziona tutto
 CollA = Html.getElementsByClassName("t-text -right")


Immagine
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 349
Iscritto il: 27/05/11 10:18

Re: Resume next non funziona

Postdi maxpit » 03/10/24 21:29

Buona sera Giancarlo532011,

direi che una rivisitazione del codice è auspicabile, comunque la logica che seguirei, non prevede l'utilizzo di una gestione degli errori, ma analizzo la risposta :
- una risposta valida: se ritrovo il codice che ho richiesto.
- una risposta non valida: non trovo il codice richiesto e a questo punto cambio url di ricerca.

in pratica, prima di effettuare tutte le assegnazioni di valori dovresti testare se la collezione che andresti ad estrarre ha degli elementi con:
Codice: Seleziona tutto
IF Html.getElementsByClassName("t-text -right").length then
   ' ci sono degli elementi nella collezione e li estrai
ELSE
   ' non è stato trovato nessun elemento e dovresti cercare con l'altro Url
END IF

Verifica se questo può risolvere la questione.

A presto
Avatar utente
maxpit
Utente Junior
 
Post: 19
Iscritto il: 04/08/24 11:59

Re: Resume next non funziona

Postdi Anthony47 » 03/10/24 22:56

Giancarlo, io ho provato con degli isin a caso, e puntualmente On Error Resume Next evita l'errore; il mio file di prova:
https://www.dropbox.com/scl/fi/bs7l7qaj ... gxydt&dl=0

Se invece il tuo On Error non scatta sembrerebbe che il tuo vba sia rincitrullito; prima vorrei pero' provare il tuo file, se lo puoi condividere anche in versione ridotta.

maxpit ha scritto:direi che una rivisitazione del codice è auspicabile, comunque la logica che seguirei, non prevede l'utilizzo di una gestione degli errori, ma analizzo la risposta :
- una risposta valida: se ritrovo il codice che ho richiesto.
- una risposta non valida: non trovo il codice richiesto e a questo punto cambio url di ricerca.

Max, e' quello che vorremmo fare. Pero' la getElementsByClassName non restituisce una collezione vuota se non trova la classe (l'equivalente comando Selenium invece lo fa); da qui il tentativo di compilare CollA e poi testare se CollA non è "Nothing"

Ciao a tutti

EDIT
E' sbagliato dire "la getElementsByClassName non restituisce una collezione vuota se non trova la classe (l'equivalente comando Selenium invece lo fa)".
Semmai una cosa del genere succede con Selenium:
-i comandi FindElementByxxx vanno in errore se non trovano l'elemento
-i comandi FindElementsByxxx restituiscono una collezione, di lunghezza 0 se non trovano nessun elemento
Avatar utente
Anthony47
Moderatore
 
Post: 19469
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Resume next non funziona

Postdi maxpit » 04/10/24 06:37

Buongiorno a tutti,

Vi invito ad eseguire la prova con il codice sotto riportato, inserendo un Url valido e compilando le proprietà di classe per estrarre la collezione, e constatare che il comportamento Selenium è simile a quello che ho espresso seguendo passo-passo (F8) lo scorrere del codice e leggendo i contenuti direttamente dalla finestra immediata di VBE.
infatti io non cerco una collezione vuota ma se contiene una collezione estratta con i parametri che indico: e l'esito sarà:
- il numero di oggetti trovati e false per la collezione (non è Nothing) per il primo caso;
- 0 oggetti trovati e false per la collezione (che continua a non essere Nothing) per il secondo caso:

Codice: Seleziona tutto
Sub Test()

    ' --------------------------------
    ' inserire riferimenti a librerie:
    '
    ' - Microsoft HTML Object Library 2.0
    ' - Microsoft XML, v 6.0
    ' --------------------------------
   
    ' -------------------------------------
    ' Dichiaro le variabili utilizzate
    ' -------------------------------------
    Dim Html As MSHTML.HTMLDocument
    Dim HttpReq As MSXML2.XMLHTTP60
    Dim sElements As MSHTML.IHTMLElementCollection
    Dim Url As String
   
    Url = ""                   ' *** inserire il sito di interesse
    Set Html = New MSHTML.HTMLDocument
    Set HttpReq = New MSXML2.XMLHTTP60
   
    With HttpReq
        .Open "GET", Url
        .send
        Html.body.innerHTML = .responseText
        Set sElements = Html.getElementsByClassName("node-title")     ' *** classe esistente
        Debug.Print sElements.Length, sElements Is Nothing
        Set sElements = Html.getElementsByClassName("node-titl")      ' *** classe inesistente
        Debug.Print sElements.Length, sElements Is Nothing
    End With

End Sub

A presto

Max
Avatar utente
maxpit
Utente Junior
 
Post: 19
Iscritto il: 04/08/24 11:59

Re: Resume next non funziona

Postdi Gianca532011 » 04/10/24 09:34

Innanzitutto grazie a entrambi per il tempo dedicato al problema.
Anthony : ho verificato il tuo codice e ... inevitabilmente mi compare errore 91 qui :
Codice: Seleziona tutto
CollA = Html.getElementsByClassName("t-text -right")

Nell'esempio restituito ho riportato anche due Isin corretti, rispettivamente per il Tlx e per il Mot .

Maxpit : ho testato il tuo codice inserendo url Tlx e MOT e con errore , però secondo me non se ne cava nulla . Anche perchè la struttura delle due pagine di interrogazione Tlx e Mot sono molto simili ; semplicemente si trova o non si trova l'isin cercato.
Accludo anche Html dell' ispezione all'Isin .

accludo link con tutti i file testati

https://filetransfer.io/data-package/JOzaM3eF#link
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 349
Iscritto il: 27/05/11 10:18

Re: Resume next non funziona

Postdi Anthony47 » 04/10/24 10:44

Innanzitutto grazie MAXPIT perchè il tuo intervento mi ha fatto realizzare che nel mio codice sbagliavo la gestione di CollA: essendo un Object lo devo gestire con Set.
Realizzato (e corretto!) questo, ci sono differenze di stile di programmazione che fanno parte di abitudini o preferenze personali; ad esempio io preferisco il "late binding" perchè non richiede le impostazioni delle librerie di riferimento (e perchè qualche volta da maggiore compatibilità tra le versioni), che pero' alla fine dovrebbero essere ininfluenti sui risultati.

Andando a Giancarlo, al momento io sono ancora perplesso sul fatto che sul suo Pc On Error Resume Next sembra sia in sciopero (che poi e' il titolo del messaggio)
Prova elementare, con questa macro:
Codice: Seleziona tutto
Sub Mahh()
Dim AAA
On Error Resume Next
AAA = Range("zero").Value
Beep
End Sub
Mandandola in esecuzione, la macro si completa col Beep o va in debug? Ovviamente dovrebbe completarsi con il beep senza interruzioni; sa va in Debug allora hai un problema col tuo vba.
Che anche qui stia prendendo un abbaglio? :eeh: :-?

Sempre con Giancarlo: ma il tuo obiettivo qual'è? Perche' stai facendo enquiry su 2 url?
Tra l'altro, mentre l'isin US345370CX67 (il primo che hai segnalato) ha una risposta valida solo dalla pagina EUROTLX, il secondo (XS1379091546) ha risposta valida sia da EUROTLX (collezione da 32 elementi) che da MOT (collezione da 42 elementi)
Il sito EUROTLX lo descrive come Imi-Fix Float Cap 10mg26
Il sito MOT lo descrive come Imi Collezio Mc Mg26 Eur
Avatar utente
Anthony47
Moderatore
 
Post: 19469
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Resume next non funziona

Postdi maxpit » 04/10/24 12:37

Buon pomeriggio Giancarlo532011,

il mio era un suggerimento per dirti di individuare degli elementi univoci per poter discernere tra le pagine ma in considerazione dell'ultima segnalazione di Anthony47
il secondo (XS1379091546) ha risposta valida sia da EUROTLX (collezione da 32 elementi) che da MOT (collezione da 42 elementi)
Il sito EUROTLX lo descrive come Imi-Fix Float Cap 10mg26
Il sito MOT lo descrive come Imi Collezio Mc Mg26 Eur

sembra che dovrai indicare tu dove interrogare perché a questo punto ogni codice potrebbe essere presente in tutti e due i mercati, solo in uno o in nessuno e quindi dovrai cercare un altro modo per discernere.
Comunque, il problema posto in questo thread è relativo al "Resume Next", come ricordato anche da Anthony47, e nel codice proposto vedo solo un salto alla gestione dell'errore che torna su se stessa:

Codice: Seleziona tutto
                       [...]
                       On Error GoTo GErr
                       [...]
GErr:
    Resume GErr
End Sub

Alla prossima.

Max
Avatar utente
maxpit
Utente Junior
 
Post: 19
Iscritto il: 04/08/24 11:59

Re: Resume next non funziona

Postdi Gianca532011 » 04/10/24 12:58

Ciao Anthony , e grazie adesso il codice funziona perfettamente .
Rispondo alle tue domande :

"Perche' stai facendo enquiry su 2 url? "

perchè, una volta trovato il metodo corretto, ho la necessità di fare 4 interrogazioni essendo i dati di mio interesse, per ciascun isin, spalmati sul foglio Scheda e sul foglio Dati completi che trovi aprendo su Google un isin qualsiasi di Borsa Italiana.
Poi il fatto da te segnalato è vero, a volte i titoli sono mescolati un po' a casaccio, solo per non essere piu esplicito :lol:

Per il codice test che hai messo ottengo errore 1004 "Metodo range dell'oggetto global non riuscito"
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 349
Iscritto il: 27/05/11 10:18

Re: Resume next non funziona

Postdi maxpit » 04/10/24 13:24

Buon pomeriggio Anthony47,

concordo con te che la modalità early o late-binding sicuramente è influenzata dal proprio stile acquisito nel tempo.
Io preferisco l'early-binding perché mi permette di avere a disposizione il supporto on-line, gestire gli oggetti con il proprio nome e essendo oggetti definiti diventa più semplice usarli senza confonderli anche se avessero nomi simili. Se però incontrassi qualche intoppo in questa modalità, converto il codice in late-binding e verifico anche così.

Gli errori che possono essere commessi sono umani, quelli dell'IA, dove mi sono imbattuto, derivano probabilmente da autoapprendimento su codici non verificati e che quindi producono risultati per ora poco utilizzabili.

A presto
Avatar utente
maxpit
Utente Junior
 
Post: 19
Iscritto il: 04/08/24 11:59

Re: Resume next non funziona

Postdi Anthony47 » 04/10/24 14:30

Giancarlo, e' evidente che al momento il tuo vba non gestisce On Error Resume next (e, immagino, piu' in generale On Error).
Per questo probabilmente devi modificare un parametro sulle opzioni del vba:
-Menu /Strumenti /Opzioni; tab Generale, controlla che alla voce "Intercettazione degli errori" sia spuntata la terza opzione

A questo punto la Sub Bah dovrebbe completarsi senza nessun debug

Max; in effetti anche io "progetto" in early binding (per usare i suggerimenti dell'editor ed evitare errori di scrittura dei comandi) ma poi pubblico in late binding

Ciao a tutti!
Avatar utente
Anthony47
Moderatore
 
Post: 19469
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Resume next non funziona

Postdi Gianca532011 » 04/10/24 14:40

A questo punto la Sub Bah dovrebbe completarsi senza nessun debug

Yesssssssssssssss.
grazie a entrambi per il vs tempo e per lo sforzo di insegnarmi qualcosa .
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 349
Iscritto il: 27/05/11 10:18

Re: Resume next non funziona

Postdi Gianca532011 » 04/10/24 14:48

@maxpit ,

"Gli errori che possono essere commessi sono umani," confermo, tanto più da autodidatta quale sono e, senza le giuste basi, ogni volta è una lotta per imparare e concludere qualcosa. Fortuna che ci siete voi . Grazie ancora
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 349
Iscritto il: 27/05/11 10:18

Re: Resume next non funziona

Postdi Gianca532011 » 05/10/24 13:17

Giusto per concludere l'argomento propongo il codice finale che ... udite udite raccoglie i suggerimenti di Anthony e i consigli di Maxpit nel senso che ho identificato un elemento NON Comune per attivare la seconda parte della macro. Devo dire che su 630 isin testati si è dimostrato molto più veloce (28 Minuti) del suo omologo con Selenium (65 min') , a parità di isin considerati.
Vero che oggi le borse sono chiuse e i server potrebbero avere comportamento e tempi di download diversi , comunque sono ampiamente soddisfatto del lavoro svolto, e ancora grazie a entrambi .

Codice: Seleziona tutto
Option Explicit
Public Sub MOT()
    Dim Html As Object
    Dim N As Long, i As Integer
    Dim dati As Variant
    Dim dati1 As Variant
    Dim ii As Integer
    Dim intest As Variant
    Dim var As String
    Dim MyIsin As String
    Dim uR As Long
    Dim uRFine As Long
    Dim R
    Dim Ws1 As Worksheet
    Dim CollA As Object
    '
    Set Ws1 = Sheets("Isin")
    Ws1.Select
    Ws1.Activate
    Application.EnableEvents = False
    '
    intest = Array("Isin", "Descrizione", "Ultimo", "Chiusura", "Variazione % ", "Valuta", "Lotto", "Cedola Periodale", "Cedola annua", "Rendimento a scadenza Lordo", "Rendimento a scadenza netto", _
     "Rateo Lordo %", "Rateo Netto %", "Duration", "Mkt")   ' la scadenza trovasi sulla scheda Dati completi "Scadenza", Come ci arrivo ???
     Range("A1:O1") = intest
    uR = Ws1.Cells(Rows.Count, 1).End(xlUp).Row
    Ws1.Range("B2:O" & uR).Clear
    ' codifica come stringa
    With Ws1
        .Range("C2:N" & uR).NumberFormat = "@"

        ' --------------converti isin a maiuscolo-------------------------------
        Dim X As Object
        For Each X In Range("A2:A" & uR)
            X.Value = UCase(X.Value)
        Next

        '----------------------------------->>>>>>>>>>>>>>>>
        Set Html = CreateObject("htmlfile")
        With CreateObject("WINHTTP.WinHTTPRequest.5.1")

            For N = 2 To uR
                MyIsin = Cells(N, 1)
                If MyIsin <> "" Then
                    'Provo su tlx:

                    'Provo su Mot:
                    .Open "GET", "https://www.borsaitaliana.it/borsa/obbligazioni/mot/euro-obbligazioni/scheda/" & Cells(N, 1) & ".html?lang=it", False    ' Mot
                    .Send
                    Html.body.innerHTML = .responseText
                    Application.Wait Now + TimeValue("00:00:01")    'pausa di 1 secondi
                    On Error Resume Next
                    Set CollA = Html.getElementsByClassName("t-text -right")
                    On Error GoTo 0

                    If Not CollA Is Nothing Then

                        'trovato su Mot
                        'gestisci i dati da Mot
                        On Error Resume Next
                        dati1 = Array(0, 0, 32, 0, , , 28, 27, 40, 41, 11, 12, 13, 14, 15, 29)
                        For i = 2 To 15
                            Cells(N, i) = CollA(dati1(i)).innerText
                        Next i
                        On Error GoTo 0

                        'Debug.Print N, MyIsin, "Su Mot"
                    End If
                   
                    'Provare su altri Mercati?
                    If Cells(N, 15) <> "MOT" Then '..
                    .Open "GET", "https://www.borsaitaliana.it/borsa/obbligazioni/eurotlx/scheda/" & Cells(N, 1) & ".html?lang=it", False    ' tlx
                    .Send
                    Html.body.innerHTML = .responseText
                    Application.Wait Now + TimeValue("00:00:01")    'pausa di 1 secondi
                    Set CollA = Nothing
                    On Error Resume Next
                    Set CollA = Html.getElementsByClassName("t-text -right")
                    On Error GoTo 0
                    If Not CollA Is Nothing Then
                        'trovato su tlx
                        'gestisci i dati da tlx
                        On Error Resume Next
                        dati = Array(0, 0, 14, 1, 5, 3, 16, 17, 18, 19, 23, 24, 25, 26, 27)
                        For i = 2 To 14
                            Cells(N, i) = CollA(dati(i)).innerText
                        Next i
                      '  Ws1.Range("O" & N) = "T"
                        On Error GoTo 0
                        '
                        'Debug.Print N, MyIsin, "Su Tlx"
                    End If '..
                    '..
                  End If
                End If

            Next N
        End With
    End With
    ' --------------------converte testo a numero--------------------------------
    For Each R In Sheets("Isin").UsedRange.SpecialCells(xlCellTypeConstants)
        If IsNumeric(R) Then
            R.Value = CSng(R.Value)
            R.NumberFormat = "0.00"
        End If
    Next
    '
    Range("C2:D" & uR).NumberFormat = "#,##0.00"
    Range("F2:F" & uR).NumberFormat = "#,##"
End Sub

Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 349
Iscritto il: 27/05/11 10:18

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Resume next non funziona":


Chi c’è in linea

Visitano il forum: Nessuno e 24 ospiti