Condividi:        

Aiuto su creazione 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

Aiuto su creazione macro

Postdi volenteroso » 10/10/15 18:53

Ciao a tutti,

sono felice di far parte di questo forum, vi leggo da diverso tempo e sono sicuro che chiedendo il vostro gentile aiuto risolverò il mio problema.

Vorrei creare una macro che eseguendola facesse questo tipo di lavoro:

Nel "Foglio1" di un file excel ho dalla cella A1 alla cella A3 dei nomi ad esempio pippo, pluto e paperino.
Ho un indirizzo web dove vi sono dei dati su tre pagine ad esempio: www.topolino.it/pippo.htm, pluto.htm e paperino.htm
La macro dovrebbe creare una volta eseguita i fogli pippo, pluto e paperino e riportare rispettivamente in essi il contenuto delle pagine web del sito topolino.

E' fattibile come operazione ?

Grazie per l'aiuto, saluti
un novizio volenteroso
volenteroso
Utente Junior
 
Post: 10
Iscritto il: 10/10/15 18:44

Sponsor
 

Re: Aiuto su creazione macro

Postdi Anthony47 » 11/10/15 20:36

Ciao volenteroso, benvenuto sul forum.
Queste automazioni si fanno lavorando sul sorgente htm del sito; quindi devi indicare esattamente l'url da cui partiamo.

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

Re: Aiuto su creazione macro

Postdi volenteroso » 12/10/15 06:44

Innanzitutto grazie per l'interessamento. Cercherò di essere più chiaro possibile:

Dal sito: (1) http://www.borsaitaliana.it/borsa/deriv ... lista.html sono presenti le opzioni dell'indice della borsa italiana in ordine di scadenza. Prendendo ad esempio la scadenza dicembre e clickando sulla C accanto a 22500 appare questo sito:
(2) http://www.borsaitaliana.it/borsa/deriv ... ml?lang=it da cui clickando su dati completi arriviamo su: (3) http://www.borsaitaliana.it/borsa/deriv ... 70&lang=it

Nella pagina sono contenute due tabelle, la prima che parta con "Codice Isin: IT0012060270" , la seconda con "Max oggi: 820".

Ritornando alla pagina iniziale delle scadenze (1), e considerato che le pagine (3) variano in base al codice isin
http://www.borsaitaliana.it/borsa/deriv ... html?isin=IT0012060270&lang=it

l'obiettivo è creare un elenco di codici isin che interessano l'osservazione nel foglio1 di un file excel e successivamente collegare una macro ad un pulsante che crei i fogli relativi all'elenco dei codici isin impostati e importi le due tabelle indicate in alto.

Spero di essere stato il più chiaro possibile!

Grazie
volenteroso
volenteroso
Utente Junior
 
Post: 10
Iscritto il: 10/10/15 18:44

Re: Aiuto su creazione macro

Postdi Anthony47 » 12/10/15 23:48

Per capirci, tu hai un elenco di N codici Isin in Foglio1 di un file Excel e vorresti importare su N nuovi fogli i dati reperibili nelle tabelle 4 e 5 dell'url http://www.borsaitaliana.it/borsa/deriv ... IN&lang=it?

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

Re: Aiuto su creazione macro

Postdi volenteroso » 13/10/15 07:01

È corretto.

Grazie
volenteroso
Utente Junior
 
Post: 10
Iscritto il: 10/10/15 18:44

Re: Aiuto su creazione macro

Postdi Anthony47 » 14/10/15 00:26

Ecco un file di partenza che fa cio' che ho capito:
https://www.dropbox.com/s/njsb7jaigwxpz ... .xlsm?dl=0

La macro da eseguire e' la Sub GetIsinInfo.
Rispetto alle solite macro di automazione tramite IE, il cuore della macro (la parte che realizza la lettura delle tabelle di dettaglio) e' la seguente:
Codice: Seleziona tutto
For I = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    myIsin = Cells(I, 1).Value
    myURL = "http://www.borsaitaliana.it/borsa/derivati/ftse-mib-options/dati-completi.html?isin=" & myIsin & "&lang=it"
    If Ie Is Nothing Then Set Ie = CreateObject("InternetExplorer.Application")
    '
Refr:
    With Ie
    Debug.Print "------ " & myRetr
        .Navigate myURL
        .Visible = True
    End With
    'wait for page...
    myRes = ieWaitPage(Ie, 0.5, 40)    'sessione, Stab Time, TimeOut time
'..
'..
    'IE Document ora pronto...
    Set myColl = Ie.document.getElementsByTagName("TABLE")
    If myColl.Length < 4 Then
        Cells(I, 2).Value = "Codice non trovato"
        SkipCod = True
    Else
        Cells(I, 2).Value = "Codice trovato, " & Format(Now, "hh:mm:ss")
        SkipCod = False
    End If
    If SkipCod Then GoTo SkipI
