martes, octubre 21, 2008

Cuadro de texto flotante en Excel - segunda nota

En la nota anterior sobre cómo crear cuadros de texto flotantes en Excel mostramos una técnica para simular el efecto de un objeto flotante.
La técnica consiste en crear una cuadro de texto y ligarlo a una celda, o mejor aún usar la cámara fotográfica de Excel para crear una imagen dinámica de un rango.
El problema con la técnica que describimos en esa nota es que el objeto se desplaza sólo verticalmente. Es decir que si creamos el objeto con la cámara y lo ubicamos en el área de la columna D, cuando nos movamos hacia la derecha hasta la columna AB, por ejemplo, no veremos el objeto ya que éste no se desplaza horizontalmente.

Para lograr que el objeto se desplace también horizontalmente creamos este evento en el módulo de Vba de la hoja correspondiente

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    On Error Resume Next
    With Shapes("Picture 2")
        .Left = Target.Offset(0, 1).Left
        .Top = Target.Offset(-1, 0).Top
    End With
    On Error GoTo 0
End Sub


Usamos la propiedad OFFSET para colocar el objeto a la izquierda y arriba de la celda activa. Así por ejemplo, si tenemos una tabla de cotizaciones en el rango A1:B4, después de crear el objeto con la cámara y poner el código en el módulo de la hoja, al seleccionar la celda C6 el cuadro se desplaza de esta manera



Si seleccionamos la celda N3, el cuadro se moverá para sobreponerse al rango O2:P5.



Usamos "On Error Resume Next" para evitar que el código produzca un error y se detenga en caso de seleccionar alguna celda en la fila 1.



Technorati Tags:

