Trova valore recente



  • Trova valore recente
    di Mami1960 (utente non iscritto) data: 26/06/2012

    Ho un elenco di dati composto da 3 colonne: nome, data, importo. i nomi si ripetono nell'elenco ma con date diverse. devo trovare per ogni nome, l'importo con la data più recente.
    qualcuno mi può aiutare ?
    grazie



  • di Harrybosch data: 28/06/2012

    Ciao mami1960
    il modo migliore per risolvere la tua richiesta è attraverso l'utilizzo del vba, inserendo una macro che svolga il lavoro.

    la cosa è risolvibile anche senza il codice, ovvero attraverso le formule ma ci sono alcuni svantaggi:
    - intanto la nella tabella principale bisognerebbe inserire un filtro nella prima riga dell'intestazione
    - attivare quindi il filtro sulla colonna b dove ci sono le date, in modo da ordinare la tabella dalla data più recente
    - nel frattempo in altra colonna l'inserimento delle formule per ottenere i nomi univoci della colonna a; formula parecchio complessa:
    =se.errore((indice($a$2:$a$3000;piccolo(se(val.numero(confronta(rif.riga($a$2:$a$3000)-1;confronta($a$2:$a$3000;$a$2:$a$3000;0);0));confronta($a$2:$a$3000;$a$2:$a$3000;0);""); rif.riga(a1))));0)
    formula matricale da confermare con ctrl+maiusc+invio e da riportare lungo la colonna
    - poi andrebbero inserite le formule per la ricerca dei nomi nella tabella e la restituzione degli importi; la formula cerca.verticale troverà il primo campo uguale a partire dall'alto, quindi il nome con la data più recente e i relativi campi abbinati (data e importo)

    il "disguido" sta proprio nel fatto di dover necessariamente ordinare la tabella dopo ogni inserimento: altrimenti il risultato non sarà corretto (il fatto è che spesso si vuole mantenere fissa la tabella di inserimento); oltre al fatto di avere sempre delle formule sul foglio e di doverle "allungare" manualmente se i campi si aggiungono

    vista la confusione che ti ho sicuramente creato, ho allegato un file dove trovi:
    - nel foglio "formule" la soluzione che ti ho appena esposto
    - mentre nel foglio "macro" la soluzione con il codice che è decisamente più efficace (l'unico "intoppo" della soluzione che ti propongo è che ti servono delle colonne di appoggio ma poi vengono subito cancellate; possono stare nel foglio stesso ma anche su un qualsiasi altro foglio di appoggio)

    ho impostato 3 macro, dove la prima richiama la altre due: le ho suddivise per spiegarti meglio come si svolgono le fasi per la determinazione dell'importo di ogni nominativo relativo alla data più recente:
    - la macro "copia_ordinadata()" copia la tabella origine in altre colonne (in modo da non toccarla) e la ordina secondo la data più recente; poi richiama le due macro successive
    - la macro "nomi_univoci()" ti elabora i nominativi singolarmente
    - la macro "importo_relativo()" assegna le formule ai nomi univoci trovati in modo da ricercare l'importo relativo dalla tabella origine

    ciao vanni
     
    Le macro si inseriscono in un modulo:
    
    Sub copia_ordinadata()
    'pulisco lo spazio dove si creerà la nuova tabella 
    Range([e2], [g2].End(xlDown)).ClearContents
    
    'copio la tabella origine in altre colonne (ma potrebbe benissimo essere anche un file di appoggio)
    Columns("a:c").Select
        Selection.Copy
    Columns("i:k").Select
        Selection.PasteSpecial
        
    'ordino in base alla data più recente    
    Selection.Sort _
            Key1:=Range("j1"), _
            Order1:=xlDescending, Header:=xlGuess, _
            OrderCustom:=1, MatchCase:=False, _
            Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal
    
    'richiamo le altre macro
    Nomi_Univoci
    Importo_relativo
    
    'cancello le colonne che avevo usato come appoggio
    Columns("i:k").ClearContents
    [e2].End(xlDown).Offset(1, 0).Select
    
    End Sub
    
    
    Sub Nomi_Univoci()
    'indispensabile dichiarare l'elenco da memorizzare come New Collection 
    Dim Intervallo As Range
    Dim Elenco As New Collection
    Dim Righe
    Dim Colonne
    
    'imposto l'intervallo ricercando nella tabella origine
    With Range("a1").CurrentRegion
    Righe = .Rows.Count - 1
    Colonne = .Columns.Count
    Set Intervallo = .Offset(1, 0).Resize(Righe, Colonne)
    End With
    On Error Resume Next
    
    'memorizzo l'elenco considerando solo i nominativi univoci (Elenco.Add....)
    For Riga = 1 To Righe
    Elenco.Add Intervallo(Riga, 9).Value, CStr(Intervallo(Riga, 9).Value)
    Next
    On Error GoTo 0
    
    'riporto l'elenco memorizzato in una nuova colonna, la e (5), dopo le intestazioni (Riga + 1)
    For Riga = 1 To Elenco.Count
    Cells(Riga + 1, 5) = Elenco(Riga)
    Next
     
    End Sub
    
    Sub Importo_relativo()
    'assegno le formule ai nominativi trovati
    For i = 2 To Cells(65536, 5).End(xlUp).Row
    Range("f" & i) = "=VLOOKUP(RC[-1],C[3]:C[5],2,FALSE)"
    Range("g" & i) = "=VLOOKUP(RC[-2],C[2]:C[4],3,FALSE)"
    Next i
    
    'trasformo le formule in valori
    valori = Range([f2], [g2].End(xlDown)).Value
    Range([f2], [g2].End(xlDown)) = valori
    End Sub