Risultati da 1 a 13 di 13

Discussione: Filtraggio dati isolati



  1. #1
    L'avatar di Sixxer
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Italia
    Messaggi
    6
    Versione Office
    Office 2016
    Likes ricevuti
    0
    Likes dati
    1

    Filtraggio dati isolati

    Buonasera a tutti, sono un novizio di Excel ed è la prima volta che scrivo su questo forum. Voglio porvi un problema a cui non riesco a trovare soluzione, che però è concettualmente molto semplice. Probabilmente troppo semplice per non esser già stato ampiamente discusso...in quel caso mi scuso!

    In sostanza ho bisogno di filtrare una colonna di dati non sulla base del loro valore, ma sulla loro posizione.
    Ho una serie molto lunga di valori composta da molti zeri e molti numeri positivi; voglio creare una seconda serie (lunga quanto la prima) tale che:
    - gli zeri della prima rimangano zeri nella seconda;
    - i numeri diversi da zero vengano conservati a patto che non siano troppo isolati e circondati dagli zeri, nel qual caso devono esser posti a zero. Più precisamente, richiedo che possano persistere nella seconda serie solo gruppi di numeri diversi da zero grandi almeno un coefficiente "h".

    Vi faccio un esempio.

    Questa è la prima serie:
    0, 0, 1, 0, 1, 1, 2, 3, 0, 3, 3, 0, 1, 0

    Ammettendo gruppi di almeno h=2, voglio:
    0, 0, 0, 0, 1, 1, 2, 3, 0, 3, 3, 0, 0, 0

    Ammettendo gruppi di almeno h=3, voglio:
    0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0

    Spero di essere stato chiaro. Sono riuscito ad ottenere il risultato annidando istruzioni "se", ma ciò non mi ha permesso di poter giocare a piacimento col coefficiente h. Inoltre, per h grandi l'istruzione diventa molto complessa.

    Vi ringrazio in anticipo!!

  2. #2

    L'avatar di ges
    Clicca e Apri
    Data Registrazione
    Jun 2015
    Località
    Como
    Età
    53
    Messaggi
    7166
    Versione Office
    2011MAC 2016WIN
    Likes ricevuti
    2065
    Likes dati
    1305
    Ciao Sixxer,
    andrebbe chiarito questo concetto "i numeri diversi da zero vengano conservati a patto che non siano troppo isolati e circondati dagli zeri" in termini pratici che significa?
    Parli poi di un coefficiente "h", puoi specificare meglio?
    Inoltre, perchè non alleghi un file come esempio?
    Quando si scartano tutte le ipotesi possibili, quella che resta, anche se può sembrare improbabile, non può che essere quella giusta!

  3. #3
    L'avatar di Sixxer
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Italia
    Messaggi
    6
    Versione Office
    Office 2016
    Likes ricevuti
    0
    Likes dati
    1
    Intanto ti ringrazio per la risposta!
    Speravo che l'esempio fosse abbastanza esauriente, ma cercherò di spiegarlo meglio in termini pratici.

    Ho una fonte di energia termica in quantità variabile minuto per minuto, e voglio capire quando posso sfruttarla per la generazione di energia elettrica, utilizzando una turbina a vapore con alternatore. Qual è il punto? Non posso mettere in funzione la turbina quante volte voglio e come voglio, perché l'avviamento della stessa richiede qualche tempo. Se per esempio avessi a disposizione una grande potenza termica per una durata molto breve, quest'ultima risulterebbe di fatto inutilizzabile: infatti, la turbina non riuscirebbe ad entrare a regime prima dell'esaurimento della disponibilità.
    Se la potenza fosse invece costante per due o tre ore allora senza dubbio sarebbe sfruttabile.

    Per questo motivo ho bisogno di eliminare tutti i casi in cui la disponibilità sia troppo breve. Il coefficiente "h" potrebbe indicare il numero di minuti minimo perché sia economicamente conveniente accendere la turbina.

    Allego il file contenente la colonna di dati. Si vede come la disponibilità sia zero nella maggior parte del tempo, e come esistano alcune "isolette" di valori che risultano praticamente inutilizzabili (e che voglio quindi eliminare!).

    Grazie!
    File Allegati File Allegati

  4. #4

    L'avatar di ges
    Clicca e Apri
    Data Registrazione
    Jun 2015
    Località
    Como
    Età
    53
    Messaggi
    7166
    Versione Office
    2011MAC 2016WIN
    Likes ricevuti
    2065
    Likes dati
    1305
    Bene, ti ringrazio della spiegazione termodinamica, ma torniamo a excel.
    Allora abbiamo una colonna A in cui ci sono delle date (che sembra siano irrilevanti) diversamente abbiamo una colonna B in cui ci sono degli 0 e dei numeri positivi.
    Tu vorresti avere una terza colonna, che può essere C, in cui siano riportati tutti gli 0 della colonna B ma in quali casi (riferendoci a excel) devono essere riportati i numeri positivi invece che altri zeri?
    Dicevi prima "quando non troppo isolati"... in pratica se ci sono tre numeri positivi consecutivi? Quattro numeri positivi consecutivi?
    E' questo ultimo criterio - ripeto sempre riferito al foglio excel - che non mi è chiaro.
    Quando si scartano tutte le ipotesi possibili, quella che resta, anche se può sembrare improbabile, non può che essere quella giusta!

  5. #5
    L'avatar di Sixxer
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Italia
    Messaggi
    6
    Versione Office
    Office 2016
    Likes ricevuti
    0
    Likes dati
    1
    Ancora non so quanto valgono i minuti minimi per l'accensione! Per questo dico "h" generico! Mettiamo che h=3, per fare un esempio. Io nella colonna C vorrei vedere:
    - tutti gli zeri della colonna B;
    - i valori diversi da zero della colonna B, tranne quelli che si trovano isolati in gruppi di 2 o meno.

    Esempio.

    colonna B: 0 1 1 1 0 0 0 1 0 1 1 0
    colonna C: 0 1 1 1 0 0 0 0 0 0 0 0

    Come si vede, sono stati eliminati i numeri finali, in quanto gruppi rispettivamente di uno e due.

  6. #6
    L'avatar di Sixxer
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Italia
    Messaggi
    6
    Versione Office
    Office 2016
    Likes ricevuti
    0
    Likes dati
    1
    Ad esempio, questo algoritmo funziona per h=3 (da immettere nella cella C5):

    =SE(C4<>0;B5;SE(B6=0;0;SE(B7=0;0;B5)))

    La prima parte (C4 diverso da zero) sta a indicare che, se l'algoritmo ha preso per buono il valore della casella (B4) precedente, allora è giusto proseguire di conseguenza (se poi B5 è zero, pace).
    Ma io vorrei trovare un algoritmo che funzioni al variare di h!

    Grazie!

  7. #7
    L'avatar di rollis13
    Clicca e Apri
    Data Registrazione
    Nov 2015
    Località
    Cordenons
    Messaggi
    821
    Versione Office
    2016 64bit
    Likes ricevuti
    149
    Likes dati
    55
    Se vuoi tentare il filtro con una macro puoi mettere questa nel modulo vbe del foglio e lanciarla. Il coefficiente va (per ora) impostato manualmente nella macro stessa:
    Codice: 
    Option Explicit
    
    Sub filtra_per_coefficiente()
    
        Dim uRiga As Long       'ultima riga compilata
        Dim a As Long           'contatore per ciclo delle righe compilate
        Dim h As Integer        'coefficiente da impostare manualmente
        Dim gruppo As Boolean   'flag per gruppi pari o superiori al coefficiente
        Dim b As Long           'contatore per il coefficiente
        Dim c As Long           'contatore per ciclo che riporta il contenuto delle celle
        
        h = 3                                                   'Coefficiente "h" da impostare manualmente a piacere
        uRiga = Range("A" & Rows.Count).End(xlUp).Row
        For a = 2 To uRiga
            If Range("B" & a) = 0 Then                          'Se la cella in B = 0
                Range("C" & a) = 0                              'riporta 0 nella colonna C
            Else                                                'Se la cella è > 0 inizia ciclo di verifica per coefficiente
                b = 1
                gruppo = False
                Do While Range("B" & a).Offset(b, 0) > 0        'Esegui il ciclo fino a quando la cella B > 0
                    If Range("B" & a).Offset(b, 0) > 0 Then     'Se la cella in B > 0
                        If b >= h - 1 Then                      'e se ci sono almeno celle pari o superiori al coefficiente
                            gruppo = True                       'attiva la flag
                        End If
                    Else
                        gruppo = False
                    End If
                    b = b + 1
                Loop
                If gruppo = True Then                           'Se è attiva la flag
                    b = b - 1
                    For c = 0 To b
                        Range("C" & a + c) = Range("B" & a + c) 'copia i valori di B in C
                    Next c
                Else
                    Range("C" & a & ":C" & a + b) = 0           'altrimenti imposta C a 0
                End If
                a = a + b
            End If
        Next a
        
    End Sub

  8. I seguenti utenti hanno dato un "Like"

    ges

  9. #8

    L'avatar di ges
    Clicca e Apri
    Data Registrazione
    Jun 2015
    Località
    Como
    Età
    53
    Messaggi
    7166
    Versione Office
    2011MAC 2016WIN
    Likes ricevuti
    2065
    Likes dati
    1305
    Se ho ben capito, una soluzione potrebbe essere usare questa formula aggiungendo una riga superiore:

    =SE(E(B3>0;CONTA.SE(B1:B5;">"&0)>2);B3;0)

    Allego file
    File Allegati File Allegati
    Quando si scartano tutte le ipotesi possibili, quella che resta, anche se può sembrare improbabile, non può che essere quella giusta!

  10. I seguenti utenti hanno dato un "Like"


  11. #9
    L'avatar di Sixxer
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Italia
    Messaggi
    6
    Versione Office
    Office 2016
    Likes ricevuti
    0
    Likes dati
    1
    Grazie mille ad entrambi, davvero.

    rollis13: la tua macro funziona! Mi permette di poter giocare facilmente con il coefficiente h! Il massimo sarebbe poterlo impostare da fuori, in una cella, ma ci studierò su! Ah, poi ho notato che è vincolata alle colonne A, B, C...anche lì, vedrò se riesco a impostarle a piacere da fuori. Comunque grazie davvero, hai risolto il grosso del mio problema!!

    ges: la tua soluzione funziona, però è vincolata al valore di h=3! E' comunque meglio della mia, essendo meno concatenata e più facile da modificare...grazie!

  12. #10
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    salvo errori, prova così:
    nel modulo standard
    Codice: 
    Option Explicit
    Sub filtra(vettore As Range, cella As Range)
        Dim uRiga As Long
        Dim a As Long
        Dim h As Integer
        Dim gruppo As Boolean
        Dim b As Long
        Dim c As Long
    
    
    h = cella.Value
    uRiga = vettore.Rows.Count
    If h = 1 Then
    For a = 1 To uRiga
    cella.Offset(a, 0).Value = vettore.Cells(a, 1).Value
    Next a
    Exit Sub
    End If
    For a = 1 To uRiga
        If vettore.Cells(a, 1).Value = 0 Then
            cella.Offset(a, 0).Value = 0
        Else
            b = 1
            gruppo = False
            Do While vettore.Cells(a, 1).Offset(b, 0).Value > 0
                If vettore.Cells(a, 1).Offset(b, 0).Value > 0 Then
                    If b >= h - 1 Then
                    gruppo = True
                    End If
                Else
                    gruppo = False
                End If
                b = b + 1
            Loop
            If gruppo = True Then
                b = b - 1
                For c = 0 To b
                    cella.Offset(a + c, 0).Value = vettore.Cells(a + c, 1).Value
                    Next c
            Else
                Range(cella.Offset(a, 0), cella.Offset(a + b + 1, 0)).Value = 0
            End If
        a = a + b
        End If
    Next a
    End Sub
    nel foglio
    Codice: 
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    
     If Not Application.Intersect([C1:G1], Range(Target.Address)) Is Nothing Then
    Call filtra([B2:B1009], [C1])
    Call filtra([B2:B1009], [D1])
    Call filtra([B2:B1009], [E1])
    Call filtra([B2:B1009], [F1])
    Call filtra([B2:B1009], [G1])
    End If
    End Sub

    chiaramente se non ti servono più valutazioni, puoi eliminare le diverse call
    saluti
    File Allegati File Allegati

  13. #11
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    [QUOTE=ggratis;19253]salvo errori, prova così:
    nel modulo standard
    Codice: 
    Option Explicit
    Sub filtra(vettore As Range, cella As Range)
        Dim uRiga As Long
        Dim a As Long
        Dim h As Integer
        Dim gruppo As Boolean
        Dim b As Long
        Dim c As Long
    
    
    h = cella.Value
    uRiga = vettore.Rows.Count
    If h = 1 Then
    For a = 1 To uRiga
    cella.Offset(a, 0).Value = vettore.Cells(a, 1).Value
    Next a
    Exit Sub
    End If
    For a = 1 To uRiga
        If vettore.Cells(a, 1).Value = 0 Then
            cella.Offset(a, 0).Value = 0
        Else
            b = 1
            gruppo = False
            Do While vettore.Cells(a, 1).Offset(b, 0).Value > 0
                If vettore.Cells(a, 1).Offset(b, 0).Value > 0 Then
                    If b >= h - 1 Then
                    gruppo = True
                    End If
                Else
                    gruppo = False
                End If
                b = b + 1
            Loop
            If gruppo = True Then
                b = b - 1
                For c = 0 To b
                    cella.Offset(a + c, 0).Value = vettore.Cells(a + c, 1).Value
                    Next c
            Else
                Range(cella.Offset(a, 0), cella.Offset(a + b + 1, 0)).Value = 0
            End If
        a = a + b
        End If
    Next a
    End Sub

    sostituire l'istruzione evidenziata in rosso con la seguente:
    Codice: 
                If a + b + 1 <= uRiga Then
                Range(cella.Offset(a, 0), cella.Offset(a + b + 1, 0)).Value = 0
                Else
                Range(cella.Offset(a, 0), cella.Offset(uRiga, 0)).Value = 0
                End If
    se gli ultimi valore della colonna sono <> 0 ma il gruppo è in numero minore ad h elementi si genera una inesattezza (stampa due zeri in più) ;)

  14. I seguenti utenti hanno dato un "Like"


  15. #12
    L'avatar di Sixxer
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Italia
    Messaggi
    6
    Versione Office
    Office 2016
    Likes ricevuti
    0
    Likes dati
    1
    Grazie mille ggratis!!

  16. #13
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    Figurati...

    fai sapere se riesci a trovare una soluzione migliore o se riscontri inesattezze.

    Se è tutto ok imposta la discussione come risolta altrimenti Gerardo ti bacchetta [emoji6]

Discussioni Simili

  1. [Risolto] Checkbox multiplo per filtraggio dati
    Di FOSCOJR nel forum Domande su Excel VBA e MACRO
    Risposte: 4
    Ultimo Messaggio: 20/02/17, 15:27
  2. [Risolto] [EXCEL2010] Lentezza strana filtraggio colonna
    Di Daniele.Caso nel forum Domande su Excel in generale
    Risposte: 17
    Ultimo Messaggio: 06/02/17, 22:39
  3. Filtraggio numeri cespiti
    Di RUGANT54 nel forum Domande su Excel in generale
    Risposte: 5
    Ultimo Messaggio: 29/01/17, 16:06

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •