miércoles, 20 de junio de 2018

Problemas con las referencias y función indirect

A veces me ha ocurrido que meto en una fórmula una referencia tal que así:

=iferror(join(char(10);filter(ekintzak!$F$2:$F;ekintzak!$G$2:$G=B4;len(ekintzak!$G$2:$G)>0)))

Es decir con referencias que empiezan en la línea 2, para que no cuente dentro del filtro las cabeceras de columna y...
si borro los datos y empiezo de nuevo a meterlos la fórmula, de forma casí a mala leche, va cambiando el principio de la referencia a la línea 3, luego a la 4, etc... justo con el resultado que nunca se referencia a los datos que existen, sino a los que no existen todavía. En mi caso haría esto:
  • Meto un dato en la línea 2 de la pestaña "ekintzak" 
  • La fórmula cambia a
 
=iferror(join(char(10);filter(ekintzak!$F$3:$F;ekintzak!$G$3:$G=B4;len(ekintzak!$G$3:$G)>0)))

Y si meto algo en la línea 3, la fórmula coherente y malignamente se convierte en:

=iferror(join(char(10);filter(ekintzak!$F$4:$F;ekintzak!$G$4:$G=B4;len(ekintzak!$G$4:$G)>0)))

El resultado es que nunca hay nada en el filtro que queremos que aparezca.

La solución que he encontrado es utilizar la función indirect. Gracias a ella, consiguo que el número 2 se mantenga siempre estático:



=iferror(join(char(10);filter(indirect("ekintzak!$F$"&2&":$F");indirect("ekintzak!$G$"&2&":$G")=B4;len(indirect("ekintzak!$G$"&2&":$G"))>0)))

Dicha función es muy potente, ya que permite crear referencias con mezcla de partes fijas y dinámicas y, en este caso, de partes fijas que no hacen caso a lo dinámico. Pero tiene dos inconvenientes:
  • No es fácil de construir, ya que hay que trozear las referencias, meter entre comillas el texto fijo, unirlo al dinámico con & y volver a abrir y cerrar comillas si hay mas texto fijo detrás.
  • Una vez escrita la función es difícil de interpretar
(Mientras escribía el artículo me he dado cuenta que podía haber metido todas las referencias dentro de indirect entre comillas, sin sacar el número y quedaría así:
=iferror(join(char(10);filter(indirect("ekintzak!$F$2:$F");indirect("ekintzak!$G$2:$G")=B4;len(indirect("ekintzak!$G$2:$G"))>0)))

por lo que, simplemente, gracias a indirect, he conseguido que las referencias no cambien de forma dinámica, sean totalmente estables y no les influyan los nuevos registros)

No hay comentarios:

Publicar un comentario

Crear PDF horizontal

El código que vamos a mostrar aquí no ha sido creado por nosotros, sino que lo hemos encontrado en Internet. Objetivo: Publicar una pesta...