Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Dalla una tabella a 5 sec ragrupparla ad una di 1 min

Ultimo Aggiornamento: 17/08/2018 19:33
Post: 36
Registrato il: 08/06/2010
Città: MILANO
Età: 28
Utente Junior
excel 2007
OFFLINE
15/08/2018 14:51

Ciao a tutti, ho un problema di cui non riesco ad uscirne. Mi arrivano righe di dati a 5 sec colonne A-H (a volte queste stringhe mancano come quella relativa alle 09:49:10). Da 5 sec. vorrei raggrupparle a 1 min. Quindi dalle colonne A-H vorrei estrapolare una tabella con l'apertura/prezzo max/prezzo min/chiusura e somma dei volumi ad ogni minuto 09:49:00 e 09:50:00 ecc...
Come posso fare?
Grazie mille a chi mi può aiutare.
Buon Ferragosto a tutti.
Luca
[Modificato da venostait 15/08/2018 14:54]
Post: 588
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Senior
Excel2019
OFFLINE
15/08/2018 18:27

Ciao
Vorrei sbagliarmi ma come chiedi è impossibile risolvere.
I dati postati NON sono a cadenza di 5 secondi (alcuni orari saltano) e non è possibile scegliere come condizione il minuto intero (alcuni minuti interi mancano).
Ora, poichè ogni minuto vengono scaricati 12 valori, prova con questa macro:
Sub perMinuto()
Dim ur As Long, i As Long, j As Long
ur = Cells(Rows.Count, 1).End(xlUp).Row
j = 1
For i = 2 To ur Step 11
  j = j + 1
  Range("A" & i & ":F" & i).Copy
  Range("J" & j & ":O" & j).PasteSpecial (xlPasteValues)
Next i
End Sub

Non è il massimo ma almeno hai un certo raggruppamento.
Fai sapere. Ciao,
Mario
Post: 3.651
Registrato il: 28/06/2011
Città: AGORDO
Età: 70
Utente Master
2013
OFFLINE
15/08/2018 23:09

Un saluto a Marius44
Non ho capito bene il significato della parola "raggrupparle"
Forse intendi dire "come Tua tabella" che dalla riga2 alla riga7 (orario=08:49) debba trovare il MASSIMO riguardo "High", il MINIMO per "Low" e la SOMMA per "Volume"? Però non hai specificato cosa per Open e Close.
Sub Minuto()
Dim Ur As Long, X As Long, Y As Long, W As Long, Ni As Long, Nf As Long
Dim Iniz As Date, Nuova As Date, Fine As Date
Ur = Cells(Rows.Count, 10).End(xlUp).Row
If Ur > 1 Then Range("J2:O" & Ur).Clear
Ur = Cells(Rows.Count, 1).End(xlUp).Row
Y = 2
For X = 2 To Ur
    Iniz = Format(Cells(X, 1), "hh:nn")
    If Iniz <> Nuova Then
        Range("A" & X & ":F" & X).Copy
        Range("J" & Y).PasteSpecial '(xlPasteValues)
        Nuova = Iniz
    Else
        Ni = X - 1
        Fine = Iniz + "00:01:00"
        Fine = Int(Cells(X, 1)) + Fine
        For W = X To Ur
            If Cells(W, 1) < Fine Then Nf = Nf + 1 Else Exit For
        Next W
        'Cells(Y, 11) = WorksheetFunction.???(Range(Cells(Ni, 2), Cells(Ni + Nf, 2)))
        Cells(Y, 12) = WorksheetFunction.Max(Range(Cells(Ni, 3), Cells(Ni + Nf, 3)))
        Cells(Y, 13) = WorksheetFunction.Min(Range(Cells(Ni, 4), Cells(Ni + Nf, 4)))
        'Cells(Y, 14) = WorksheetFunction.???(Range(Cells(Ni, 5), Cells(Ni + Nf, 5)))
        Cells(Y, 15) = WorksheetFunction.Sum(Range(Cells(Ni, 6), Cells(Ni + Nf, 6)))
        X = Ni + Nf
        Y = Y + 1
        Ni = 0
        Nf = 0
    End If
