Condividi:        

Lanciare macro da un'altra macro?

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

Lanciare macro da un'altra macro?

Postdi Gianca532011 » 19/05/26 18:10

Innanzitutto ciao a chi vorrà darmi aiuto.
La situazione è questa : vorrei scaricare una serie di tabelle che ho aperto con Selenium su chrome , dopo opportuni settaggi ottengo un elenco suddiviso in diverse tabelle , circa 20 . Ho provato con questa sotto ma non salva tutte le tabelle. Quindi ho pensato alla macro di Anthony di qualche anno fa , ma come inserirla nella macro primaria ?

Codice: Seleziona tutto
'scarica tutte le pagine
        For i = 1 To 14  'n. pagine

            Set Table = Dd.FindElementByCss("#tableResults")
            For Each row In Table.FindElementsByTag("tr")
                c = 1
                For Each cell In row.FindElementsByTag("td")
                    Cells(r, c).Value = cell.Text
                    c = c + 1
                      Next cell
                r = r + 1
                          Next row
    next i
                     
]


Option Explicit
Dim WPage As Object

Sub PrintTables()
Dim myIsin As String, myUrl As String
'
'Crea Driver:
If WPage Is Nothing Then
Set WPage = CreateObject("Selenium.ChromeDriver")
End If
Sheets("Dividendi").Select
Range("A:M").ClearContents
'
myIsin = "KO"
myUrl = "https://it.investing.com/dividends-calendar/"

'
'Prima pagina:
WPage.Start "Chrome"
Call GetAllTablesArr(myUrl) 'Posiziona in colonna A
'

'Quit Selenium
WPage.Quit
Set WPage = Nothing
MsgBox ("Informazioni raccolte...")
End Sub

Sub GetAllTablesArr(myUrl As String, Optional rNum0 As Long = 1, Optional cNum0 As Long = 1)
Dim TBColl As Object
Dim I As Long, J As Long, myTim As Single
Dim RNum As Long, CNum As Long

Dim TArr

If WPage Is Nothing Then
Set WPage = CreateObject("Selenium.ChromeDriver")
End If
WPage.Get myUrl
'
myTim = Timer
'
Set TBColl = WPage.FindElementsByTag("table")
RNum = rNum0: CNum = cNum0
'
For I = 1 To TBColl.Count 'Scan delle Tabelle presenti
TArr = TBColl(I).AsTable.Data
RNum = RNum + 1
Cells(RNum, CNum).Value = "## Table " & I
If (UBound(TArr) * UBound(TArr, 2)) > 0 Then
Cells(RNum + 1, CNum).Resize(UBound(TArr), UBound(TArr, 2)).Value = TArr
End If
RNum = RNum + UBound(TArr) + 1
DoEvents
Next I
Debug.Print "FINE", RNum, Format(Timer - myTim, "0.00"), myUrl
End Sub
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 372
Iscritto il: 27/05/11 10:18

Sponsor
 

Re: Lanciare macro da un'altra macro?

Postdi Anthony47 » 20/05/26 09:33

La Sub GetAllTablesArr si occupa di estrarre le tabelle dall'Url indicato e posizionarle sul foglio corrente a partire dalla Riga/ Colonna indicata al momento della chiamata (default: Riga 1 Colonna 1)

