miércoles, octubre 08, 2008

Cuadro de texto flotante en Excel

En ésta y en las siguientes notas me ocuparé de responder a consultas que recibo con cierta frecuencia de mis lectores. Una de ellas es cómo crear un cuadro de texto flotante en una hoja de Excel.
La idea es crear un cuadro de texto flotante que se actualice de acuerdo al valor presente en una celda o en un rango de ellas.
Empecemos por el caso más sencillo: un cuadro de texto flotante ligado a una única celda.

Para ligar el valor de la celda A1 a un cuadro de texto empezamos por crear el cuadro de texto con el icono correspondiente de la barra de dibujo. Luego, con el cuadro de texto seleccionado, introducimos manualmente la referencia a la celda A1 en la barra de fórmulas



A partir de ese momento todo valor en la celda A1 parecerá automáticamente en el cuadro de texto.

Para convertirlo en flotante programamos un evento, de manera que el cuadro siempre aparezca en la vecindad de la celda activa en la hoja. En el módulo de la hoja correspondiente ponemos este código

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Shapes("Text Box 1").Top = Target.Top
End Sub


Este método no crea un cuadro realmente flotante, ya que si navegamos en la hoja usando la barra de navegación, la rueda del Mouse o cualquier otro método que no implique seleccionar una celda en la zona visible de la hoja, el cuadro desaparece junto con la celda activa. Pero basta con seleccionar una celda en la zona visible para que el cuadro vuelva a aparecer.

Para complicar un poco las cosas supongamos que queremos ligar no una celda sino un rango de celdas al cuadro de texto.
Posiblemente estén tentados a emplear el método descrito más arriba poniendo a la referencia al rango. Por ejemplo, supongamos que tenemos una tabla en el rango A1:A6 con los datos de ventas de cinco años



Al apretar Enter veremos que sólo el contenido de A1 (o de la celda superior izquierda del rango) aparece en el cuadro de texto.
La solución es usar la herramienta llamada cámara fotográfica de Excel. Lo primero que hacemos es poner el icono de la cámara fotográfica en alguna de las barras de herramientas, tal como lo explico en la nota del enlace.
Seleccionamos el rango A1:A6 y apretamos el icono de la cámara



El marcador del Mouse se tomará la forma de una cruz pequeña. Señalamos algún área de la hoja para pegar la imagen generada por la cámara



En la barra de fórmulas podemos ver que Excel ha creado una referencia absoluta al rango. Cada vez que cambiemos algún valor en el rango, éste se reflejará automáticamente en la imagen.

Ahora tenemos que adaptar el código del evento para que se refiera a este objeto. Al seleccionar la imagen el nombre del objeto aparece en el cuadro de nombres



Pero estamos usando la versión en castellano de Excel y Visual Basic sólo "habla" ingles. Así que tenemos que a averiguar el nombre en inglés. Una forma de hacerlo es grabar una macro en la cual seleccionamos el objeto (cuidándonos que antes de empezar a grabar la imagen no esté seleccionada). En nuestro caso el nombre es, obviamente, "Picture 2" (=Imagen 2 que aparece en el cuadro de nombres).
El código del evento Worksheet_SelectionChange será ahora

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Shapes("Picture 2").Top = Target.Top
End Sub


Como en el caso del cuadro de texto, la imagen aparecerá siempre en la vecindad de la celda activa en la hoja.

Esta técnica puede ser útil cuando queremos que ciertos datos estén permanentemente visibles sin necesidad de movernos en la hoja todo el tiempo.

Actualización: una técnica mejorada para que el objeto se desplace también horizontalmente puede verse en esta nota


Technorati Tags:

15 comentarios:

  1. Solamente darte la enorabuena. Hacia tiempo que nadie me enseñaba nada nuevo en Excel y nunca le había encontrado utilidad real a los cuadros de texto. Realmente me has sorprendido. Muchas gracias.

    ResponderBorrar
  2. Me parece fantástico como todo lo que hay en este blog. Noto un problema con el cuadro flotante: sólo se desplaza de arriba abajo, pero no hacia los laterales. ¿Estaré cometiendo algún error? Si no es así, ¿Hay forma de hacer que la movilidad sea en los cuatro sentidos?
    Gracias

    ResponderBorrar
  3. Hola Luis

    no, no te estás equivocando. Como pongo en la nota, no estamos creando un cuadro flotante verdadero. Pero podemos mejorar el código del evento para que también se desplace lateralmente. En breve publicaré una breve nota sobre el tema.

    ResponderBorrar
  4. Hola Jorge es un placer conocerte y saber que hay personas dispuestas a colaborar en esta plataforma llamada excel que en lo particular me facina y trato de aprender algo cada dia

    TE FELICITO POR TU BLOG

    Y gracias por esta funcion que es fantastica, ya lo aplique y me funciono perfecto, y para los amigos que piensan que usando la camara solo es para varias celdas o sea solo para rangos, pues NO funciona con una sola celda tambien, solo modifiquen el rango de la foto y listo, ejemplo: A1:A1

    Saludos y a la orden!

    ResponderBorrar
  5. Me parece excelente muchas gracias

    ResponderBorrar
  6. Excelente pero no me funciona en excel 2010, se debe hacer de manera diferente? gracias por el dato.

    ResponderBorrar
  7. Pedro Miguel,

    he probado en Excel 2010 y funciona sin problemas. Te sugiero fijarte se la referencia al objeto es la correcta. Dado que Vba no "entiende castellano", el objeto aparece en el cuadro de nombres como "Rectángulo 1" pero la referencia en el código es "Rectangle 1".
    Otra posibilidad es referirse por el número de índice, por ejemplo
    Shapes(1).Top = Target.Top

    ResponderBorrar
  8. Alejandro
    Gracias por tu ayuda... excelente para mostrar informacion.. suerte...

    ResponderBorrar
  9. Hola, tengo una duda, como puedo crear un texto en forma circular en una planilla exel??. Gracias.
    Felicitaciones por el blog

    ResponderBorrar
  10. Si. Por ejemplo, creamos una cuadro de texto (obviamente con texto dentro de él). Con el cuadro seleccionado, vamos al menú "Herramientas de dibujo"; en el grupo "Estilos de WorArt" abrimos el menú "Efectos de Texto-Transformar".

    ResponderBorrar
  11. ESTIMADO, PODRIA ENVIAR LO MISMO PERO EN VIDEO PASO A PASO, NO SOY TAN EXPERTO EN ESTO PERO ES SUPER PARA LO QUE NECESITO, LO QUE ME COMPLICA ES EL TEMA DE PASAR LOS CODIGOS DONDE USTED MENCIONA. CON IMAGENES ME QUEDARA MUCHO MAS CLARO.

    ResponderBorrar
  12. Christian, lamentablemente no dispongo del tiempo para hacerlo. De todas maneras, me parece que la nota es clara. Los códigos hay que ponerlos en módulos del editor de Vba, que se abre apretando Alt-F11.

    ResponderBorrar
  13. Estimado me da un error -2147024809(80070057)en tiempo de efecución

    En versiones anteriores funciona bien gracias por la información

    ResponderBorrar
  14. Estimado, en Excel 2013 me da error de tiempo de ejecución -2174024809 (80070057), en anteriores funciona bien, favor recomendar.

    Gracias por tu colaboración

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.