'..
'..
    For J = 3 To 4
        With myColl(J)
            For Each TrTr In .Rows
                For Each TdTd In TrTr.Cells
                    Range("B2").Offset(kK, jJ) = TdTd.innertext
                    jJ = jJ + 1
                Next TdTd
                kK = kK + 1: jJ = 0
            Next TrTr
            kK = kK + 1
        End With
    Next J
    Columns("A:E").EntireColumn.AutoFit
SkipI:
kK = 0: jJ = 0
Sheets(myList).Select
Next I

L'elenco va inserito nel foglio Lista (modificabile nel codice; vedi riga marcata <<<), da cella A2 verso il basso; la colonna B sara' usata per scriverci lo stato dell'operazione ("Codice trovato" + hh:mm:ss /"Codice non trovato").
I dati saranno trascritti in fogli aventi nomi pari al codice Isin; se il foglio non e' presente viene creato, ma se e' GIA' PRESENTE allora VIENE AZZERATO COMPLETAMENTE DALLA MACRO SENZA NESSUN PREAVVISO prima di essere popolato con i dati prelevati dalle tabelle web.
Altri fogli presenti sul file non vengono toccati; compreso eventuali fogli con codici Isin precedentemente elaborati.

Se e' necessario spostare il codice su altri file allora bisogna esportare i moduli Anthony1 e Anthony2 (Menu /File /Esporta file...) e poi Importarli nel nuovo file (Menu /File /Importa file...), lasciandoli come sono salvo la personalizzazione della riga marcata <<<.
Il file e il codice non possono essere usati per fini commerciali.

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

Re: Aiuto su creazione macro

Postdi volenteroso » 14/10/15 06:30

Grazie mille per l'aiuto. Ho scaricato il file e c'è un piccolo problemino. Ho il SO a 64bit e mi appare questo errore:

Errore di compilazione: il codice del progetto deve essere aggiornato per l'utilizzo in sistemi a 64 bit. Esaminare e aggiornare le istruzioni Declare, quindi contrassegnarle con l'attributo PtrSafe.

:eeh: :eeh: :eeh:

Per me, al momento, risulta lingua araba!

Potresti aggiungere questa correzione?

Grazie
volenteroso
Utente Junior
 
Post: 10
Iscritto il: 10/10/15 18:44

Re: Aiuto su creazione macro

Postdi volenteroso » 14/10/15 16:54

Ciao,

immaginando fosse facile la modifica e avendo avuto anche fortuna, ho provato ad aggiungere "Declare PtrSafe" e magicamente il file funziona a 64bit :D

Avrei bisogno di due aggiustamenti nell'importazione dei dati! :)

1) Ho notato che quando si collega al sito, si apre la finestra di IE. Esiste un comando che lo renda insivibile?

(Ho trovato sul web questo: Application.ScreenUpdating = False ma non saprei dove collocarlo per provarlo, sempre che sia il comando corretto)

2) Excel effettua il riconoscimento decimale con il punto anzichè la virgola. In tal modo il numero 14200 lo importa come 14,2. Si può modificare ?

Grazie mille
volenteroso
Utente Junior
 
Post: 10
Iscritto il: 10/10/15 18:44

Re: Aiuto su creazione macro

Postdi Anthony47 » 14/10/15 23:42

Ho inserito nel vba del file pubblicato la compilazione condizionale che dovrebbe servire per gestire le differenze tra office 64bit e 32bit, anche se non ho potuto collaudare le variazioni.

Per scelta, le mie automazioni con IE su questo forum visualizzano la finestra IE per consentire all'utente di gestire situazioni di errore che altrimenti dovrebbe gestire il codice.
Quanto alla situazione dei dati numerici importati come decimali: il sito mette a disposizione delle stringhe, quindi in effetti come stringhe devono essere importate; questo si ottiene formattando i fogli come Testo, modificando la macro con questa istruzione aggiuntiva:
Codice: Seleziona tutto
    If ActiveSheet.Name <> myIsin Then
        ThisWorkbook.Worksheets.Add after:=Worksheets(Worksheets.Count)
        ActiveSheet.Name = myIsin
        Cells.NumberFormat = "@"        '<<< AGGIUNGERE questa
    End If
Il file on line e' ora aggiornato.

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

Re: Aiuto su creazione macro

Postdi volenteroso » 15/10/15 08:18

La conversione in 64bit non porta problemi. Ieri sera il foglio mi ha importati i dati. Oggi mi appare questo errore:

Errore di compilazione: Tipo non corrispondente per l'argomento ByRef