Next X
MsgBox "Fatto"
End Sub
[Modificato da raffaele1953 15/08/2018 23:13]
Excel 2013
Post: 36
Registrato il: 08/06/2010
Città: MILANO
Età: 28
Utente Junior
excel 2007
OFFLINE
15/08/2018 23:46

Grazie mille Marius44 e Raffaele1953 per avermi risposto siete molto gentili, e se mi potete allegare il file mi aiutate ancor di più.
Dalla tabella A1/H380 devo estrapolare i seguenti valori per ogni singolo minuto. Ad esempio prendiamo il minuto 9:51:00 quindi le righe che vanno dalla 18 alla 29 e per il minuto 9:51:00 dovrei ottenere la stringa J4/O4.
Allego file.
Grazie ancora a chi mi può aiutare.
Luca
Post: 589
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Senior
Excel2019
OFFLINE
16/08/2018 09:15

Ciao
Vedi se va bene così.
La macro è una sintesi fra la mia e quella di Raffaele53 (che saluto)

Ciao,
Mario
Post: 37
Registrato il: 08/06/2010
Città: MILANO
Età: 28
Utente Junior
excel 2007
OFFLINE
16/08/2018 10:11

Grazie Mario, ci si avvicina.
Nel minuto 9:49 devo estrapolare i valori delle righe che vanno dalle 9:49:00 alle 9:49:59. Es. 9:49 comprendono le celle A2/H7, 9:50 comprendono le celle A8/H17 e così via.
Per Open cerco il primo valore del minuto della colonna B es. 9:49 lo trovo nella cella B2.
Per High devo trovare il max del minuto colonna C, es. minuto 9:49 il max tra le celle C2/C7.
Per Low devo trovare il minimo del minuto colonna D, sempre minuto 9:49 il minimo tra le celle D2/D7.
Per Close devo trovare l'ultimo valore del minuto della colonna E, sempre minuto 9:49 trovo nella riga 7 9:49:45, la successiva riga 8 abbiamo 9:50:05 che farà parte del minuto 9:50.
Per Volume devo fare la somma dei volumi del minuto colonna F, per 9:49 somma delle celle F2/F7.
Allego file che mi hai fatto e sotto ho messo i calcoli manuali di come vorrei.
Il tutto che fosse automatico senza dover avviare manualmente la macro. Le celle delle colonne A-H mi arrivano automaticamente in tempo reale dalle 8:00 alle 22:00
Grazie mille
Luca
[Modificato da venostait 16/08/2018 10:28]
Post: 590
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Senior
Excel2019
OFFLINE
16/08/2018 12:47

Ciao
Cerchiamo di intenderci circa il significato che diamo alle parole!
Quando dici "devo estrapolare" cosa intendi?
Io immagino che tu voglia i valori di una riga, non altro!
Tu continui parlando di "intervallo".
Ma allora cosa vuoi? Una media? Ovvero cosa?
Prova ad indicare "sul foglio" come dovrebbero essere questi benedetti dati.

Ciao,
Mario
Post: 38
Registrato il: 08/06/2010
Città: MILANO
Età: 28
Utente Junior
excel 2007
OFFLINE
16/08/2018 13:28

Scusa per i termini sicuramente non appropriati. E' una tabella con l'andamento di un titolo azionario. Ho messo una piccola parte della tabella che a fine giornata arriva a circa 10.000 righe.
Le celle A2/F2 mi indica:
Colonna A l'orario che va dalle 9:49:00 alle 9:49:05. In questo lasco di tempo la colonna B mi dice che l'azione il primo prezzo è stato di 12978. La colonna C mi dice che in questo lasco di tempo il prezzo massimo è stato di 12979. La colonna D il prezzo più basso è stato 12978. La colonna E è l'ultimo prezzo registrato sempre dalle 9:49:00 alle 9:49:05 che è stato 12979. La colonna F mi dice quante azioni sono state scambiate in questo periodo di tempo.
Di queste righe vorrei avere non più ogni 5 sec ma righe ogni minuto di:
in ogni minuto il primo prezzo scambiato, il prezzo più alto e quello più basso. Il prezzo ultimo scambiato e quante azioni sono state scambiate.
Allego il file con la tabella che cerco J13/O20 fatto manualmente.
Post: 3.652
Registrato il: 28/06/2011
Città: AGORDO
Età: 70
Utente Master
2013
OFFLINE
16/08/2018 13:31

