estrazione valori da elenco



  • estrazione valori da elenco
    di Livio (utente non iscritto) data: 19/10/2012 13:45:58

    salve. Dato un elenco di numeri incolonnati ed ordinati da maggiore a minore, vorrei individuare quelle celle che contengono valori inferiori ad 1, e copiarle in una colonna diversa dello stesos foglio; senza modificare l'elenco originale che sarà poi aggiornato periodicamente.
    Si tratta di individuare dei valori in un elenco di dati di vendite trimestrali, e creare un nuovo elenco solo con le celle con la caratteristica data.
    C'è un comando che posso scrivere od una macro che posso lanciare nel foglio per fare ciò ?
    Grazie


  • indice
    di canapone (utente non iscritto) data: 19/10/2012 14:35:48

    Ciao,

    avendo l'elenco in A2:A1000, potresti provare:

    =GRANDE(SE($A$2:$A$1000<1;$A$2:$A$1000);RIF.RIGA(A1))

    da confermare con control+maiusc+invio.

    Se usi Excel 2007

    =se.errore(GRANDE(SE($A$2:$A$1000<1;$A$2:$A$1000);RIF.RIGA(A1));"")

    Sempre matriciale.


    Saluti


  • indice -1
    di canapone (utente non iscritto) data: 19/10/2012 14:44:32


    Ciao,

    ottieni lo stesso risultato con:

    =se.errore(INDICE($A$2:$A$1000;CONFRONTA(0,999999999;$A$2:$A$1000;-1)+RIF.RIGA(A1));"")

    Saluti



  • di Livio (utente non iscritto) data: 19/10/2012 15:42:04

    nessuna delle tre sembra funzionare. Sicuri della sintassi ?



  • di Vecchio Frac data: 19/10/2012 15:50:34

    Se l'elenco è in A1:A10, la formula seguente:

    =SE(A1:A10<1;A1;"")

    inserita, non in forma di matrice, ad esempio in B1:B10, dovrebbe produrre il risultato voluto.
    Incolla la formula in B1 poi usa il quadratino di trascinamento per tutto il range dati della colonna A.
    Rimangono naturalmente i buchi delle celle vuote, quelle che hanno valore > 1.
    Per cui bisogna vedere anche se ti interessa una soluzione per compattare il risultato senza lasciare celle vuote (non sono vuote in realtà, hanno una formula che però produce un risultato nullo).





  • di Livio (utente non iscritto) data: 19/10/2012 15:54:09

    ho inserito un piccolo file di esempio.
    La colonna su cui lavorare è la H
    I dati sono circa 600
    Si tratta di elencare in 'k' i nomi delle celle di collonna 'b' che rispondono al criterio h<1
    Così è più chiaro cosa cerco ?
    Grazie



  • di Livio (utente non iscritto) data: 19/10/2012 15:56:58

    grazie della risposta vecchio frac.
    L'avevo già fatta, ma appunto produce celle apparentem. vuote.
    Vorrei invece un elenco senza le celle vuote
    A mano a mano che i dati si modificano nel tempo, questo elenco si aggiorna da sè
    Grazie



  • di Vecchio Frac data: 19/10/2012 16:01:15

    Lo immaginavo che ti servisse una cosa anche esteticamente decente :)
    Ho già da qualche parte il metodo per compattare range con celle vuote, devo solo cercarlo.





  • di Vecchio Frac data: 19/10/2012 16:16:45

    Ho trovato quello che cercavo, ma è macchinoso.
    Qualcosa di più elegante si può fare con VBA.
    Visto che nel foglio hai comunque già iniziato a usare codice, te ne propongo uno svelto svelto, fatto al volo, che fa quello che chiedi.
    In colonna K troverai l'elenco delle ditte che hanno valore minore di uno in colonna H.
    Il codice è semplice da leggere e comprendere, ma se hai bisogno chiedi pure.

    Considera anche l'alternativa di utilizzare una bella formattazione condizionale a video per evidenziare i nomi delle ditte che sono a zero :)

     
    Sub extract_compact_range()
    Dim ac As Range
        [k:k].ClearContents
        For Each ac In Range(Cells(2, 8), Cells([counta(h:h)], 8))
            If ac < 1 Then Cells(2 + [counta(k:k)], 11) = ac.Offset(, -6)
        Next
    End Sub






  • di canapone (utente non iscritto) data: 19/10/2012 16:25:04

    Ciao a tutti,

    condivido un esempio con formule 2003.

    Usando 2007 basta se.errore

    =se.errore(INDICE($B$2:$B$27;PICCOLO(SE($G$2:$G$27<>0;RIF.RIGA($A$2:$A$27)-1);RIF.RIGA($A1)));"")

    Meglio sicuramente il Vba alle matriciali: sempre che abbia capito.

    Saluti



  • di Vecchio Frac data: 19/10/2012 16:27:46

    cit. " A mano a mano che i dati si modificano nel tempo, questo elenco si aggiorna da sè "
    --> La procedura che ho suggerito ovviamente non fa aggiornare automaticamente i dati.
    Per questo ti propongo una soluzione ibrida, basata su una Function che viene richiamata in forma matriciale nel foglio e che compatta i valori come richiesto.

    Lasciando la tabella come l'hai già impostata:
    - incolla il codice che propongo in un modulo (il codice non è mio e forse si può migliorare)
    - in colonna K, da K2 a K27 (per ora: poi dovrai estendere il range) scrivi la formula in forma matriciale: =NoBlanks(H2:H27) e premi Ctrl-Shift-Invio (così la formula acquista le parentesi graffe per indicare che è una formula matriciale)
    - man mano che aumenti i valori devi selezionare il nuovo range da K2 in giù e scrivere la nuova formula con i nuovi riferimenti =NoBlanks(H2:H...) e premere Ctrl-Shift-Invio




     
    Option Explicit
    
    Function NoBlanks(RR As Range) As Variant
    Dim Arr() As Variant, R As Range, N As Long, L As Long
    
        If RR.Rows.Count > 1 And RR.Columns.Count > 1 Then
            NoBlanks = CVErr(xlErrRef)
            Exit Function
        End If
        
        If Application.Caller.Cells.Count > RR.Cells.Count Then
            N = Application.Caller.Cells.Count
        Else
            N = RR.Cells.Count
        End If
        
        ReDim Arr(1 To N)
        N = 0
        For Each R In RR.Cells
            If R = 0 Then
                N = N + 1
                Arr(N) = R.Offset(, -6)
            End If
        Next R
        For L = N + 1 To UBound(Arr)
            Arr(L) = vbNullString
        Next L
        ReDim Preserve Arr(1 To L)
        If Application.Caller.Rows.Count > 1 Then
            NoBlanks = Application.Transpose(Arr)
        Else
            NoBlanks = Arr
        End If
    End Function






  • di Vecchio Frac data: 19/10/2012 16:30:57

    Perfetto canapone, era la formula che avevo anch'io, grazie a cpearson ^_^, ma la trovo piuttosto complessa e macchinosa soprattutto da manutenere nel tempo.
    Io se posso preferisco risolvere con due righe di codice ben sistemato :)
    Thx