none
[Excel 07] Qué combobox ha lanzado el evento Change? RRS feed

  • Pregunta

  • Buenas,
    antes de nada gracias por vuestros apoyos y respuestas a nuestras torpes preguntas, que intentamos compensar con timidas respuestas :P

    al lio, estoy preparando una hoja de cálculo en MExcel2007 con varias listas desplegables (o combobox) que todas van a hacer lo mismo. Por simplificar, imaginaros la tipica lista de preguntas, donde las respuestas pueden ser;
    A favor,
    En contra o
    No aplica
    , por ejemplo.
    Basandose en la selección, la casilla de al lado del combo se iluminará en
    verde,
    rojo o
    gris
    respectivamente.

    Bien, ya he conseguido (bufff) asignar el evento change() a los combos, y recoger el valor seleccionado. Ahora lo que quiero es tener una sola función que responda al este evento y reciba como parámetro qué objeto ha lanzado el evento (algo como en VB.NET "combobox_selectedIndexChanged(sender, eventArgs)" ), ¿porque? para tener la posición del combo y poder iluminar la celda de su lado, como he dicho antes.

    se puede hacer esto? como?
    gracias,
    un saludo.
    lunes, 30 de noviembre de 2009 16:00

Respuestas

  • hola, Robert !

    en relalcion con la "no-copia" del objeto incrustado al copiar "la fila" se debe a que los controles ActiveX pertenecen a la coleccion de objetos de la libreria MS.Forms y no a la coleccion de objetos "nativos" de excel

    puedes incrustar controles ActiveX via codigo, determinando previamente la posicion donde se insertara, y el codigo seria +/- parecido a lo siguiente:

      ActiveSheet.OLEObjects.Add _
        ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False, _
        Left:=162, Top:=120.75, Width:=69, Height:=18.75

    con relacion a la administracion de los eventos de varios controles en pocas lineas...
    podrias usar modulos "de clase" para administrar un solo evento para todos los controles del mismo tipo
    esta pagina de Chip Pearson es muy completa en cuanto a la informacion relativa a los modulos de clase...

    -> Events And Event Procedures In VBA
        http://www.cpearson.com/Excel/Events.aspx

    -> revisa +/- a la mitad de la pagina en adelante las siguientes secciones (entre otras):
        Declaring WithEvents Variables
        Which Is Better, ThisWorkbook Or CExcelEvents?
        Multiple Events Being Called
        Creating Your Own Events In Class Modules

    esta pagina tambien contiene informacion relevante al respecto

    -> Introduction To Classes
        http://www.cpearson.com/Excel/Classes.aspx

    si cualquier duda (o informacion adicional)... comentas ?
    saludos,
    hector.

    • Marcado como respuesta Robert BC miércoles, 2 de diciembre de 2009 8:33
    martes, 1 de diciembre de 2009 21:12

Todas las respuestas

  • hola, Robert !

    estoy suponiendo que los combos son objetos incrustados en "la hoja" de calculo (?)

    todos los objetos incrustados tienen una propiedad <obj>.TopLeftCell que indica cual es la celda que "toca" la esquina superior izquierda de ese objeto, entonces...

    si ya tienes codigo en el evento '_change' puedes aprovechar esta propiedad para indicar cual es "la celda" que pretendes "iluminar", porque no es claro cual es, en relacion con el objeto, "la celda de su lado" (la celda de arriba ?, a la izquierda ?, a la derecha ?, abajo ?)

    identificada con precision cual es "la celda de su lado", podrias hacer referencia a ella con un .Offset(... ???)

    si cualquier duda (o informacion adicional)... comentas ?
    saludos,
    hector.
    martes, 1 de diciembre de 2009 6:17
  • Buenas Héctor, gracias por responder,

    el ejemplo que había propuesto era simplemente para enterdernos; sí, son objetos incrustados, la idea que intentaba representar era algo así:

    [Pregunta sobre tus gustos]      [Combo con las posibles respuestas]     [Celda a iluminar ]

    con lo que, efectivamente, la celda que se iluminará será la del lado derecho del combo. Pero mi pregunta es si se pueden enlazar varios combos con el mismo manejador de eventos. Es decir tener una sola función OnChange(), la cual reciba como parámetro qué objeto ha lanzado el evento, y que responda a todos los combos de la hoja.

    Pero he estado viendo que posiblemente no se pueda hacer, así que gracias a tu aportación, he pensado una solución alternativa.

    Tengo la misma bateria de preguntas y debajo de la última, un botón que al pulsarlo; inserta una fila, copia la última pregunta y la pega en la fila creada (vamos, duplica la última fila debajo de esta). Funciona perfectamente, pero no me está copiando los objetos incrustados, este es el código (que responde al evento OnClick() de un botón):

    cellabut = ButtonCpRow.TopLeftCell.Address
    fila = Range(cellabut).Row
    
    Rows(fila & ":" & fila).Select
    Selection.Insert Shift := xlDown
    
    Rows(fila - 1 & ":" & fila - 1).Select
    Selection.Copy
    
    Range(fila & ":" & fila).Select
    ActiveSheet.Paste
    
    Application.CutCopyMode = False


    entonces nuevamente recurro al foro, porqué no me copia también los objetos incrustados?

    me he fijado que el único modo de copiar estos objetos "a mano" es estando en "modo diseño" (bajo excel 2007), se puede hacer algo parecido via macro?


    gracias de antemano,
    un saludo
    martes, 1 de diciembre de 2009 16:32
  • hola, Robert !

    en relalcion con la "no-copia" del objeto incrustado al copiar "la fila" se debe a que los controles ActiveX pertenecen a la coleccion de objetos de la libreria MS.Forms y no a la coleccion de objetos "nativos" de excel

    puedes incrustar controles ActiveX via codigo, determinando previamente la posicion donde se insertara, y el codigo seria +/- parecido a lo siguiente:

      ActiveSheet.OLEObjects.Add _
        ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False, _
        Left:=162, Top:=120.75, Width:=69, Height:=18.75

    con relacion a la administracion de los eventos de varios controles en pocas lineas...
    podrias usar modulos "de clase" para administrar un solo evento para todos los controles del mismo tipo
    esta pagina de Chip Pearson es muy completa en cuanto a la informacion relativa a los modulos de clase...

    -> Events And Event Procedures In VBA
        http://www.cpearson.com/Excel/Events.aspx

    -> revisa +/- a la mitad de la pagina en adelante las siguientes secciones (entre otras):
        Declaring WithEvents Variables
        Which Is Better, ThisWorkbook Or CExcelEvents?
        Multiple Events Being Called
        Creating Your Own Events In Class Modules

    esta pagina tambien contiene informacion relevante al respecto

    -> Introduction To Classes
        http://www.cpearson.com/Excel/Classes.aspx

    si cualquier duda (o informacion adicional)... comentas ?
    saludos,
    hector.

    • Marcado como respuesta Robert BC miércoles, 2 de diciembre de 2009 8:33
    martes, 1 de diciembre de 2009 21:12
  • Amazing!
    Gracias Héctor!

    he visto por encima las páginas y es lo que andaba buscando, me pongo a investirgarlo mas a fondo, y os comento,
    aunque de momento esto queda resuelto,
    no obstante no dudes que vuelva a daros la brasa dentro de poco, dado mi completo desconocimiento de la aplicación e ineptitud general :P

    un saludo!
    miércoles, 2 de diciembre de 2009 8:33