Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Ottimizzare formula in Excel 2007

    Salve, sto creando con Excel una tabella per verificare l'esito di quiz a risposta multipla da parte di una serie di candidati.
    La riga 1 contiene le risposte esatte (indicate con lettere dell'alfabeto corrispondenti alle varie opzioni proposte nei quiz), mentre in corrispondenza, sotto, ci sono le risposte dei vari candidati alle rispettive domande.
    Vi è poi una colonna di valutazione dove effettuo la somma di ben 16 CONTA.SE(), uno per ogni quiz.
    Per esempio ho un formulone del genere per ogni candidato:
    codice:
    =CONTA.SE(B3;B3=B$1)+CONTA.SE(C3;C3=C$1)+CONTA.SE(D3;D3=D$1)+CONTA.SE(E3;E3=E$1)+CONTA.SE(F3;F3=F$1)+CONTA.SE(G3;G3=G$1)+CONTA.SE(H3;H3=H$1)+CONTA.SE(I3;I3=I$1)+CONTA.SE(J3;J3=J$1)+CONTA.SE(K3;K3=K$1)+CONTA.SE(L3;L3=L$1)+CONTA.SE(M3;M3=M$1)+CONTA.SE(N3;N3=N$1)+CONTA.SE(O3;O3=O$1)+CONTA.SE(P3;P3=P$1)+CONTA.SE(Q3;Q3=Q$1)
    Vorrei sapere se posso compattarlo, anche cambiando formula, definendo un intervallo di celle con i risultati (nell'esempio la riga 3) da confrontare con un intervallo di celle delle risposte esatte (riga 1). Ho provato CONTA.PIU.SE() ma pare non faccia al caso mio in quanto il valore da cercare cambia in base al quiz.

  2. #2

  3. #3
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,690
    Ciao, nella tua formula ci sono chiaramente delle cose che non vanno.

    Prima cosa, il CONTA.SE in genere è utile quando si ha bisogno di contare delle occorrenze all'interno di un intervallo di più celle (quello che viene identificato come primo argomento della funzione) ma, nel tuo esempio, tu lo usi con un intervallo di una sola cella; a questo punto sarebbe forse più adeguato usare dei semplici SE.

    Seconda cosa, il secondo argomento (criteri) deve essere un numero o un'espressione o un riferimento oppure una stringa che rappresenta una specifica condizione; nel tuo esempio invece hai inserito direttamente una condizione (non una stringa che la rappresenta), questo presumibilmente restituirà un valore (VERO, FALSO), il quale sarà usato come criterio per il confronto di uguaglianza con i valori dell'intervallo; per cui tale confronto non sarà fatto sulla base di tale condizione ma bensì sulla base della corrispondenza tra i valori dell'intervallo e il valore del criterio (cioè il valore VERO o FALSO).

    La logica è chiaramente sbagliata e produrrà dei risultati inattesi, come tu stesso hai potuto constatare.

    Una impostazione più corretta (o quantomeno funzionante), di tale formula, potrebbe essere una cosa del tipo:
    codice:
    =CONTA.SE(B3;"="&B1)+CONTA.SE(C3;"="&C1)+CONTA.SE(D3...ecc.
    Ora, a parte l'intervallo che resta comunque di una sola cella (e che rende "sprecato" l'uso di tale funzione), puoi notare che il secondo argomento è definito da una stringa che identifica una particolare condizione, cioè la stringa "=" più il valore della cella nella prima riga. Chiaramente le cose cambiano rispetto a come l'hai impostata tu.

    Spero di non averti confuso maggiormente le idee.

    Ad ogni modo, considerando "sprecata" la funzione CONTA.SE per una situazione del genere, potresti risolvere in modo simile con dei semplici SE.

    Potrebbe essere una cosa tipo questa:
    codice:
    =SE($B$1=B:B;1)
    +SE($C$1=C:C;1)
    +SE($D$1=D:D;1)
    +SE($E$1=E:E;1)
    +SE($F$1=F:F;1)
    +SE($G$1=G:G;1)
    +SE($H$1=H:H;1)
    +SE($I$1=I:I;1)
    +SE($J$1=J:J;1)
    +SE($K$1=K:K;1)
    +SE($L$1=L:L;1)
    +SE($M$1=M:M;1)
    +SE($N$1=N:N;1)
    +SE($O$1=O:O;1)
    +SE($P$1=P:P;1)
    +SE($Q$1=Q:Q;1)
    Da incollare sulla relativa cella della colonna dei risultati ed estendere per quello che ti serve nelle celle delle righe sottostanti.

    L'idea di base è analoga a quella usata da te, per cui la formula, per quanto sia funzionante, non è propriamente ottimizzata ma almeno funziona.

    Tieni conto che per comodità ho usato degli intervalli di colonna del tipo B:B così da rendere la formula uguale per ogni riga, ma se preferisci puoi sostituire con dei riferimenti specifici del tipo $B3, ad esempio; chiaramente in quel modo il riferimento di riga (3) sarà incrementato quando andrai ad estendere la formula sulle righe sottostanti; in tal caso, teoricamente dovrebbe anche migliorare il tempo di calcolo rispetto ad un riferimento di colonna come quello da me utilizzato (chiaramente la cosa è più o meno percepibile in base alla mole di celle in cui andrai ad utilizzare tale formula).

    Vedi se può andare così; per il momento non mi vengono in mente altre soluzioni più stringate se non usando magari una qualche funzione personalizzata in VBA; poi chissà potrebbe anche esserci qualche formula più pratica che personalmente mi sfugge.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,690
    poi chissà potrebbe anche esserci qualche formula più pratica che personalmente mi sfugge.
    correggo... mi sfuggiva

    Una soluzione più pratica richiede l'uso di una formula, cosiddetta, "matriciale".

    Questa e la formula:
    codice:
    {=SOMMA(SE($B$1:$Q$1=$B3:$Q3;1))}
    Tieni presente che le parentesi graffe rappresentano il fatto che si tratta di una formula matriciale, per l'appunto.
    Per utilizzarla dovrai fare questo (non so se tu ne sia al corrente ma lo indico qui ugualmente):

    - copia tale formula escludendo le parentesi graffe;
    - nel tuo foglio, seleziona la cella sulla colonna dei risultati (relativamente alla riga 3, in questo caso) quindi clicca sulla "Barra della formula";
    - incolla la formula e premi, da tastiera, la combinazione Shift+Ctrl+Invio in modo da creare una formula matriciale (vedrai comparire le parentesi graffe attorno alla formula);
    - a questo punto puoi estendere la formula sulle celle sottostanti quanto basta.

    Nota: ogni volta che accedi alla barra della formula per editare una formula matriciale, dovrai poi premere nuovamente Shift+Ctrl+Invio per mantenerla tale.

    In sostanza tale formula esegue l'operazione (in questo caso il controllo col SE che confronterà le varie coppie di celle) su tutte le celle relative all'intervallo specificato, restituendo una matrice di valori 1 o 0 (lo zero è sottinteso in quel SE) la quale, matrice, è data in pasto a SOMMA che restituisce, appunto, il totale delle corrispondenze.

    Di più non so
    Ultima modifica di KillerWorm; 03-09-2017 a 00:15
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  5. #5
    Grazie, al momento ho adattato la formula con la somma dei SE riga per riga, perché ogni riga è relativa a un candidato.
    codice:
    =SE($B$1=B3;1)
    +SE($C$1=C3;1)
    +SE($D$1=D3;1)
    +SE($E$1=E3;1)
    +SE($F$1=F3;1)
    +SE($G$1=G3;1)
    +SE($H$1=H3;1)
    +SE($I$1=I3;1)
    +SE($J$1=J3;1)
    +SE($K$1=K3;1)
    +SE($L$1=L3;1)
    +SE($M$1=M3;1)
    +SE($N$1=N3;1)
    +SE($O$1=O3;1)
    +SE($P$1=P3;1)
    +SE($Q$1=Q3;1)
    Trascinata poi accanto a tutte le righe da 4 in giù.

    La formula matriciale la provo in un'altra occasione, ora mi serve una soluzione pratica...

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.