Reclasificación contable: duplicar cada fila con una conversión distinta por columna, en un único bloque

Interesante reto contable planteado esta semana por un miembro de la comunidad. Juan parte de una tabla de apuntes contables (rango C7:P10) y necesita que, por cada fila original, se generen dos filas en un único bloque dinámico: la original y su reclasificación. En la fila reclasificada algunas columnas se intercambian (donde ponía "sga" pasa a "pendiente imputar" y al revés), se fija una cuenta contable concreta y el importe se invierte de signo. Lo tenía resuelto creando un rango por cada cambio, pero buscaba una sola fórmula escalable.

La comunidad propuso tres caminos distintos para el mismo resultado.

Versión base con APILARH y vector de signos

``
=LET(
_rango; C7:P10;
AJUSTARFILAS(
ENCOL(
APILARH(
_rango;
SI.ERROR(_rango{1\1\1\1\1\1\1\1\1\1\-1\1\1\1}; _rango)
)
);
14
)
)
`

Apila el rango original junto a una copia multiplicada por un vector donde 1 mantiene el valor y -1 invierte el signo (la columna del importe). SI.ERROR deja intacto el texto que no se puede multiplicar. Después, APILARH + ENCOL + AJUSTARFILAS(...;14) reconstruye el bloque intercalando original y reclasificación.

Versión configurable columna a columna

Para no tener que tocar la fórmula cada vez, un vector _conv decide qué hace cada columna: 1 mantiene el valor, -1 lo invierte, y un texto entre comillas fija un valor (una etiqueta o una cuenta como 70000000).

`
=LET(
_rango; C7:P10;
_conv; {1\"Reclasificar"\1\"Reclasificar"\1\"Reclasificar"\"70000000"\1\1\1\-1\1\1\1};
AJUSTARFILAS(
ENCOL(
APILARH(
_rango;
SI(ESTEXTO(_conv); _conv; SI.ERROR(_rango_conv; _rango))
)
);
14
)
)
`

La clave es ESTEXTO(_conv): distingue las columnas que se fijan con un texto de las que se calculan numéricamente. Así el comportamiento de cada columna se controla solo editando el vector, sin tocar la estructura.

Enfoque con SECUENCIA e INDICE

John planteó una alternativa que construye directamente las 14 columnas del resultado, posicionando cada celda con INDICE y usando la paridad de la fila (ES.PAR) para decidir si toca el original o la reclasificación:

`
=LET(d;C7:P10;t;SECUENCIA(2FILAS(d));s;SECUENCIA(;14);n;INDICE(d;ENTERO((t+1)/2);s+4(s=2)-4(s=6));SI(ES.PAR(t);SI((s<7)ES.PAR(s);"Reclasificacion";SI(s=11;-n;n));n))
`

Tres caminos para el mismo objetivo: uno directo con vector de signos, otro totalmente configurable por columna, y otro que reconstruye la rejilla con SECUENCIA e INDICE`. El fichero adjunto incluye el planteamiento original y el libro con las soluciones.

El reto

Juan trae a la comunidad un caso contable muy habitual: parte de una tabla de apuntes (rango C7:P10) y necesita que, por cada fila original, aparezcan dos filas en un único bloque dinámico: la original y su reclasificación. En la fila reclasificada algunas columnas se intercambian, se fija una cuenta contable concreta y el importe cambia de signo. Lo tenía resuelto creando un rango por cada cambio, pero buscaba una sola fórmula que escalara sola.

La comunidad propuso tres caminos distintos para el mismo resultado.

Enfoque 1: apilar y aplicar un vector de signos

La primera idea apila el rango original junto a una copia suya. Esa copia se multiplica por un vector de constantes con una posición por columna: donde vale uno el valor se mantiene, y en la columna del importe vale menos uno para invertir el signo. Como el texto no se puede multiplicar, se envuelve en SI.ERROR para que las etiquetas queden intactas.

Después, APILARH pega original y copia lado a lado, ENCOL lo convierte en una sola columna y AJUSTARFILAS(...;14) reconstruye el bloque de 14 columnas intercalando cada fila con su reclasificación. Toda la lógica vive dentro de un LET que nombra el rango una sola vez.

Enfoque 2: configurable columna a columna

Multiplicar por signos funciona, pero obliga a tocar la fórmula si cambian las reglas. La segunda versión usa un vector de configuración donde cada columna declara qué hacer: mantener el valor, invertir el signo, o fijar un texto (una etiqueta como "Reclasificar" o una cuenta como 70000000).

La pieza clave es ESTEXTO: distingue las columnas que se fijan con un texto de las que se calculan como número. Así el comportamiento de cada columna se controla solo editando el vector, sin cambiar la estructura de la fórmula. Es la versión que mejor escala cuando el criterio contable evoluciona.

Enfoque 3: reconstruir la rejilla con SECUENCIA e INDICE

John propone algo distinto: en lugar de apilar, construye directamente las 14 columnas del resultado. Genera las filas con SECUENCIA, posiciona cada celda con INDICE, y usa la paridad de la fila (ES.PAR) para decidir si toca mostrar el dato original o el reclasificado. Un mismo INDICE recoloca las columnas que se intercambian aplicando un desplazamiento según la posición.

Funciones clave

  • LET: nombra el rango y los pasos intermedios para leer la fórmula de un vistazo.
  • APILARH y APILARV: unen matrices en horizontal y en vertical.
  • ENCOL: aplana una matriz a una sola columna.
  • AJUSTARFILAS: repliega esa columna en un bloque con el número de columnas deseado.
  • SI.ERROR y ESTEXTO: separan lo que es texto de lo que es número, la base para tratar cada columna de forma distinta.
  • SECUENCIA, INDICE y ES.PAR: permiten construir la rejilla posición a posición.

Conclusión

El mismo objetivo —duplicar cada fila con una conversión distinta por columna, en un único bloque dinámico— admite tres filosofías: multiplicar por un vector de signos, declarar la conversión columna a columna, o reconstruir la rejilla desde cero. La segunda es la más mantenible; la tercera, la más didáctica para entender cómo se coloca cada celda. Casos como este surgen cada semana en la comunidad de Influexcel, donde un problema real acaba teniendo tres soluciones elegantes. El fichero adjunto incluye el planteamiento y el libro con las soluciones.

Más contenido de Excel en InflueXcel