20 comentarios:

  1. Hola, Mi Nombre es Frank Pinilla... a una persona como ud no queda mas que decirle gracias, por su colaboracion y dedicacion para poner sus conocimientos al servicio de los demas...de nuevo gracias.

    Conoci su blog gracias al buscador de google...y desde entonces me encanto el blog y sus contenido y ahora estoy aprendiendo a manejar excel casi como un experto.

    Mi consulta en esta oportunidad es saber como puedo crear un libro que pueda introducir ventas endiarias por cada vendedor y sus respectivo productos, mes x mes y dentro del mes por cada dia y a la final me de un informe de ventas por vendedor y productos...esto con el fin de realizar un seguimiento de las ventas y introducir los datos a diario al final de la jornada.

    agradezco la informacion, respecto a que tema debo consultar para tal fin....de nuevo mil gracias.
    frank pinilla
    frankpini@gmail.com

    ResponderBorrar
  2. Hola Frank

    bueno...ejem.., gracias.
    En cuanto a tu consulta te sugiero que leas en el blog los artículos sobre manejo de pequeñas bases de datos con Excel. En la columna izquierda del blog hay una zona de Etiquetas. Allí hay un enlace a las notas sobre tablas dinámicas, donde puedes encontrar las notas que te sugiero.

    ResponderBorrar
  3. Hola mi Nombre es Oscar y quiero felicitarte por tu Blog es EXCEL-ente.

    Un comentario nada mas. Este truco esta mas que fantastico y en lo personal me va a ahorrar muchos problemas pero he descubierto un pequeño problema:

    Cada vez que me ubico en la Fila 1 de cualquier columna, el debuger me tira un error, y es debido a la programacion en el Offset. Yo le hice un pequeño cambio a la linea para que no de el error, sin embargo al trabajar en los limites de la hoja (horizontalmente hacia la derecha) el error siempre continua. En el caso de los limites verticales no he tenido problema.

    Este es el pequeño cambio que hice para no tener problemas en mi area de trabajo cerca de la fila 1:

    .Top = Target.Offset(-0, 0).Top

    Saludos!!

    ResponderBorrar
  4. Hola Oscar

    en la anota menciono que usamos On Error Resume Next para evitar el error si nos encontramos en la fila 1. Pero por error copié el código sin esa orden. El código debe incluir On Error Resume Next al principio y On Error Go To 0 al final.

    ResponderBorrar
  5. Sr. Jorge.

    Es posible utilizar este recurso pero solo activando una celda de una columna especifica? ya que tengo una columna donde selecciono de una lista (Priorida 1,...2 etc) y en la caja flotante muestro al descripcion de las prioridades.

    Gracias de antemano por sus valiosas aportaciones.

    Su amigo
    Vic

    ResponderBorrar
  6. Vic
    no me queda clara la consulta. Te refieres a que el cuadro de texto aparezca sólo si se activa una celda de una determinada columna?

    ResponderBorrar
  7. Jorge:

    Es correcto! solo que la caja flotante se activara solo y cuando nos posicionaramos en las celdas de una columna especifica!

    ResponderBorrar
  8. En ese caso habría que modificar el código del evento. Por ejemplo, en este código, el cuadro de texto será visible sólo si la celda activa es A10

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    On Error Resume Next
    If Union(Target, [A10]).Address = [A10].Address Then

    With Shapes("Imagen 2")
    .Visible = msoTrue
    .Left = Target.Offset(0, 1).Left
    .Top = Target.Offset(-1, 0).Top
    End With
    Else
    Shapes("Imagen 2").Visible = msoFalse
    End If

    On Error GoTo 0
    End Sub

    ResponderBorrar
  9. Jorge:

    Muchas gracias por la ensenanza, mi archivo esta funcionando perfectamente con esta ayuda grafica.

    ResponderBorrar
  10. Buenos dias Sr Jorge, que agradable sorpresa al encontrar su valioso blog, pues es de mucha ayuda para todos.

    Quisiera saber si es posible generar el evento de reposicionar la imagen al mover el scroll y no al selecionar alguna celda, pues asi tendria la imagen fija en una posicion (realmente flotando) y no se ocultaria al mover el scroll. Muchas gracias.

    ResponderBorrar
  11. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  12. Jaime
    es posible, pero es un tema complicado. Si lees inglés te sugiero consultar esta nota de Chip Pearson.

    ResponderBorrar
  13. Muchas gracias Jorge, definitivamente hacerlo de manera que el scroll sea un evento es dificil, pero bueno logre hacerlo con un par de botones. Muchas gracias por tu interes.

    ResponderBorrar
  14. Jorge! Antes que nada, muchas gracias por todo el aporte que haces y por facilitarnos la vida, jeje.

    Tengo una consulta para vos. Es algo parecido a lo que planteaba Vic, salvo que yo necesito que en ciertas celdas (es más bien un rango, desde A1 a M30) NO APAREZCA el objeto flotante, y por supuesto, si en todas las demás.

    Se podrá hacer esto?
    Desde ya gracias, Gino.

    ResponderBorrar
  15. Gino,
    tal como le sugerí a Vic, sólo que en lugar de referirte a una celda te referís a un rango y la condición es que si la celda active NO cae dentro del rango se active la rutina (If Not Union..etc. etc.)

    ResponderBorrar
  16. Bueno muchas gracias Jorge!! Ya iré probando como queda...

    Gino.

    ResponderBorrar
  17. Que tal estimado autor, interesante la nota. Y me despierta una duda. Podría ser posible a que el cuadro flotante fuera dinámico? Con esto quiero decir que sea posible ajustarlo en tamaño según la cantidad de datos en un rango específico. He intentado acceder a la herramienta cámara con código VBA pero no doy con ella. ¿Alguna sugerencia? Agradezco de antemano su atención al presente. Atte Hugo Jiménez

    ResponderBorrar
  18. Si. POr ejemplo, en lugar del rango absoluto $A$1:$B$4 al que está ligada la imagen que creamos con la cámara podemos definir un rango dinámico. Para esto creamos un nombre, digamos "rngImagen", que se refiera a, por ejemlo, la fórmula $A$1:INDICE($B$1:$B$10,CONTARA($B$1:$B$10))
    Seleccionamos la imagen y reemplazamos el rango que aparece en la barra de fórmulas por el nombre.
    Ahora la imagen se adaptará a la cantidad de filas que agreguemos o quitemos.

    ResponderBorrar
  19. Hola buenas tardes, es posible que el texto flotante aparezca al pasar por encima de una imagen, por ejemplo, tengo un mapa y cada estado del país es una imagen independiente, quisiera que al pasar el cursor por cada estado apareciera el nombre del estado, es posible?

    ResponderBorrar
  20. No estoy seguro que se pueda hacer y en caso de ser posible no sería trivial (Vba avanzado). Excel tiene una aplicación Power Maps que te sugiero investigar (dependiendo de que versión de Excel estés usando).

    ResponderBorrar

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