Il VBA, faceva già quanto hai richiesto. Bastava modificare le due righe Verdi. Allego il files

>>>Il tutto che fosse automatico senza dover avviare manualmente la macro.
>>>mi arrivano automaticamente in tempo reale dalle 8:00 alle 22:00
Non basta dire che arrivano, devi spiegare "come" Ti arrivano.
Per fare quello avrei bisogno di vedere il Codice che scrive ogni Tot secondi, oppure capire quale connessioni Dati hai?
Ps. Il VBA andrà cambiato complettamente.
Excel 2013
Post: 39
Registrato il: 08/06/2010
Città: MILANO
Età: 28
Utente Junior
excel 2007
OFFLINE
16/08/2018 13:44

Mi arrivano dati in dde e tramite questo codice si compongono le celle della colonna A/H.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim riga As Integer
Set Rng = Range("P7:P12")
If Not Intersect(Target, Rng) Is Nothing Then
If IsDate(Target.value) Then
RRiga = Target.row
Select Case RRiga
Case 7
Set area = Range(Cells(7, 16), Cells(7, 23))
riga = 5
With Sheets("Foglio1")
While .Cells(riga, 1).value <> ""
riga = riga + 1
Wend
End With
Sh = "Foglio1"
Case 8
Set area = Range(Cells(8, 16), Cells(8, 23))
riga = 5
With Sheets("Foglio2")
While .Cells(riga, 1).value <> ""
riga = riga + 1
Wend
End With
Sh = "Foglio2"
Case 9
Set area = Range(Cells(9, 16), Cells(9, 23))
riga = 5
With Sheets("Foglio3")
While .Cells(riga, 1).value <> ""
riga = riga + 1
Wend
End With
Sh = "Foglio3"
Case 10
Set area = Range(Cells(10, 16), Cells(10, 23))
riga = 5
With Sheets("Foglio4")
While .Cells(riga, 1).value <> ""
riga = riga + 1
Wend
End With
Sh = "Foglio4"
Case 11
Set area = Range(Cells(11, 16), Cells(11, 23))
riga = 5
With Sheets("Foglio5")
While .Cells(riga, 1).value <> ""
riga = riga + 1
Wend
End With
Sh = "Foglio5"
Case 7
Set area = Range(Cells(12, 16), Cells(12, 23))
riga = 5
With Sheets("Foglio6")
While .Cells(riga, 1).value <> ""
riga = riga + 1
Wend
End With
Sh = "Foglio6"
End Select
area.Copy Destination:=Sheets(Sh).Cells(riga, 1)
Set area = Nothing
End If
End If
End Sub
Post: 40
Registrato il: 08/06/2010
Città: MILANO
Età: 28
Utente Junior
excel 2007
OFFLINE
16/08/2018 13:55

Oggi non risco a testare quello che mi ha inviato proverò domani.
Molto gentile e grazie
Luca
Post: 591
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Senior
Excel2019
OFFLINE
16/08/2018 15:22

Ciao
spero di aver capito bene. Ecco la macro (allego il file)
Option Explicit

Sub perMinuto()
Dim ur As Long, i As Long, k As Long, j As Long, iniz As Date
ur = Cells(Rows.Count, 10).End(xlUp).Row
If ur > 1 Then Range("J2:O" & ur).ClearContents
ur = Cells(Rows.Count, 1).End(xlUp).Row
j = 1
For i = 2 To ur
  iniz = Format(Cells(i, 1), "hh:mm")
  For k = i + 1 To ur
    If Format(Cells(k, 1), "hh:mm") = iniz + "00:01:00" Then
      j = j + 1
      Cells(j, 10) = iniz
      Cells(j, 11) = Cells(i, 2).Value
      Cells(j, 12) = Application.WorksheetFunction.Max(Range(Cells(i, 3), Cells(k - 1, 3)))
      Cells(j, 13) = Application.WorksheetFunction.Min(Range(Cells(i, 4), Cells(k - 1, 4)))
      Cells(j, 14) = Cells(k, 5).Value
      Cells(j, 15) = Application.WorksheetFunction.Sum(Range(Cells(i, 6), Cells(k - 1, 6)))
      i = k - 1
      Exit For
    End If
  Next k