C'e' un vincolo non dichiarato: lavora con il driver WPage che deve essere pubblico nel Modulo (quindi dichiarato in testa al modulo con Dim WPage As Object, nell'ipotesi comune di lavorare in modalità "late bind") e gestito dalla Sub chiamante (creazione del driver, disconnessione finale e set=nothing).
In effetti basterebbe poco per "passare" alla GetAllTablesArr anche il nome del driver da usare, ma queste cose spesso nascono a strati, uno dopo l'altro e si portano dietro i limiti della situazione in cui sono nate

Spero che con queste informazioni potrai risolvere, altrimenti scrivi ancora e vedrò cosa posso fare, ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19701
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Lanciare macro da un'altra macro?

Postdi Gianca532011 » 20/05/26 13:07

Ciao Anthony , purtroppo le mie conoscenze oltre che scarse sono pure arrugginite ; quindi ti posto la macro completa dove a un certo punto troverai il tentativo di innesto della tua GetaAlltableArr che però non funzia .

Allego il file .

https://we.tl/t-iS5JbwBsuDRV6B7T
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 372
Iscritto il: 27/05/11 10:18

Re: Lanciare macro da un'altra macro?

Postdi Anthony47 » 20/05/26 21:52

A parte qualche svista nel codice, a me pare che quel sito identifica che l'accesso proviene da un driver di automazione e in qualche modo interferisce con i comandi (è una protezione anti bot).
Non ho ancora capito se il "selenium chromedriver" ha o non ha la capacità di camuffarsi per evitare di farsi ...beccare, ho fatto qualche prova ma il tempo manca. Con calma cerco di capirne di più...
Avatar utente
Anthony47
Moderatore
 
Post: 19701
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Lanciare macro da un'altra macro?

Postdi Anthony47 » 21/05/26 00:09

Sapevo che domani avrei avuto meno tempo che oggi e ho cercato di fare qualcosa stasera.
Gemini mi ha suggerito alcuni trucchi su come camuffare il ChromeDriver versione bot; dopo un po’ di prove abbiamo trovato la quadra che a me funziona. Vedi le istruzioni aggiunte subito dopo With chromeBrowser
Ho poi modificato alcune istruzioni, sono quelle che nel commento cominciano con **

Tornando alla modalità di camuffamento, il trucco principale e’ stato di creare un profilo utente fasullo e usarlo, ma la prima volta che accedi al sito (quindi al primo Stop) devi usare la finestra Chrome per fare qualche giretto sia su it.investing.com che su altri siti, navigando normalmente. Questo comporta l’installazione sul profilo di svariati cookies la cui presenza tranquillizzerà il sito le volte successive che useremo quel profilo.
Per il profilo utente fasullo, crea una cartella del tipo C:\ Desktop\ChromeProfile e scrivi questo indirizzo nell’istruzione marcata **** Falso profilo (il mio desktop e’ su D, quello che vedi nel codice del file che condivido e’ il percorso del MIO profilo fasullo).

A questo punto, usando il file che condivido e avendolo personalizzato col percorso del profilo fasullo:
-chiudi qualsiasi altro Chrome che hai aperto
-lancia la macro e fermati al primo Stop
-Naviga manualmente qua e là nel sito e su altri siti. Poi chiudi il browser e interrompi la macro (puoi farlo col tasto “Ripristina” dell’interfaccia vba o con Menu /Esegui /Ripristina)
NB: il camuffamento non è proprio totale, tanto che se dalla pagina it.investing.com/dividends-calendar provi l’opzione “Esplora i NVDA dati” il software anti bot del sito non ci casca e non ti fa andare avanti

Queste fasi dovrebbero essere eseguite solo la prima volta, per popolare di cookie il profilo fasullo che abbiamo creato

A questo punto, sempre con nessuna sessione Chrome attiva, avvia la macro e prova a lavorare come facevi (quindi con gli F8 aspettando il completamento dell’azione prima di andare avanti); quando arrivi alla Sub GetAllTablesArr puoi finalmente pigiare F5 per completare il resto del codice.

Trovi il file modificato qui: https://www.dropbox.com/scl/fi/gfpcu0kz ... fa9ks&dl=0

Se funziona anche a te vedro’, ma stavolta con calma, come si puo’ evitare l’uso di F8

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

Re: Lanciare macro da un'altra macro?

Postdi Gianca532011 » 21/05/26 17:19

Ciao Anthony e grazie per il tuo lavoro.
Ho provato il tuo file e con qualche piccola modifica sono riuscito a togliere gli stop e mandare il tutto in automatico , ti allego sia la versione senza AllTablesArr che con , sembrerebbero funzionare entrambe salvo che il mio desiderata era di avere il calendario a dicembre ma di fatto il download delle tabelle si ferma a fine luglio. Why ??
Appena hai tempo se puoi dare una controllata . Ciao


https://we.tl/t-pLysxqeOped9hsxq
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 372
Iscritto il: 27/05/11 10:18

Re: Lanciare macro da un'altra macro?

Postdi Anthony47 » 21/05/26 21:42

il calendario a dicembre ma di fatto il download delle tabelle si ferma a fine luglio. Why ??

Eh, il bello delle tabelle dinamiche, che si creano quando servono...
Nel caso specifico se l'utente scorre la pagina altre righe vengono approntate per essere visualizzate
Se infatti per prova metti uno Stop prima della Set Table = .FindElementByCss("#dividendsCalendarData") (in file Test2_NoTablesArr.xlsm) o prima della Call GetAllTablesArr (file Test1 +met. Anthony .xlsm), scorri manualmente la pagina web in modo da vedere tutti i risultati e poi (tramite F5) completi l'esecuzione della macro allora vedrai importate tutte le righe.

In selenium puoi emulare lo scorrimento tramite le istruzioni
Codice: Seleziona tutto
    .ExecuteScript ("window.scrollTo(0, document.body.scrollHeight);")
    .Wait 500
da posizionare dove ho detto di mettere lo Stop per prova

Confermo che guardero' come si possono eliminare quei 40 secondi di attesa
Avatar utente
Anthony47
Moderatore
 
Post: 19701
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Lanciare macro da un'altra macro?

Postdi Gianca532011 » 22/05/26 12:41

Grazie, anche se per me è già un successone cosi come è. :D
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 372
Iscritto il: 27/05/11 10:18


Torna a Applicazioni Office Windows


Topic correlati a "Lanciare macro da un'altra macro?":


Chi c’è in linea

Visitano il forum: Nessuno e 29 ospiti