Creazione di un indice



  • Creazione di un indice
    di Simone (utente non iscritto) data: 02/11/2014 10:24:33

    Buongiorno, avrei bisogno di un aiuto sull'utilizzo di excel.
    Devo creare un indice che sia la somma di più valori
    Ecco i dati he ho:

    ID PART STATO TIPO
    123 A ITA X
    123 B ITA Y
    123 C FRA X
    123 D GER Z
    123 E GER Y
    123 F ITA W
    124 G ITA X
    124 H ITA Y
    124 I SPA X
    124 L GER Z

    Quello che vorrei ottenere è un valore dato dalla seguente formula:

    INDICE= numero di partecipanti aventi lo stesso ID + numero di stati (i doppioni contano 1) + numero di tipi (i doppioni contano 1)

    Nello specifico del mio caso gli indici sarebbero i seguenti:
    INDICE (relativo a ID 123): 6+4+4=14
    INDICE (relativo a ID 124): 4+3+3=10

    Ho un dataset con circa 600 mila righe, quindi non ho possibilità di fare manualmente tali calcoli, è per questo che mi servirebbe una formula (o altro se ritenete) da poter inserire in una nuova colonna chiamata INDICE. Naturalmente ogni riga con uguale ID avrà uguale INDICE.

    Se non sono stato chiaro o se ho omesso qualche informazione, fatemi sapere.

    Grazie mille per la collaborazione.

    Simone




  • di lepat (utente non iscritto) data: 02/11/2014 11:10:10

    allega un file di esempio con 100 righe ed anche il risultato desiderato



  • di Simone (utente non iscritto) data: 02/11/2014 14:19:56

    Grazie Iepat per la pronta risposta!!
    Ho appena allegato il file di esempio. L'indice calcolato per le prime 16 righe è il risultato del mio calcolo "manuale". A fianco nelle note ho inserito la spiegazione degli elementi della somma che rende il mio INDICE.
    Le evidenziazioni colorate sono solo per visualizzare i gruppi di record con lo stesso ID ai quali i calcoli si riferiscono.

    Sono ancora a disposizione se qualcosa nn è chiaro.

    Grazie mille ancora.
    simone



  • di lepat (utente non iscritto) data: 02/11/2014 15:26:00

    prova questa macro
     
    Sub conta()
    Dim rng As Range
    col = "A"
    LR = Cells(Rows.Count, col).End(xlUp).Row
    r = 2
    first = Cells(r, col)
    Do While r < LR
         r1 = r
         Do While Cells(r, col) = first
           r = r + 1
         Loop
         first = Cells(r, col)
         r2 = r - 1
         ind = ind + r - r1
         Set rng = Range("C" & r1 & ":C" & r2)
         ind = ind + conta_univoci(rng)
         Set rng = Range("D" & r1 & ":D" & r2)
         ind = ind + conta_univoci(rng)
         Range("E" & r1 & ":E" & r2).Value = ind
         ind = 0
    Loop
    End Sub
    
    Function conta_univoci(rng As Range)
    Dim NoDupes As New Collection
    Dim aDati()
    aDati = rng
    On Error Resume Next
    For Each rCell In aDati
      If Not IsEmpty(rCell) Then
        NoDupes.Add rCell, CStr(rCell)
      End If
    Next rCell
    conta_univoci = NoDupes.Count
    End Function
    



  • di Mister_x (utente non iscritto) data: 02/11/2014 17:11:45

    ciao

    in alternativa alla sub() di lepat, che saluto, dato che stai usando una versione 2007 o sup
    potresti sfruttare il comando rimuovi duplicati, e con delle semplici funzioni fare il lavoro
    vedi il tuo file con le colonne di appoggio e i calcoli applicati a queste
    il vantaggio non serve avere tutto ID in Ordinato per questo

    ciao





  • Macro Excel... nuovo indice
    di simone (utente non iscritto) data: 10/11/2014 18:10:50

    Buonasera,
    visto l'eccellente risultato della volta scorsa grazie alla Vostra competenza, sono nuovamente a chiederVi aiuto con le macro di excel.

    Dovrei calcolare un nuovo indice. allego subito il file di esempio e vi fornisco anche la spiegazione teorica del risultato che vorrei ottenere.

    All'interno dell'intervallo di riferimento (A2:A14) vorrei calcolare un INDICE relativo ad ogni GRUPPO (es. gruppo "123" formato dai primi 7 partecipanti). Tale INDICE è dato dalla somma degli indicatori (i) di ogni partecipante diviso il numero dei partecipanti al gruppo. La formula sarebbe la seguente: SOMMA {i_AAAA + i_AABB + i_BBBB + i_BBCC + i_DDDD}5. Ogni "i_PARTECIPANTE" è dato dalla seguente formula: esempio=> i_AAAA=[(numero di volte in cui AAAA e AABB sono presenti nello stesso GRUPPO) * ("1" se C2 e C3=no; "1,5" se C2 o C3=si) + (numero di volte in cui AAAA e BBBB sono presenti nello stesso GRUPPO) * ("1" se C2 e C4=no; "1,5" se C2 o C4=si) + (numero di volte in cui AAAA e BBBB sono presenti nello stesso GRUPPO) * ("1" se C2 e C4=no; "1,5" se C2 o C4=si) + (numero di volte in cui AAAA e BBCC sono presenti nello stesso GRUPPO) * ("1" se C2 e C5=no; "1,5" se C2 o C5=si)+ (numero di volte in cui AAAA e DDDD sono presenti nello stesso GRUPPO) * ("1" se C2 e C6=no; "1,5" se C2 o C6=si). OSSERVAZIONI: 1)quando si va a calcolare i_AABB, non bisogna ripetere nella somma il numero delle volte che è stato presente negli stessi gruppi con AAAA, già considerato nel calcolo di i_AAAA. 2)gli spazi vuoti nell'esempio sono voluti perchè il dataset ha valori mancanti e in quel caso è necessario considerare valore mancante= zero perchè non si potrà calcolare il relativo i_PARTECIPANTE, ma si arriverà comunque ad un INDICE che ovviamente non terrà conto di quel i_PARTECIPANTE mancante causato dall'assenza di dato o nella colonna B o nella colonna C. 3)Ogni partecipante, nelle volte che sarà presente nell'intervallo A2:A14, potrà avere indici diversi a seconda del gruppo di appartenenza perchè l'indice descrive una caratteristica del gruppo non del partecipante.

    Naturalmente sono a completa disposizione per spiegazioni o dati mancanti o confusi.
    GRAZIE MILLE ...

    Simone



  • di scossa data: 11/11/2014 09:10:11

    cit. simone: "visto l'eccellente risultato della volta scorsa grazie alla Vostra competenza....."

    Il tuo mi sembra un comportamento piuttosto scorretto: hai avuto due risposte alle quali, in 8 giorni non ti sei degnato di fornire un cenno di risocntro/ringraziamento; ora che hai di nuovo bisogno di aiuto fai la sviolinata .......



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Simone (utente non iscritto) data: 11/11/2014 09:41:53

    Ciao Scossa, ciao a tutti,
    in realtà avevo risposto, ringraziando per l'aiuto e precisando anche che la macro mi si interrompeva per valori = 1 della colonna A, ma non importava perché avrei pulito io il DB in quanto quei valori non mi interessavano. Evidentemente l'ho scritta e poi non l'ho inviata.
    Il risultato comunque è quello che dici te, hai perfettamente ragione. Mi scuso con te e con tutti gli altri.
    Simone.





  • di scossa data: 11/11/2014 12:52:23

    Ciao,

    dovresti illustrare i singoli passaggi che portano a quel: =((1+2+2+1)+(1+1+1)+(1+1)+(1))/5



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Simone (utente non iscritto) data: 11/11/2014 13:29:45

    Ok, ci provo.
    =((1+2+2+1)+(1+1+1)+(1+1)+(1))/5 vuol dire questo:

    - primo 1 dentro prima parentesi = 1 sola volta sono presenti AAAA e AABB nello stesso gruppo: nel gruppo 123

    - primo 2 dentro prima parentesi = 2 volte sono presenti AAAA e BBBB nello stesso gruppo: gruppo 123 e 456

    - secondo 2 dentro prima parentesi = 2 volte sono presenti AAAA e BBCC nello stesso gruppo: gruppo 123 e 789

    -secondo 1 dentro prima parentesi =1 sola volta sono presenti AAAA e DDDD nello stesso gruppo: nel gruppo 123

    Quindi la prima parentesi conta quante volte il primo partecipante del gruppo 123 è stato presente insieme al secondo partecipante dello stesso gruppo, verificando le composizioni di tutti i gruppi dell'intervallo A2:A14.

    La seconda parentesi conta la stessa cosa per il secondo partecipante, senza però ripetere la volta che è stato presente con il primo partecipante, perché già contata.

    Così via per le altre parentesi. Non c'è una parentesi per contare le co-presenze dell'ultimo partecipante (DDDD) perché sono già state contate tutte nelle combinazioni precedenti.

    Spero di essermi spiegato, ma in caso contrario fatemelo notare.

    Grazie mille per la collaborazione.
    simone



  • di scossa data: 11/11/2014 13:43:04

    Cit.: "primo 1 dentro prima parentesi = 1 sola volta sono presenti AAAA e AABB nello stesso gruppo: nel gruppo 123 ... "

    Scusami, ma nel file excel c'è scritto:
    i_AAAA=[(numero di volte in cui AAAA e AABB sono presenti nello stesso GRUPPO) * ("1" se C2 e C3=no; "1,5" se C2 o C3=si)
    etc.....


    Dov'è finito quel * ("1" se C2 e C3=no; "1,5" se C2 o C3=si) (e tutti gli altri)?


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Simone (utente non iscritto) data: 11/11/2014 14:41:09

    La parte della rivalutazione ovvero la moltiplicazione per 1 (se "no") e 1,5 (se "si") rimane, per ogni i_PARTECIPANTE. Non l'avevo riportata perchè pensavo tu chiedessi solo la spiegazione dell'esempio che portava a quel i_AAAA.

    Ogni i_PARTECIPANTE deve essere moltiplicato per 1o1,5 e la somma di tutti gli i_PARTECIPANTE rivalutati va divisa per il numero dei partecipanti.

    Grazie.
    S.



  • di scossa data: 11/11/2014 15:19:35

    Ricominciamo da capo: devi indicare l'esatto risultato che vuoi ottenere e tutti i passaggi manuali per ottenerlo, altrimenti si perde solo tempo.




    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Mister_x (utente non iscritto) data: 11/11/2014 15:21:30

    ciao

    spiegazione da incubo, sembra il gioco delle monetine
    guarda il tuo file modificato
    se e' questo che intendi per indice di percentuale presenze!!!!!!!!

    ciao





  • di Simone (utente non iscritto) data: 12/11/2014 11:09:12

    @ Mister_x: grazie per il tuo aiuto, ho visto il file. Tu in effetti arrivi al risultato finale (2,4) ma solo per un gruppo e in maniera non replicabile velocemente per le migliaia di gruppi (e circa 600 mila righe) che compongono il mio dataset.

    @ scossa: riparto con la spiegazione (da incubo, ha ragione Mister_X!!).

    Risultato finale che vorrei ottenere: un valore nella col. E che sia uguale per tutte le righe aventi GRUPPO uguale

    Matrice di riferimento: A2:E14 (il database reale contiene più di 600 mila righe)

    Spiegazione generale: la macro dovrebbe calcolare la somma delle volte che ogni partecipante di un determinato gruppo ha fatto parte di altri gruppi dove erano presenti anche uno o più partecipanti di quel determinato gruppo, divisa per il numero di partecipanti del gruppo. Ogni co-presenza di due partecipanti ad un gruppo vale 1 se entrambi i partecipanti presentano il valore “no” nella rispettiva colonna C, mentre vale 1,5 se almeno uno dei due presenta il valore “si”.
    Spiegazione analitica: Prendiamo ad esempio il gruppo 123 e partiamo dalla co-presenza di AAAA e AABB. AAAA & AABB=1 perché questa coppia è presente solo nel gruppo 123. Rivalutazione: siccome AAAA ha “si” in C2 si moltiplica per 1,5 quindi (1*1,5=1,5). Poi si continua e si verifica la co-presenza, sempre di AAAA, con gli altri partecipanti. AAAA & BBBB sono presenti sia nel gruppo 123 che nel gruppo 456. Gruppo 123: AAAA&BBBB=1*1.5=1.5. Gruppo 456: AAAA&BBBB=1*1.5=1.5. Rivalutazioni: per lo stesso motivo di prima. Totale AAAA&BBBB=3.
    Vado veloce con gli altri casi per concludere il gruppo 123:
    AAAA&BBCC= (1*1.5)+(1*1.5)= 3
    AAAA&DDDD= (1*1.5)=1.5
    AABB&BBBB = (1*1)=1
    AABB&BBCC= (1*1)=1
    AABB&DDDD=(1*1)=1
    BBBB&BBCC=(1*1)=1
    BBBB&DDDD=(1*1)=1
    BBCC&DDDD=(1*1)=1
    SOMMA dei valori delle co-presenze gruppo 123 = (1.5+3+3+1.5+1+1+1+1+1+1) = 15

    INDICE gruppo 123 = 15/5=3

    Osservazioni: hai ragione, nella versione precedente della mia spiegazione avevo omesso la rivalutazione, per cui anche l’indice mi veniva diverso, 2.4 invece che 3. Questa però è la versione corretta.
    Spero di non aver commesso errori.

    Grazie mille a tutti.

    simone