Next i
Cells(1, 10).Select
End Sub


Fai sapere. Ciao,
Mario
Post: 41
Registrato il: 08/06/2010
Città: MILANO
Età: 28
Utente Junior
excel 2007
OFFLINE
16/08/2018 16:21

Mi sembra bene lo proverò domani. Io ho messo solo una parte della giornata dalle 9:49:00 alle 10:24:05 per non appesantire il file. Però alle 10:24:10 si copilerà la riga A381/H381, poi alle 10:24:15 la riga A382/H382 e così via fino alle 22:00:00 in automatico. Quindi anche le colonne J2/O... se possibile vorrei che si aggiornino automaticamente ogni minuto. E' possibile?
Grazie mille Mario, Raffaele e a tutti che ci aiutate in cose a noi inesperti di dificilissima soluzione.
Grazie
Luca
Post: 592
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Senior
Excel2019
OFFLINE
16/08/2018 19:32

Ciao
se, come credo, la macro che ti ho impostato per quell'esempio va bene, stai tranquillo che andrà bene anche con 100mila righe (tutto al più impiegherà più tempo).

Ciao,
Mario
Post: 3.653
Registrato il: 28/06/2011
Città: AGORDO
Età: 70
Utente Master
2013
OFFLINE
16/08/2018 20:00

Di norma, sarebbe doveroso leggere il primo post in alto. Per capire come allegare files e per publicare codice. http://www.freeforumzone.com/d/11202105/-COLORE-BLUE-FONT-BOLD-ATTENZIONE-SCARICARE-o-INSERIRE-un-FILE-ed-ALTRO-VEDI-QUI-/discussione.aspx

