2011-10-18 19 views
8

¿Hay alguna manera de obtener una matriz en Excel de un tamaño más pequeño que una matriz inicial en una función de hoja de cálculo de celda?¿Cómo se extrae un subcampo de una matriz en una función de hoja de cálculo?

Así que si tuviera:

{23, "", 34, 46, "", "16"} 

que iba a terminar con:

{23, 34, 46, 16} 

que luego podía manipular con alguna otra función.

Conclusión: Si tuviera que hacer un montón de estos, definitivamente usaría la solución UDF comb de jtolle. La fórmula que utiliza PPC está cerca, pero sumergiéndome y probando, descubrí que da errores en las ranuras vacías, falla en el primer valor y hay una manera más fácil de obtener los números de fila, así que aquí está mi solución final:

=IFERROR(INDEX($A$1:$A$6, SMALL(IF(($A$1:$A$6<>""),ROW($A$1:$A$6)),ROW(1:6))),"") 

que se debe ingresar como una fórmula de matriz (CTRL-SHIFT-ENTER). Si se muestra, debe ingresarse al menos en un área tan grande como el conjunto de resultados para mostrar todos los resultados.

+2

Voy a decir que no es posible sin un UDF. Estaré muy contento si alguien me demuestra que estoy equivocado. – Excellll

+0

Gran pregunta. Voy a señalar esto a un par de tipos de fórmula extrema, pero estoy de acuerdo con Excellll en este – brettdj

+0

@Excellll - una posible variación de fórmula se incluye a continuación que también podría usarse dentro de funciones como SUM(). –

Respuesta

5

Si todo lo que quiere hacer es tomar un subconjunto de una matriz, y ya sabe las posiciones de los elementos que desea, sólo se puede utilizar con una gran variedad INDEX para el argumento índice. Es decir:

=INDEX({11,22,33,44,55},{2,3,5}) 

devuelve {22,33,55}. Pero eso no suele ser muy útil porque no conoces las posiciones, y no conozco ninguna forma de obtenerlas sin un UDF.

Lo que he hecho para este tipo de filtración serie en la hoja de trabajo es escribir una UDF con la siguiente forma:

'Filters an input sequence based on a second "comb" sequence. 
'Non-False-equivalent, non-error values in the comb represent the positions of elements 
'to be kept. 
Public Function combSeq(seqToComb, seqOfCombValues) 

    'various library calls to work with 1xn or nx1 arrays or ranges as well as 1-D arrays 

    'iterate the "comb" and collect positions of keeper elements 

    'create a new array of the right length and copy in the keeper elements 

End Function 

sólo pseudocódigo publicado porque mi código real es todas las llamadas a funciones de biblioteca, incluyendo las operaciones de recolección y copia desde las operaciones. Probablemente oscurecería la idea básica, que es bastante simple.

que se podría llamar un UDF tales como tan:

=combSeq({23, "", 34, 46, "", "16"}, {23, "", 34, 46, "", "16"} <> "") 

o

=combSeq(Q1:Q42, SIN(Z1:Z42) > 0.5) 

y usar la mecánica de matriz normales de Excel para generar el "peine". Es una forma ligera y amigable para Excel de obtener muchos de los beneficios de la función más estándar filter(list-to-filter, test-function) que puede ver en otros sistemas de programación.

Utilizo el nombre "peine" porque "filtro" generalmente significa "filtro con esta función", y con Excel debe aplicar la función de prueba antes de llamar a la función de filtración. También puede ser útil calcular un "peine" como resultado intermedio y luego usarlo para ... er, peinar ... múltiples listas.

+0

Estaba pensando que tendría que ser algo así. Gracias por la respuesta completa. –

+0

@jtolle, me gustaría que tu solución INDEX ({11,22,33,44,55}, {2,3,5}) funcionara, pero para mí solo devuelve el primer valor, 22. No devuelve una matriz . ¿Has verificado que funciona? ¿Lo estoy haciendo mal? thx –

+0

@johnywhy, ¿lo ha ingresado como una fórmula de matriz, es decir, con "Ctrl-Shift-Enter"? También debe tener un rango seleccionado que sea lo suficientemente grande para devolver la matriz, o solo se mostrará tanto como haya espacio para. Haga una búsqueda en "excel array formula" para obtener más información sobre esto. – jtolle

5

Hay una respuesta en este sitio: http://www.mrexcel.com/forum/showthread.php?t=112002. No mucha explicación sin embargo.

Suponiendo que tiene datos con celdas en blanco en la columna A y coloca esto en la columna B; que va a recuperar los datos en el mismo orden saltarse los espacios en blanco

=INDEX( $A$1:$A$6, 
     SMALL( 
      IF(
       ($A$2:$A$6<>""), 
       ROW($A$2:$A$6) 
      ), 
     ROW()-ROW($B$1) 
     ) 
    ) 

Aquí está la explicación:

  • FILA() - FILA ($ B $ 1) es sólo un truco que le dará que un número incremental (es decir, 1 de B1, B2 en 2 ...)
  • SI (..., FILA ($ a $ 2: $ a $ 6)) es la parte principal del truco: se construye una matriz de la fila n umbers donde la condición IF es verdadera (tenga en cuenta que el SI no tiene valor 'otra cosa')
  • PEQUEÑO (..) devolverá el Xº valor más pequeño de esa matriz (en nuestro caso el número de la X no están en blanco fila), donde X es el número de fila de la celda actual (1 en B1 ...)
  • ÍNDICE entonces traducir del número de fila de su valor
  • Tenga en cuenta que ÍNDICE yFILA inicio de una fila por encima de la tabla real de tener siempre un desplazamiento> 0 (INDICE no le gusta ceros)
+0

FILA() - FILA ($ B $ 1) también se puede escribir como FILAS ($ B $ 1: B1).Otro truco, el mismo trabajo – PPC

+0

¡Agradable! Si solo Excel incluyera algún tipo de función de filtro incorporada, este tipo de fórmula de gimnasia no sería necesaria ... – jtolle

+0

@jtolle: En algunos casos, puede agregar sus fórmulas personalizadas como macros. Por "En algunos casos", quiero decir "si sus clientes no se asustan cuando escuchan la palabra" – PPC

1

Una posible solución función de hoja:

=INDEX(A1:A6,N(IF(1,MODE.MULT(IF(A1:A6<>"",ROW(1:6)*{1,1}))))) 

La función MODE.MULT devuelve una matriz reducida de índices y N(IF(1,.)) se inserta de modo que la matriz se pasa por referencia a la función INDEX.

+0

Esto se ve muy interesante. Un problema hasta el momento es que incluso envolviendo esto en una declaración IFERROR, como el ÍNDICE de mi solución, sigo recibiendo los errores # N/A en los espacios en blanco. Me encantaría una buena explicación de cómo funciona esta construcción, un enlace estaría bien. –

+0

Para ingresar en una matriz múltiple, intente de esta manera: 'IFERROR (IF (1, )," ")'. Buscando en Google 'Excel" N (IF (1, "' devuelve algunos enlaces pero no he encontrado una buena explicación para este comportamiento exacto, la traducción de algunas publicaciones en chino también puede dar una idea adicional. –

+0

ver también: http: //www.mrexcel.com/forum/excel-questions/904661-returning-sub-arrays-using-index.html –

Cuestiones relacionadas