Nuestro consultante nos envía la siguiente consulta. Tengo una hoja de excel en la cual cree un commandbutton, lo que quiero saber, es el codigo en vba que me permita que al pasar el mouse por encima de boton me muestre la informacion de guia referente al botón.
Lo que quiere nuestro consultante en este caso es que al pasar el ratón por encima del botón muestre como texto "Formulario". Si el botón estuviese dentro de un formulario, la solución sería más sencilla, pero al tratarse de un botón creado en una hoja de manera independiente, la tarea se complica ya que hay que utilizar código que llame a la librería de sistema.
Resultado a obtener:
Creamos un botón mediante un control ActiveX desde la Ficha Programador - Insertar
En el grupo Controles, seleccionamos la opción Propiedades
Nota: Recuerda tener el Modo Diseño activado
Aprovechamos a cambiar en Caption el texto del botón. Escribimos Aceptar
Insertamos un módulo desde menú Insertar - Módulo
'Declaramos dos funciones de sistema que llaman a la librería del usuario de Windows
Option Explicit
Declare Function GetSystemMetrics Lib "user32" ( _
ByVal nIndex As Long) As Long
Declare Function GetSysColor Lib "user32" ( _
ByVal nIndex As Long) As Long
'Declaramos una segunda función que nos permite crear la etiqueta
Public Function Info(objHostOLE As Object, _
sTTLText As String) As Boolean
Dim objToolTipLbl As OLEObject
Dim objOLE As OLEObject
Const SM_CXSCREEN = 0
Const COLOR_INFOTEXT = 23
Const COLOR_INFOBK = 24
Const COLOR_WINDOWFRAME = 6
Application.ScreenUpdating = False 'la pantalla no se actualiza solo mientras se crea la etiqueta y se le da formato
For Each objOLE In ActiveSheet.OLEObjects
If objOLE.Name = "TTL" Then objOLE.Delete 'Solo puede existir una cada vez
Next objOLE
'creamos el control de la etiqueta...
Set objToolTipLbl = ActiveSheet.OLEObjects.Add(ClassType:="Forms.Label.1")
'...y le damos formato para que parezca una ventana de información
With objToolTipLbl
.Top = objHostOLE.Top + objHostOLE.Height - 10
.Left = objHostOLE.Left + objHostOLE.Width - 10
.Object.Caption = sTTLText
.Object.Font.Size = 8
.Object.BackColor = GetSysColor(COLOR_INFOBK)
.Object.BackStyle = 1
.Object.BorderColor = GetSysColor(COLOR_WINDOWFRAME)
.Object.BorderStyle = 1
.Object.ForeColor = GetSysColor(COLOR_INFOTEXT)
.Object.TextAlign = 1
.Object.AutoSize = False
.Width = GetSystemMetrics(SM_CXSCREEN)
.Object.AutoSize = True
.Width = .Width + 2
.Height = .Height + 2
.Name = "TTL"
End With
DoEvents
Application.ScreenUpdating = True
'Establecemos que la etiqueta desaparezca después de 5 segundos de haber retirado el ratón...
' ...del botón. Puedes establecer menos segundos
Application.OnTime Now() + TimeValue("00:00:05"), "DeleteToolTipLabels"
End Function
'Por último, creamos otro procedimiento que nos permite borrar el texto de la etiqueta
Public Sub DeleteToolTipLabels()
Dim objToolTipLbl As OLEObject
For Each objToolTipLbl In ActiveSheet.OLEObjects
If objToolTipLbl.Name = "TTL" Then objToolTipLbl.Delete
Next objToolTipLbl
End Sub
Escribimos el siguiente código.
Sub CommandButton1_MouseMove(ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)
Dim objTTL As OLEObject
Dim fTTL As Boolean
For Each objTTL In ActiveSheet.OLEObjects
fTTL = objTTL.Name = "TTL"
Next objTTL
If Not fTTL Then
Info CommandButton1, "Formulario"
End If
End Sub
Nota1: Si nombras el botón de otra manera tendrás que sustituir el nombre CommanButton1 delante de _MouseMove
Nota2: En las últimas líneas de código recuerda que Info es el nombre de la función que creamos en el módulo, CommandButton1 el nombre del botón que hemos creado y el texto entre comillas es el que queremos que aparezca cuando posicionemos el ratón sobre el botón.
Si quieres recibir una lección semanal, no dudes en suscribirte a nuestra explicación semanal en el formulario de la derecha.
Descargar archivo de ejemplo aquí. Recuerda que la versión del archivo es 2007.
0 comentarios:
Publicar un comentario