Quel Worksheet_Change, non fà nulla (tranne d'intervenire quando in P7:P12, variano i dati). Ci deve essere dell'altro CODICE, una Connessione_Dati che non vedo, oppure in P7:P12 ci sono formule "strambe a me", per esempio tipo =IWDDE|STOCK_PRICE!'2371129?bestBidPrice'
Inoltre le variabili RRiga, Sh indicano che esiste dell'altro CODICE Public (allega il files originale, con i sei fogli, casomai vuoto di dati e dimmi come variano le scritte in P7:P12 ogni 5 secondi)

Non conosco bene il DDE, sò che le "query web di excel" fanno aggiornamenti (ogni ToT secondi)
Se ci sono formule strambe in P7:P12, potrei far intervenire il Worksheet_Change ad ogni minuto.
Il tutto in via teorica, dato che non conosco ancora come funziona il Tuo aggionamento dati.
[Modificato da raffaele1953 16/08/2018 20:01]
Excel 2013
Post: 42
Registrato il: 08/06/2010
Città: MILANO
Età: 28
Utente Junior
excel 2007
OFFLINE
16/08/2018 20:40

Hai ragione. Allego il file che uso. Per prima cosa connetto il file dalla pagina General con il pulsante Connect to TWS. Poi passo alla pagina Real Time Bars seleziono l'azione cella A8 e premo il pulsante RequestRealTimeBars. A questo punto ogni 5 sec cambiano le celle P8/W8 e queste vengono scritte sul foglio2 di cui ho girato il file. Se dal file di Mario si aggiorna automaticamente è quello che cerco.
Grazie
Post: 3.656
Registrato il: 28/06/2011
Città: AGORDO
Età: 70
Utente Master
2013
OFFLINE
16/08/2018 21:13

Mi spiace, visto l'allegato mi arrendo (pensavo ad una cosa molto più semplice).
Mi piacerebbe che Tu lo aprissi in altro PC, per verificare il tutto e pure dove trovare quel Worksheet_Change.
Ps. Comunque a me non funziona per via delle "librerie non caricate nel PC, anche sulle Userform. Figurati capire "I Moduli di Classe"
[Modificato da raffaele1953 17/08/2018 07:31]
Excel 2013
Post: 43
Registrato il: 08/06/2010
Città: MILANO
Età: 28
Utente Junior
excel 2007
OFFLINE
17/08/2018 08:56

Ho testato per alcuni minuti la macro e funziona bene. L'unica cosa è il Close che sarebbe da sistemare ed è l'ultima stringa del minuto della colonna E, esempio: per il minuto 08:06 che sono le celle A2/F8 il Close è dato dalla cella E8, ho colorato per ogni minuto la cella di rifernimento.
J2/O9 è dato dalla macro
J13/O20 l'ho fatto manualmente
J25/O33 sono le differenze.
La macro l'ho provata a farla girare sul Foglio2 ma non riesco perchè mi da un errore di run-time'13' premo il tasto Deburg mi esce la riga evidenziata "iniz = Format(Cells(i, 1), "hh:mm")" se sistemo questo non serve il Foglio1.
Per l'automatico c'è un codice che faccia partire la macro ogni minuto oppure ad ogni nuova stringa A/F?
Ancora grazie mille
Post: 594
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Senior
Excel2019
OFFLINE
17/08/2018 09:39

Ciao
Una mia svista.
Questa riga di codice: Cells(j, 14) = Cells(k, 5).value
deve diventare così

Cells(j, 14) = Cells(k - 1, 5).value



Ciao,
Mario
Post: 44
Registrato il: 08/06/2010
Città: MILANO
Età: 28
Utente Junior
excel 2007
OFFLINE
17/08/2018 09:53

Ottimo funziona benissimo. Adesso per far partire in automatico ogni minuto la macro è fattibile?
Post: 595
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Senior
Excel2019
OFFLINE
17/08/2018 12:24

Ciao
Qualcosa devi pur fartela da solo [SM=x423038]

Prova a dare uno sguardo a questo indirizzo:
http://www.freeforumzone.com/discussione.aspx?idd=10977857

Ciao,
Mario
Post: 45
Registrato il: 08/06/2010
Città: MILANO
Età: 28
Utente Junior
excel 2007
OFFLINE
17/08/2018 12:37

Ok ci provo. Grazie mille Mario a Raffaele e a tutti che ci aiutate in questo mondo difficile di excel. Grazie Grazie [SM=x423047] [SM=x423047]
Post: 46
Registrato il: 08/06/2010
Città: MILANO
Età: 28
Utente Junior
excel 2007
OFFLINE
17/08/2018 15:29

Non sono riuscito a far ripetere la macro dal link che mi hai girato ma navigando ho tovato questo

Application.OnTime Now + TimeValue("00:01:00"), "perMinuto"
End Sub
Sub ripeti()
Application.OnTime Now + TimeValue("00:01:00"), "perMinuto"
End Sub

e sembra che funzioni.
Grazie mille
Luca
Post: 47
Registrato il: 08/06/2010
Città: MILANO
Età: 28
Utente Junior
excel 2007
OFFLINE
17/08/2018 15:31

Non chiedermi come funziona che di codici in excel non ne capisco nulla [SM=x423052]
Post: 596
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Senior
Excel2019
OFFLINE
17/08/2018 15:39

Ciao
Vista la tua giovanissima età mi sembra giunto il momento d'imparare.

Ciao e buon lavoro,
Mario
Post: 3.657
Registrato il: 28/06/2011
Città: AGORDO
Età: 70
Utente Master
2013
OFFLINE
17/08/2018 19:33

>>>Il problema non è in Application.OnTime Now + TimeValue("00:01:00"), "perMinuto"

Hai detto che esiste un "Worksheet_Change", mi sai dire dovè?
In base a questo faccio partire la macro ogni "minuto"
Mà non mi piace il tutto, nelle conseguenze
Excel 2013
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 05:35. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com