e nel VB mi viene evidenziato questo:

Function IEAvailable() As Boolean
Dim IEStat As Long
IEAvailable = (InternetGetConnectedState(IEStat, 0&) <> 0)
End Function
volenteroso
Utente Junior
 
Post: 10
Iscritto il: 10/10/15 18:44

Re: Aiuto su creazione macro

Postdi Anthony47 » 15/10/15 14:23

Mah, non avendo la possibilita' di provare su una versione Office 64 bit vado a tentoni...
Supponendo che stai usando la versione che, in testa al modulo Anthon2 include le istruzioni di compilazione condizionale #If VBA7 And Win64 Then /#Else /#End If allora aggiungiamo anche la compilazione condizionale nella Function IEAvailable:
Codice: Seleziona tutto
Function IEAvailable() As Boolean
#If VBA7 And Win64 Then
    Dim IEStat As LongPtr
#Else
    Dim IEStat As Long
#End If
    IEAvailable = (InternetGetConnectedState(IEStat, 0&) <> 0)
End Function

Il file pubblicato e' ora aggiornato in questo modo.
Quando ti da l'errore c'e' qualche parte del codice che risulta evidenziata? Eventualmente allega uno screenshot col codice e il messaggio di errore.

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

Re: Aiuto su creazione macro

Postdi volenteroso » 15/10/15 18:17

Con l'aggiunta di LongPtr è ok :) Grazie

Ora, quando excel importa i dati apre il foglio e si collega alla pagina web e ci mette un sacco di tempo per prelevare i dati. C'è modo di velocizzarlo?
volenteroso
Utente Junior
 
Post: 10
Iscritto il: 10/10/15 18:44

Re: Aiuto su creazione macro

Postdi volenteroso » 15/10/15 18:52

per intenderci, posto dei codici isin:

IT0012535941
IT0012535925
IT0012514441
IT0012514425
IT0012514409
IT0012514383
IT0012514367
IT0012514342
IT0012514326
IT0012514300
IT0012514169
IT0012514185
IT0012514201
IT0012514227
IT0012514243
IT0012514268
IT0012514284
IT0012546120
IT0012603376
volenteroso
Utente Junior
 
Post: 10
Iscritto il: 10/10/15 18:44

Re: Aiuto su creazione macro

Postdi Anthony47 » 15/10/15 23:56

Ho inserito ScreenUpdating =False /True per evitare di visualizzare il caricamento dei fogli di dettaglio, e il tempo di esecuzione e' sceso a circa 1.5 sec per codice.
Vedro', per mia curiosita', di adattare un codice che lavora con la libreria WinHTTP, dovrebbe essere piu' veloce ancora, ma non garantisco se e quando questa versione sara' pubblicata.

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

Re: Aiuto su creazione macro

Postdi volenteroso » 16/10/15 06:26

Sei gentilissimo. Grazie per l'aiuto.

Paolo
volenteroso
Utente Junior
 
Post: 10
Iscritto il: 10/10/15 18:44

Re: Aiuto su creazione macro

Postdi volenteroso » 19/10/15 16:28

Posso chiederti una variazione del codice? Qualora volessi che il file nominasse i vari fogli pescando i nomi da un elenco anzichè nominarli con il codice isin, si potrebbe fare giusto?

Mi spiego meglio.

Attualmente ho nel foglio Lista: Elenco Codici e Status. Prima di Elenco Codici, inseriamo una colonna i cui dati sono 1,2,3,4,5.... cioè una numerazione progressiva dei codici (che restano sempre i dati che modificano l'indirizzo web) che saranno i nomi dei vari fogli corrispondenti al codice isin della stessa riga.

Grazie
volenteroso
Utente Junior
 
Post: 10
Iscritto il: 10/10/15 18:44

Re: Aiuto su creazione macro

Postdi Anthony47 » 20/10/15 23:57

Non hai bisogno di cambiare il layout della tabella, basta usare il numero di riga per nominare il foglio; va modificata la parte dove si prova a selezionare il foglio target, e se non e' presente si crea un foglio e lo si rinomina.
La parte interessata e' quella successiva a If SkipCod Then GoTo SkipI, fino a ActiveSheet.Cells.ClearContents
Tieni presente che il numero di riga e' resente nella variabile I di tipo numerica Long; poiche' per selezionare il foglio va usato la "stringa" del "nome" (non l'index, numerico) dovrai usare I & ""; es
Codice: Seleziona tutto
    Sheets(I & "").Select

Con un po di buona volonta' e di pratica non sara' complicato.

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


Torna a Applicazioni Office Windows


Topic correlati a "Aiuto su creazione macro":


Chi c’è in linea

Visitano il forum: Ricky0185 e 45 ospiti