Simulaciones genéticas VBA: usar UserForm para pasar variables a una macro y ejecutarla
publicado
Hola a todos,
sigo con mis macros para simulaciones genéticas. La última que he escrito permite simular el cruce de dos poblaciones. Para ejecutarse necesita que el usuario proporcione información (elegir de entre las poblaciones creadas cuáles son las dos poblaciones a cruzar, cuántos descendientes de cada genotipo se quieren obtener y cómo se va a llamar la nueva población). A parte, se deben de hacer dos comprobaciones previas a la ejecución de la macro (que las dos poblaciones a cruzar tengan el mismo número de genotipos y que no se elija por error dos veces la misma población). Creo que lo más adecuado es utilizar un UserForm para recabar esta información del usuario. El problema es que no se usarlos bien y no se como pasar a la macro las variables que recogen esta información del usuario desde el UserForm. Adjunto un archivo comprimido. En el archivo hay varias hojas. Las dos primeras (Poblaciones y Caracteres) son las que utilizo para generar poblaciones y asignar características a los genotipos respectivamente. La idea es que la macro acabe ejecutándose al pulsar un boton (Cruzamientos específicos) que hay en la hoja Poblaciones. Para comprobar que la macro (Cruzar2Poblaciones, que está en el módulo Reproducción) se ejecuta correctamente he añadido dos poblaciones de ejemplo (HT_P1 y HT_P2) con 5 genotipos cada una. En la macro se han especificado los nombres de estas hojas para trabajar con ellas, pero la idea es que esta información se elija en el UseForm. Para ejecutar la macro, de momento, hay que hacerlo desde la ventana de ejecución de macros no desde el botón. He añadido otra hoja de ejemplo (c3) que es el resultado de aplicar la macro a las dos poblaciones anteriores. En este ejemplo, como lo que queria eran 3 descendientes/genotipo al cruzar las dos poblaciones iniciales, lo que la macro ha hecho es generar 2 pares de gametos/genotipo, generar una nueva hoja de población (c3) y pegar en ella los gametos que ha "cortado" previamente de las dos poblaciones iniciales para la dar la tercera. Finalmente borra en las poblaciones de partida el juego de gametos no usado. La macro funciona bien a falta de añadir la funcionalidad del UserForm. Este (Seleccionar2PoblacionesCruce) lo he empezado a diseñar pero me falta el codigo necesario para que funcione en conjunto con la macro (esto es lo que no se hacer). También me gustaría saber como puedo proteger las dos hojas principales (Poblaciones y Caracteres) para que los usuarios no puedan borrarlas accidentalemente. El fichero es:
Espero vuestros cometarios y gracias por vuestra atención. Como la idea principal sigue sindo aprender, se agradecerá mucho cualquier comentario que mejore o simplifique lo que he hecho (seguro que se os ocurren cosas).
PD: En el archivo hay otras macros, si tal como está resulta confuso, decidmelo e intento eliminar cosas.
PD2: @Antoni, espero que te guste como va quedando, he hecho algunas modificaciones a contribuciones anteriores tuyas (creo que no he estropeado nada).
Hola a todos,
sigo con mis macros para simulaciones genéticas. La última que he escrito permite simular el cruce de dos poblaciones. Para ejecutarse necesita que el usuario proporcione información (elegir de entre las poblaciones creadas cuáles son las dos poblaciones a cruzar, cuántos descendientes de cada genotipo se quieren obtener y cómo se va a llamar la nueva población). A parte, se deben de hacer dos comprobaciones previas a la ejecución de la macro (que las dos poblaciones a cruzar tengan el mismo número de genotipos y que no se elija por error dos veces la misma población). Creo que lo más adecuado es utilizar un UserForm para recabar esta información del usuario. El problema es que no se usarlos bien y no se como pasar a la macro las variables que recogen esta información del usuario desde el UserForm. Adjunto un archivo comprimido. En el archivo hay varias hojas. Las dos primeras (Poblaciones y Caracteres) son las que utilizo para generar poblaciones y asignar características a los genotipos respectivamente. La idea es que la macro acabe ejecutándose al pulsar un boton (Cruzamientos específicos) que hay en la hoja Poblaciones. Para comprobar que la macro (Cruzar2Poblaciones, que está en el módulo Reproducción) se ejecuta correctamente he añadido dos poblaciones de ejemplo (HT_P1 y HT_P2) con 5 genotipos cada una. En la macro se han especificado los nombres de estas hojas para trabajar con ellas, pero la idea es que esta información se elija en el UseForm. Para ejecutar la macro, de momento, hay que hacerlo desde la ventana de ejecución de macros no desde el botón. He añadido otra hoja de ejemplo (c3) que es el resultado de aplicar la macro a las dos poblaciones anteriores. En este ejemplo, como lo que queria eran 3 descendientes/genotipo al cruzar las dos poblaciones iniciales, lo que la macro ha hecho es generar 2 pares de gametos/genotipo, generar una nueva hoja de población (c3) y pegar en ella los gametos que ha "cortado" previamente de las dos poblaciones iniciales para la dar la tercera. Finalmente borra en las poblaciones de partida el juego de gametos no usado. La macro funciona bien a falta de añadir la funcionalidad del UserForm. Este (Seleccionar2PoblacionesCruce) lo he empezado a diseñar pero me falta el codigo necesario para que funcione en conjunto con la macro (esto es lo que no se hacer). También me gustaría saber como puedo proteger las dos hojas principales (Poblaciones y Caracteres) para que los usuarios no puedan borrarlas accidentalemente. El fichero es:
https://1drv.ms/u/s!ArSI6ZjR1bGVlNQLYTkasQUbmiR-4A
Espero vuestros cometarios y gracias por vuestra atención. Como la idea principal sigue sindo aprender, se agradecerá mucho cualquier comentario que mejore o simplifique lo que he hecho (seguro que se os ocurren cosas).
PD: En el archivo hay otras macros, si tal como está resulta confuso, decidmelo e intento eliminar cosas.
PD2: @Antoni, espero que te guste como va quedando, he hecho algunas modificaciones a contribuciones anteriores tuyas (creo que no he estropeado nada).