Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Storicizzazione

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

Storicizzazione

Postdi Gollum999 » 07/12/09 21:24

Gent.mo Pc Facile

Ho la necessita di storicizzare dei dati non appena questi cambiano.

Per questo ho creato il seguente programma:

Private Sub Worksheet_Change (ByVal Target As Range)
If Target.Address = "$C$22" Then Exit Sub
'Application.ScrennUpdating = True '<<<Scommentare per evitare flickering
Source = "$C$22:$K$22"

Range(Source).Copy
Range("C1048500").End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False

End Sub

Premetto che di vba e di macro ne so poco: questo programma è frutto dell' insieme di altri programmi del vostro sito.

Il problema è che questa macro mi storicizza i dati a 100 alla volta: come cambia la cella $C$22 lui mi copia le cella Source per 100 VOLTE!
Come posso fare?
Un' altro piccolo problema è che se clicco su una cella piena e guardo sulla barra della formula vedo il contenuto della cella che "vibra".

Grazie ancora per l' aiuto e un saluto a tutti!

Gollum999

P.S. a cosa serve questa istruzione? 'Application.ScrennUpdating = True '<<<Scommentare per evitare flickering
(immagino che abbia a che fare con l' aggiornamento dello schemo ma non ho riscontrato differenze)
Gollum999
Utente Junior
 
Post: 24
Iscritto il: 24/10/09 13:08

Sponsor
 

Re: Storicizzazione

Postdi pietrol » 07/12/09 22:46

Ciao Gollum999
proverei modificando così:

Codice: Seleziona tutto
Sub Worksheet_Change(ByVal Target As Range)
Static bModif As Boolean                         '= True se sono già in fase di copia dati
Set Cella = Intersect(Range("C22:K22"), Target)  'controllo l'ind. della cella modificata
If Cella Is Nothing Then Exit Sub                'se la cella è fuori dal range esco
If Target.Address = "$C$22" Then Exit Sub        'altro controllo
If bModif = True Then Exit Sub                   'se sono già in fase copia dati esco
bModif = True                                    'altrimenti entro in fase copia dati
Application.ScreenUpdating = False               'blocco lo schermo
Range("C22:K22").Copy
Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select    'copio e incollo
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Application.ScreenUpdating = True                'sblocco lo schermo
bModif = False                                   'non sono più in fase copia dati
End Sub

Il codice
Codice: Seleziona tutto
Application.ScreenUpdating = True

serve a riattivare l'aggiornamento dello schermo, che prima però deve essere disattivato con
Codice: Seleziona tutto
Application.ScreenUpdating = False


I problemi segnalati ti derivano dal fatto che la copia tramite VBA delle celle scatena a sua volta un evento Change del foglio e così ricorsivamente per 100 volte, credo si fermi solo perchè 100 è l'impostazione standard del parametro che controlla il numero massimo di iterazioni nei calcoli.
Inserendo una variabile come bModif puoi impedisce queste iterazioni ed avere la copia una sola volta.

Fai sapere

ciao
pietrol
il lupo ululà, il castello ululì
pietrol
Utente Senior
 
Post: 270
Iscritto il: 07/01/09 14:34

Re: Storicizzazione

Postdi Gollum999 » 09/12/09 20:14

Gent.mo Pc Facile

Grazie Pietro per il programma!
Sei riuscito a risolvere il problema che mi copiava le celle per 100 volte!
Ho apportato una modifica: ho disattivato queste 2 istruzioni che mi bloccavano la storicizzazione:

'Set Cella = Intersect(Range("C20:K20"), Target) 'controllo l'ind. della cella modficata
'If Cella Is Nothing Then Exit Sub ' 'se la cella è fuori dal range esco

Lo scopo di queste 2 istruzioni era di uscire dalla sub se nelle celle C20:K20 non c'era niente?

Ho notato anche altri 2 effetti collaterali:
1)se scrivo in excell in una cella dove non c'è niente e che non dovrebbe avere a che fare con il programma (esempio A1)e poi faccio invio il programma di storicizzazione mi fa una copia dell' ultima riga storicizzata.
2)Excell mi storicizza anche se $C$20 non cambia! Mentre io vorrei che mi storicizzasse solo se $C$20 cambia.

Per favore mi potete aiutare?


Sub Worksheet_Change(ByVal Target As Range)
Static bModif As Boolean '=True se sono già in fase di copia dati
'Set Cella = Intersect(Range("C20:K20"), Target) 'controllo l'ind. della cella modficata
'If Cella Is Nothing Then Exit Sub ' 'se la cella è fuori dal range esco
If Target.Address = "$c$20" Then Exit Sub 'altro controllo
If bModif = True Then Exit Sub 'se sono già in fase copia dati esco
bModif = True 'altrimenti entro in fase copia dati
Application.ScreenUpdating = False 'blocco lo schermo
Range("C20:k20").Copy
Range("C1048500").End(xlUp).Offset(1, 0).Select 'copio e incollo
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Application.ScreenUpdating = True 'sblocco lo schermo
bModif = False 'non sono più in fase copia dati



End Sub


Grazie per l' aiuto!

Gollum999
Gollum999
Utente Junior
 
Post: 24
Iscritto il: 24/10/09 13:08

Re: Storicizzazione

Postdi pietrol » 09/12/09 21:34

Ciao Gollum999
Lo scopo di queste 2 istruzioni era di uscire dalla sub se nelle celle C20:K20 non c'era niente?

le istruzioni erano proprio quelle che impediscono di eseguire la macro se la cella modificata non è quella desiderata, commentandole come hai notato la macro viene eseguita sempre.

