2012-06-20 10 views
6

Problema definición:ROW() función comporta de manera diferente dentro de SUM() y SUMPRODUCT()

introducir cualquier número en la celda A1. Ahora prueba las siguientes fórmulas en cualquier lugar en la primera fila.

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

y

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

La primera fórmula evalúa, el segundo se da un error #. Esto se debe a que la función ROW() se comporta de forma diferente dentro de SUMPRODUCT().

En la primera fórmula, ROW() devuelve 1. En la segunda fórmula, la fila devuelve {1} (matriz de una longitud), aunque la fórmula no se haya ingresado como una fórmula CSE.

¿Por qué sucede esto?

Antecedentes

necesito para evaluar una fórmula del tipo

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

esto está funcionando a un error. Como una solución a este problema, ahora calculo ROW() en otra celda (en la misma fila, obviamente) y concateno dentro de mi INDIRECT(). Alternativamente, también he intentado encapsularlo dentro de una función de suma, como SUM(ROW()), y eso también funciona.

Me gustaría agradecer que alguien pudiera explicar (o señalarme un recurso que pueda explicar) por qué ROW() devuelve una matriz dentro de SUMPRODUCT() sin que se haya ingresado CSE.

Respuesta

6

pregunta interesante. Aquí hay cuestiones sutiles que no he visto documentar.

Parece INDIRECT("A"&ROW()) devuelve una matriz que consta de un elemento que es una referencia a una celda, no el valor en esa celda. Muchas funciones no pueden resolver este tipo de datos correctamente, pero algunas funciones como N y T pueden "eliminar la referencia" de la matriz y devolver el valor subyacente.

llevar este caso donde hay dos elementos de la matriz:

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

Esto devuelve A1 + A2 cuando array entró pero sólo devuelve A1 cuando entrado normalmente. Sin embargo, cambiar ROW (1: 2) a {1; 2} en esta fórmula devuelve el resultado correcto cuando se ingresa normalmente. La fórmula SUMPRODUCT equivalente devuelve A1 + A2 si la matriz ingresó o no.

Esto puede estar relacionado con la forma en que se registran los argumentos en la función. De acuerdo con http://msdn.microsoft.com/en-us/library/bb687900.aspx, existen esencialmente dos métodos para registrar argumentos de funciones para manejar tipos de datos de Excel:

Escriba R/U: "Valores, matrices y referencias de rango".

Tipo P/Q: "Excel convierte referencias de celda única a valores simples y referencias multicelulares a matrices al preparar estos argumentos."

Los argumentos SUM parecen ajustarse al tipo R/U, mientras que los argumentos SUMPRODUCT se comportan como tipo P/Q. Array-ingresar la fórmula SUM anterior obliga al argumento de referencia de rango en ROW a evaluarse como una matriz, mientras que esto ocurre automáticamente con SUMPRODUCT.

actualización

Después de un poco más de investigación, esto es una prueba más que podrían apoyar esta teoría. Basado en el enlace en el comentario, la fórmula = SUM ((A1, A2)) da los mismos valores como:

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

Registro el último argumento de tipo P cambiando 2JRJR-2JRJP da un error en este caso pero permite rangos de área única como !R1C1:!R2C1. Por otro lado, al cambiar el 4 (xlfsum) por el 228 (xlfsumproducto) solo se permiten referencias de área única de cualquier forma que se llame como SUMPRODUCT.

+0

+1 buena investigación! –

+0

+1 Esto es exactamente lo que necesitaba. La capacidad de 'desreferencia' de las funciones 'N()' y 'T()' me sorprende. De hecho, en la fórmula '= SUMPRODUCT (N (INDIRECT (" A "& ROW())))', la función 'N()' en realidad resuelve un error #VALOR (como se ve en la fórmula Evaluar, Excel 2003). Esto es extremadamente bueno saber Además, la información sobre los tipos de argumentos R/U y P/Q parece ser una buena explicación. El manejo de los elementos 'xlTypeNil' para los tipos P/Q parece coincidir con el comportamiento de' SUMPRODUCT() '. Gracias por una respuesta brillante. Nunca hubiera sabido qué hacer con Google. Merece un +10 !! – playercharlie

+0

Me alegro de que esto haya ayudado: Laurent Longre descubrió este comportamiento originalmente y mostró cómo puede usar la función LLAMAR con referencia a xlcall.h para las funciones de la hoja de trabajo: http://www.cpearson.com/excel/Call.htm. En VBA esto todavía se puede acceder a través de: 'ExecuteExcel4Macro'. –

2

Como ROW() devuelve una matriz, use INDEX para obtener el primer elemento.

Usted ejemplo, se convierte entonces en: =SUMPRODUCT(INDIRECT("A"&INDEX(ROW(),1)))

+0

Gracias por la respuesta. Usé la función 'SUM()' en lugar de la función 'INDEX()' y solucioné el problema. Sin embargo, estaba buscando una explicación de por qué tenía que hacer esto. – playercharlie

+0

Esta es la mejor respuesta para mí. El uso de INDEX() en la matriz resultante de ROW() utilizado dentro de SUMPRODUCT() es perfecto. Si la volatilidad se trata de un nuevo cálculo, no me molestará demasiado porque ahora la computadora es mucho más rápida. Hay muchos indirectos y offset usados ​​en mis libros de trabajo y estoy bien con hasta 1 segundo de retraso en el recálculo. Así que si alguna vez necesito usar ROW() dentro de SUMPRODUCT(), entonces INDEX() es una función obligada. Muchas gracias SeanC –

+0

Ah, y gracias por el truco de SUM() respondido por OP. Acorta la fórmula, y prefiero la más corta. Me pregunto si uno de ellos es más rápido. Quizás SUM() es más rápido porque no es volátil? –

1

No creo FILA() se comporta de manera diferente aquí, devuelve una matriz en ambos casos. Supongo que SUM y SUMPRODUCT tratan esa matriz de manera diferente, no estoy seguro de por qué.

Muchas funciones o combinaciones de ellas devuelven matrices - no necesita CTRL + MAYÚS + ENTRAR para que eso suceda, solo necesita CSE en muchos casos para procesar las matrices creadas.

me acaba de utilizar el índice en lugar del indirecta (que también se beneficia evitando una función volátil), es decir

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

....en expansión que a su rango de esta fórmula contará el número de valores> 1 en un intervalo en la columna A en la que x define la fila de inicio y y la fila final

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

x e y se puede calcular por las fórmulas

que es posible utilizar SUMPRODUCT o CONTAR.SI.CONJUNTO de una manera similar, si hay más condiciones para agregar

+0

Gracias por la respuesta. Usé la función 'SUM()' alrededor de la función 'ROW()', y solucioné el problema. Además, para mi problema particular, tuve que usar la función 'INDIRECT()', porque las referencias de celda se calculaban en otro lugar. Parece que lo has acertado cuando dices que CSE simplemente cambia el procesamiento de las matrices. @lori_m tiene una excelente respuesta sobre por qué 'SUM()' y 'SUMPRODUCT()' tratan las matrices de forma diferente. – playercharlie

Cuestiones relacionadas