Saltar al contenido

Enumerar combinaciones sin repetición usando funciones de hoja de cálculo.


jrgces

Recommended Posts

publicado

Hace algunas semanas hubo una consulta sobre cómo generar todas las combinaciones posibles en grupos de 5 mediante una macro, pero durante la discusión se tuvo que descartar la posibilidad de usar código VBA porque quien inició la consulta utiliza un mac y no le corría la macro.

En mi primera respuesta ( https://www.ayudaexcel.com/foro/excel-general-6/macro-que-genere-todas-combinaciones-posibles-5-numeros-25551/#post125849 ) contesté que para mí el principal problema era que no podía imaginar una fórmula que devolviese tan sólo las combinaciones sin repetición con el número de elementos deseado. Ofrecí una solución basada en fórmulas matriciales que devolvían (utilizando números binarios como base para las combinaciones) TODAS las combinaciones (o sea, las de 1 elemento, 2 elementos, 3 elementos...)

No he dejado de darle vueltas al tema desde entonces, y al final creo haber encontrado una solución que devuelve tan sólo las combinaciones con el número de elementos deseado. La mejora es muy importante, ya que el caso extremo que puede manejar Excel mediante fórmulas (combinaciones de 15 elementos), requeriría fórmulas en 32767 filas (2^15-1) usando la técnica que utilicé en ese hilo, pero como máximo sólo 6435 utilizando la técnica que describiré a continuación:

En una columna ponemos el conjunto de elementos que deseamos combinar, hasta un máximo de 15 (en el libro de ejemplo adjunto están en Elementos_a_combinar!A1:A15. En una celda cualquiera (en el ejemplo es Binarios!A1) ponemos tantos unos como elementos deseemos que tengan las combinaciones (es decir, si por ejemplo deseamos que cada combinación tenga 5 de esos n elementos pondríamos el número 11111).

Las fórmulas que van calculando las combinaciones sucesivas están a partir de Binarios!A2, hasta A6435. Este número de filas tan sólo sería necesario en los dos casos más extremos de entre todos los posibles, esto es un conjunto de 15 en combinaciones de 7 u 8. Para los demás casos sobrarán fórmulas, así que se pueden quitar. De todas formas, hay un formato condicional para que se muestren en rojo las celdas que ya no son necesarias. La celda Binarios!C4 calcula el número de celdas que deberían tener la fórmula. Todo el rango Binarios!A2:A6435 tiene fórmulas matriciales.

En la columna A de la hoja Combinaciones se añaden ceros a la izquierda de los números binarios que hay en la hoja Binarios para completar el número de elementos. El rango C1:Q6435 de esta hoja tiene las fórmulas para que aparezcan los elementos que componen cada combinación. Como en el caso de la hoja Binarios, las filas que superan el número de combinaciones necesario se muestran en rojo y pueden ser eliminadas si se han de enumerar combinaciones para menos de 15 elementos).

Las "tripas" de todo el sistema están en el rango con nombre Números_a_sumar (Binarios!I1:I56). Esta lista de números son todos los que pueden producir el siguiente número con tantos unos como el precedente al serle sumados, siendo ceros todos los demás dígitos. Por ejemplo, si en Binarios!A1 ponemos 11111, el siguiente número con 5 unos será lógicamente el 101111, es decir 11111+9000. Lo que hacen las fórmulas es averiguar cuál es el más pequeño de los números obtenidos al sumar a la celda precedente cada uno de los números que pueden producir “binarios” (en realidad son números base 10 --puesto que Excel trabaja en esta base-- pero constituidos tan sólo por unos y ceros).

Siguiendo con el ejemplo, el siguiente número tras 101111 con 5 unos es lógicamente el 110111 (101111+900). Hay casos en los que se obtiene más de un “binario”. Por ejemplo, con el 1100111 se obtiene tanto el 1101011 (1100111+900) como el 10100111 (1100111+9000000). De ahí que la fórmula escoja, utilizando la función MIN, el más pequeño de esos “binarios”.

Si fuesen menos de 15 elementos se podrían eliminar números en el rango con nombre Números_a_sumar. Por ejemplo, si se fuesen a combinar 10 elementos se podrían eliminar las filas 26 a 56, con lo que quizás se ganaría algo de rendimiento, aunque la verdad es que no lo comprobado.

Lógicamente, si en Binarios!A1 se pone un “binario” cualquiera, las filas siguientes mostrarán las combinaciones a partir de ese número (es decir, si por ejemplo ponemos 11011 las filas sucesivas mostrarán 11101, 11110, 100111, etc.) En este caso el cálculo devuelto por la función COMBINAT en C4 no sería correcto, pero las celdas superfluas en la columna A sí se seguirían mostrando en rojo.

El límite de 15 elementos está determinado por la precisión numérica máxima de Excel (15 dígitos + el signo), y hasta donde yo sé no puede ser superado usando funciones de hoja de cálculo.

Saludos.

Nota: el .zip pesa 272 Kb. así que no puedo subirlo. Lo he puesto en Listar_combinaciones_mediante_suma.zip

Listar_combinaciones_mediante_suma.zip

publicado

Hola jrgces,

Me ha parecido muy ingenioso usar un contador binario para detectar los elementos únicos. Ya los había usado alguna vez para otro tipo de contadores pero de esto que te has montado no se me había pasado por la cabeza.

Te dejo mi propia versión pero sin formulas matriciales. He adaptado una fórmula que en su día subí como aporte: https://www.ayudaexcel.com/foro/ideas-aportes-64/contador-binario-formula-basada-posicion-celda-14279/

Es tu mismo archivo en donde le he agregado 2 hojas manteniendo solo la hoja Elementos_a_combinar. Lo he adaptado para que haga lo mismo que tu archivo, tan solo quedan arrastrar las primeras 20 columnas hasta 2^16=65536, y luego las columnas V:BB hasta que empiezen a soltar errores. La hoja "Panel" es un tanto chorra, tan solo sirve para decir el numero de combinaciones y esta puesto a 3 como en tu ejemplo asi que en realidad todo lo hace la hoja BinaryCont.

En esta versión no existen límites, los limites los pone la versión del Excel que uses, a mas filas, mas combinaciones. Al ser una formula independiente, el contador binario puede ser de tantos dígitos como quieras, así como los elementos. Tan solo tendrías que reajustar algunos números en las 3 formulas principales y añadir o quitar más columnas.

Saludos.

Listar_combinaciones_mediante_suma binarios_VZS.xls

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      187
    • Comentarios
      97
    • Revisiones
      28

    Más información sobre "Un juego del Rabino en Excel"
    Última descarga
    Por pegones1

    1    1

  • Crear macros Excel

  • Mensajes

    • Perdona @Abraham Valencia pero he estado liado estos días. En realidad todo el problema se reduce a estos dos problemas: Problema 1: El script que "fabrica" SAP y que luego "pego" en la macro, no es capaz de  guardar archivos en SharePoint. He estado buscando, y en realidad muchas personas tienen ese problema (no poder guardar un Excel en SAP a través de VBA). Eso muy probablemente sean problemas de permisos, que no puedo cambiar (no soy administrador de nada). Como no puedo solucionarlo así, paso al plan B, que es guardar en Excel que me genera SAP en el ordenador de cada usuario que ejecute la plantilla (y que sí está guardada en SharePoint), para después con PowerQuery llamar a ese Excel (el export). Para ello, pretendo guardar el export, en la ruta relativa "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" donde los \..\..\..\ saltan las rutas personales de cada usuario (tipo C:\users\IDusuario\). Eso lo hace bien, y el archivo se guarda en la ruta de cada usuario que lo usa, pero surge el problema 2 Problema 2: PowerQuery no trabaja con rutas relativas del tipo  "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" necesita que sea del tipo fija "C:\users\IDusuario\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" pero claro, IDusuario es diferente para cada usuario.   Pero escribiendo todo esto, creo que he dado con una posible solución, no grabar el export en una ruta de usuario, sino en una en la raiz de C:, que siempre será igual para todos los usuarios, del tipo C:\Sap\export.xlsx que seria igual en todos los ordenadores. Asi sí podría decirle a PowerQuery que vaya siempre a la ruta C:\Sap\ que existirá en todos los ordenadores. Mañana intentaré hacer pruebas, aunque mi solución ideal seria que se pudiera guardar en el SharePoint. Saludos.
    • Hola La opción brindada por @torquemada es correcta, funciona, pero hay algunos inconvenientes que (desde mi punto de vista) no la convierten en mi primera elección. Los inconvenientes son: Tendrías que ir columna por columna haciendo los reemplazos, claro que no se harían a mano sino que utilizarías la opción reemplazar o la opción texto en columnas, aun asi demorará un poquito y será trabajoso. Cada vez que descargues otro listado, tendrás que volver a realizar los reemplazos. Me parece una mejor propuesta lo siguiente: Descarga los movimientos a un archivo de Excel Desde tu control de pagos (otro archivo) cargas los movimientos del archivo descargado mediante Power Query Power Query hará los reemplazos y reconocerá todo correctamente (sin que tengas que hacer nada especial) Cuando descargues los movimientos un día posterior, solamente tendrás que hacer clic en "Actualizar" y todo funcionará en automático
    • Hola a todos, Efectivamente, me temo que tal como trabajan las funciones =HOY() y/o =AHORA() (volátiles), sólo con macros puedes obtener soluciones. Un recurso pedestre podría ser, cada vez que quieras que se fije un dato, te sitúes en esa celda y pulses F2, F9 e INTRO.  Pero claro, puede ser un inconveniente si hay que hacerlo repetitivamente en muchas ocasiones,.............. en fin, lo comento sólo como posibilidad. Saludos,
    • Hola nuevamente, mi duda sigue siendo la ruta, o rutas, finales que quedan, esas que llamas "relativas"; igual por si acaso pon 3 o 4 de esas, tal cual son y/o se ven en el explorador de cada PC y, de ser posible, en cualquier otro "lado" en que las veas.
    • Hola, tal cual se plantea, solamente con macros (VBA); en todo caso, hacerlo a mano o con "CTRL + ;". Saludos.
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.