estrazione valori da elenco
Hai un problema con Excel? 
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
Vuoi Approfondire?