2012-06-20 13 views
6

Definizione del problema:ROW() funzione comporta in modo diverso all'interno SUM() e SUMPRODUCT()

inserire qualsiasi numero nella cella A1. Ora prova le seguenti formule ovunque sulla prima riga.

=SUM(INDIRECT("A"&ROW())) 

e

=SUMPRODUCT(INDIRECT("A"&ROW())) 

La prima formula valuta, il secondo dà un errore #valore. Ciò è causato dalla funzione ROW() che si comporta diversamente all'interno di SUMPRODUCT().

Nella prima formula, ROW() restituisce 1. Nella seconda formula, la riga restituisce {1} (array di una lunghezza), anche se la formula non è stata inserita come formula CSE.

Perché succede?

Sfondo

Ho bisogno di valutare una formula del tipo

=SUMPRODUCT(INDIRECT(*range formed by concatenation and using ROW()*)>1) 

Ciò sta funzionando ad un errore. Per ovviare a questo problema, ora calcolo ROW() in un'altra cella (nella stessa riga, ovviamente) e concatenato all'interno del mio INDIRECT(). In alternativa, ho anche provato a incapsularlo all'interno di una funzione di somma, come SUM(ROW()), e anche questo funziona.

Apprezzerei sicuramente se qualcuno potesse spiegare (o indicarmi una risorsa che possa spiegare) perché ROW() restituisce un array all'interno di SUMPRODUCT() senza essere inserito CSE.

risposta

6

Interessante domanda. Ci sono problemi sottili qui che non ho visto documentati.

Sembra che INDIRECT("A"&ROW()) restituisca un array costituito da un elemento che è un riferimento a una cella, non il valore in quella cella. Molte funzioni non possono risolvere correttamente questo tipo di dati, ma alcune funzioni come N e T possono "dereferenziare" la matrice e restituire il valore sottostante.

prendere questo caso ci sono due elementi nell'array:

=SUM(N(INDIRECT("A"&ROW(1:2)))) 

restituisce A1 + A2 quando matrice entrato ma restituisce solo quando A1 inserito normalmente. Tuttavia la modifica di ROW (1: 2) a {1; 2} in questa formula restituisce il risultato corretto quando viene inserito normalmente. La formula SUMPRODUCT equivalente restituisce A1 + A2 se la matrice è inserita o meno.

Questo può essere correlato al modo in cui gli argomenti sono registrati nella funzione. Secondo http://msdn.microsoft.com/en-us/library/bb687900.aspx esistono essenzialmente due metodi per registrare gli argomenti delle funzioni per gestire i tipi di dati Excel:

Tipo R/U: "Valori, matrici e riferimenti di intervallo".

Tipo P/Q: "Excel converte riferimenti a cella singola in valori semplici e riferimenti a più celle agli array quando si preparano questi argomenti."

Gli argomenti SUM sembrano essere conformi al tipo R/U mentre gli argomenti SUMPRODUCT si comportano come tipo P/Q. L'inserimento di una matrice nella formula SUM sopra impone l'argomento di riferimento dell'intervallo in ROW da valutare come matrice, mentre ciò avviene automaticamente con SUMPRODUCT.

Aggiornamento

Dopo un po 'di ulteriori indagini, ecco un'ulteriore prova che potrebbero supportare questa teoria. Basata sul link nel commento, la formula = SUM ((A1, A2)) fornisce gli stessi valori:

?executeexcel4macro("CALL(""Xlcall32"",""Excel4"",""2JRJR"",4,,1,(!R1C1,!R2C1))") 

Registrazione dell'ultimo argomento come tipo P cambiando 2JRJR a 2JRJP dà un errore in questo caso ma consente intervalli di singole aree come !R1C1:!R2C1. D'altra parte, il passaggio da 4 (xlfsum) a 228 (xlfsumproduct) consente solo riferimenti di area singola in entrambi i casi in cui viene chiamato proprio come SUMPRODUCT.

+0

+1 bella ricerca! –