La soluzione è togliere il commento e modificarle così:
Codice: Seleziona tutto
Set Cella = Intersect(Range("C20"), Target)  'controllo l'ind. della cella modificata
If Cella Is Nothing Then Exit Sub                'se la cella è fuori dal range esco

la macro agirà solo in caso di modifica di C20

Non ho capito però come faceva a funzionare prima, la riga
If Target.Address = "$C$22" Then Exit Sub
che comunque ora è superflua e puoi cancellare,
dovrebbe impedire l'esecuzione proprio se modifichi quella cella e permetterla in tutti gli altri casi.

Fai sapere

ciao
pietrol
il lupo ululà, il castello ululì
pietrol
Utente Senior
 
Post: 270
Iscritto il: 07/01/09 14:34

Re: Storicizzazione

Postdi Gollum999 » 10/12/09 22:54

Gent.mo pc-facile e Gent.mo Pietro

Ho modificato il codice come mi hai detto e piu precisamente:

Sub Worksheet_Change(ByVal Target As Range)
Static bModif As Boolean '=True se sono già in fase di copia dati
Set Cella = Intersect(Range("C20"), Target) 'controllo l'ind. della cella modficata
If Cella Is Nothing Then Exit Sub 'se la cella è fuori dal range esco
'If Target.Address = "$c$20" Then Exit Sub 'altro controllo
If bModif = True Then Exit Sub 'se sono già in fase copia dati esco
bModif = True 'altrimenti entro in fase copia dati
Application.ScreenUpdating = False 'blocco lo schermo
Range("C20:k20").Copy
Range("C1048500").End(xlUp).Offset(1, 0).Select 'copio e incollo
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Application.ScreenUpdating = True 'sblocco lo schermo
bModif = False 'non sono più in fase copia dati


End Sub

Però così facendo non mi storicizza più: non fa proprio niente.
Penso che dipenda da queste 2 istruzioni:
Set Cella = Intersect(Range("C20"), Target) 'controllo l'ind. della cella modficata
If Cella Is Nothing Then Exit Sub 'se la cella è fuori dal range esco

P.S.da profano avevo interpretato la seguente istruzione
If Target.Address = "$c$20" Then Exit Sub 'altro controllo
Come: se la cella c20 non viene cambiata allora esci dalla sub

Se per favore mi potete aiutare!

Grazie a tutti!

Gollum999
Gollum999
Utente Junior
 
Post: 24
Iscritto il: 24/10/09 13:08

Re: Storicizzazione

Postdi Anthony47 » 11/12/09 09:19

Per rispondere con precisione dovresti dirci:
-quali dati vuoi storicizzare
-dove vuoi storicizzarli
-in quale circostanza vuoi storicizzarli

Alcune di queste informazioni possono essere probabilisticamente dedotte dalle macro che hai scritto, ma vorrei avere la certezza dei termini del problema.

Ciao.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Storicizzazione

Postdi Gollum999 » 11/12/09 19:54

Gent.mo Pc facile.

Mi piacerebbe storicizzare i dati dei titoli della borsa che vedo su yahoo.

Es: ultimo scambio, orario, variazione ecc.

Mi piacerebbe storicizzarli su Microsoft excell 2007 e solo quando cambia l' orario: cioè ogni minuto (se l' orario dovesse rimanere lo stesso per più di 1 min non voglio storicizzarli).

Ringrazio ancora per l' aiuto che mi avete dato.

Cordiali saluti.

Gollum999
Gollum999
Utente Junior
 
Post: 24
Iscritto il: 24/10/09 13:08

Re: Storicizzazione

Postdi Anthony47 » 12/12/09 01:02

Quello che descrivi sono richieste funzionali, ma il forum puo' dare aiuto su questioni specifiche non fornire soluzioni chiavi in mano.
Da quanto avevi scritto nei post precedenti sembra pero' che tu abbia gia' fatto molto, ad esempio la/le query web per scaricare i dati dal sito, e immagino anche un rischeduling "OnTime" per rieseguire la/le query ogni tot minuti.
A questo punto, in coda alle istruzioni per il rescheduling della/le query devi inserire il controllo che il nuovo prezzo sia cambiato e se SI procedere all' archiviazione.
Per verificare se il dato e' cambiato, confronti il dato ottenuto dall' ultima query con il dato storicizzato in ultima posizione.
Ottieni l' ultimo dato storicizzato con una istruzione del tipo
LastHist=Sheets("Storico").cells(Rows.count,3).End(Xlup).Value
Questa guarda dove e' l' ultimo dato di col C (indice di colonna 3, nell' istruzione CELLS) e lo mette nella variabile LastHist.
Punti alla prima posizione libera con una istruzione del tipo
Sheets("Storico").cells(Rows.count,3).End(Xlup).Offset(1,0) ' tarata su Col C
Ad esempio
Codice: Seleziona tutto
Range(Source).Copy
Sheets("Storico").cells(Rows.count,3).End(Xlup).Offset(1,0).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
(sono blocchi di istruzioni presi da quanto hai pubblicato).

Non avendo descritto come sono i tuoi dati di partenza e dove storicizzarli, quanto detto sopra e' meramente di esempio.

Se non usi le query web per estrarre i dati da yahoo ovviamente la maggior parte di quanto detto e' inutile, ma questo fa parte delle informazioni che dovresti fornire per avere un aiuto attinente e non solo un portafortuna...

Ciao.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Storicizzazione":


Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti

cron