+0

+1 Questo è esattamente ciò di cui avevo bisogno. La capacità di "dereferenziazione" delle funzioni ''() 'e' '()' 'mi sorprende. Infatti, nella formula '= SUMPRODUCT (N (INDIRECT (" A "& ROW())))', la funzione 'N()' risolve in realtà un errore #VALORE (come visto nella Formula di valutazione, Excel 2003). Questo è estremamente buono da sapere. Anche le informazioni sui tipi di argomenti R/U e P/Q sembrano essere una buona spiegazione. La gestione degli elementi 'xlTypeNil' per i tipi P/Q sembra corrispondere al comportamento di' SUMPRODUCT() '. Grazie per una risposta brillante. Non avrei mai saputo per cosa cosa Google. Merita un +10 !! – playercharlie

+0

Sono contento che questo sia stato d'aiuto - Laurent Longre ha inizialmente capito questo comportamento e ha mostrato come è possibile utilizzare la funzione CALL con riferimento a xlcall.h per le funzioni del foglio di lavoro: http://www.cpearson.com/excel/Call.htm. In VBA questo è ancora accessibile tramite: 'ExecuteExcel4Macro'. –

2

Come ROW() restituisce un array, utilizzare INDEX per ottenere il 1 ° elemento.

Si esempio diventa allora: =SUMPRODUCT(INDIRECT("A"&INDEX(ROW(),1)))

+0

Grazie per la risposta. Ho usato la funzione 'SUM()' invece della funzione 'INDICE()' e ho risolto il problema. Tuttavia, stavo cercando una spiegazione sul motivo per cui dovevo farlo. – playercharlie

+0

Questa è la migliore risposta per me. L'utilizzo di INDICE() sull'array risultante da ROW() utilizzato all'interno di SUMPRODUCT() è perfetto! Se la volatilità riguarda solo il ricalcolo, non mi preoccuperà più di tanto perché il computer è molto più veloce ora. Ci sono un sacco di indiretti e offset usati nelle mie cartelle di lavoro e sto bene con un ritardo fino a 1 secondo del ricalcolo. Quindi, se mai dovessi usare ROW() all'interno di SUMPRODUCT(), allora INDICE() è una funzione di supporto indispensabile! Grazie mille SeanC –

+0

Oh, e grazie per il trucco SUM() auto-risposto da OP. Accorcia la formula e preferisco quella più breve. Mi chiedo se uno di loro è più veloce. Forse SUM() è più veloce perché non è volatile? –

1

Non credo ROW() si comporta in modo diverso qui, restituisce un array in entrambi i casi. Presumo che SUM e SUMPRODUCT trattino l'array in modo diverso, non so perché.

Molte funzioni o combinazioni di esse restituiscono array - non è necessario CTRL + MAIUSC + INVIO per farlo, in molti casi è necessario CSE per elaborare gli array creati.

Vorrei solo usare INDEX al posto di INDIRETTO (che beneficia anche evitando una funzione volatile), vale a dire

=SUMPRODUCT(INDEX(A:A,ROW()))

....espansione che per l'intervallo di questa formula conta il numero di valori> 1 in un intervallo in colonna A dove x definisce la riga iniziale e y fila terminale

=COUNTIF(INDEX(A:A,x):INDEX(A:A,y),">1")

xey può essere calcolata dalle formule

è possibile utilizzare SUMPRODUCT o COUNTIFS in modo simile se ci sono più condizioni per aggiungere

+0

Grazie per la risposta. Ho usato la funzione 'SUM()' attorno alla funzione 'ROW()' e ho risolto il problema. Inoltre, per il mio problema particolare, ho dovuto usare la funzione 'INDIRECT()', perché i riferimenti delle celle venivano calcolati altrove. Sembra che tu abbia capito bene quando dici che CSE cambia solo l'elaborazione degli array. @lori_m ha una risposta fantastica sul perché 'SUM()' e 'SUMPRODUCT()' trattano gli array in modo diverso. – playercharlie