Modificar color de fondo de controles (textbox y combobox) de un formulario al entrar y salir de los mismos
Tengo un formulario con varios textbox y combobox, además de un marco (frame1) que también contiene algunos controles del tipo textbox y combobox. Pretendo que cuando un control reciba el foco (evento enter), éste cambie de color de fondo (RGB 255,255,150), y que cuando dicho control pierda el foco (evento exit), recupere el color de fondo que tiene por defecto (blanco), utilizando para ello un módulo de clase que recorre todos los controles y ejecuta el cambio de color cada vez que se entra o se sale de un control.
Hasta ahora he conseguido que funcione en los controles que están ubicados dentro del formulario, pero no funciona cuando selecciono los controles que se encuentran dentro del marco (frame).
Adjunto el código que estoy empleando para ver en que tengo que modificarlo para que funcione con los controles ubicados en el marco.
Gracias de antemano.
Módulo de clase llamado "Eventos"
Private WithEvents nTextbox As MSForms.TextBox 'Variable con eventos para nuestros textbox
Private WithEvents nCombobox As MSForms.ComboBox 'variable con eventos para nuestro Combobox
Public Event GetFocus() 'Para poder implementar el evento Enter en los controles
Public Event LostFocus(ByVal strCtrl As String) ' Para poder implementar el evento Exit en los controles
Private strPreCtr As String
'Esta rutina verificará el control activo y estará utilizando los eventos GetFocus y LostFocus
'Trabaja para el TextBox y el Combobox
Public Sub CheckActiveCtrl(objform As MSForms.UserForm)
With objform
If TypeName(.ActiveControl) = "TextBox" Or _
TypeName(.ActiveControl) = "Combobox" Then
strPreCtr = .ActiveControl.Name
On Error GoTo Terminate
Do
DoEvents
If .ActiveControl.Name <> strPreCtr Then
If TypeName(.ActiveControl) = "TextBox" Or _
TypeName(.ActiveControl) = "ComboBox" Then
RaiseEvent LostFocus(strPreCtr)
strPreCtr = .ActiveControl.Name
RaiseEvent GetFocus
End If
End If
Loop
End If
End With
Terminate:
Exit Sub
End Sub
'Propiedad para controles TextBox
Public Property Set ControText(newtext As MSForms.TextBox)
Set nTextbox = newtext
End Property
'Propiedad para controles Combobox
Public Property Set ControlCombo(newcombo As MSForms.ComboBox)
Set nCombobox = newcombo
End Property
Código del formulario
Option Explicit
Private WithEvents objeto As Eventos 'Tambien la declaro con WithEventos para usar GetFocus y LostFocus
Dim lista_Eventos As Collection 'Para agregar los controles a una lista '
'CONJUNTO DE ACCIONES AL INICIAR EL FORMULARIO
'
Private Sub UserForm_Initialize() '
'
'evento para eliminar botones del formulario
'
Dim hWnd As Long
Dim lngWstyle As Long
hWnd = FindWindow(vbNullString, Me.Caption)
lngWstyle = GetWindowLong(hWnd, GWL_STYLE)
SetWindowLong hWnd, GWL_STYLE, lngWstyle And (Not WS_SYSMENU)
DrawMenuBar hWnd
'
'Llamamos al módulo de clase Eventos para comportamiento de los controles
'
Dim ctrl As Control
Set lista_Eventos = New Collection
For Each ctrl In Me.Controls
If TypeOf ctrl Is MSForms.TextBox Then
Set objeto = New Eventos
Set objeto.ControText = ctrl
lista_Eventos.Add objeto
ElseIf TypeOf ctrl Is MSForms.ComboBox Then
Set objeto = New Eventos
Set objeto.ControlCombo = ctrl
lista_Eventos.Add objeto
End If
Next ctrl
'APLICAMOS FORMATO (COLOR FONDO) DE LOS CONTROLES CUANDO RECIBEN Y PIERDEN EL FOCO
'
Private Sub UserForm_Activate()
If TypeName(ActiveControl) = "TextBox" Then
ActiveControl.BackColor = VBA.RGB(255, 255, 150) 'La primera vez que ejecutamos cambiamos el color manualmente pues todavia no esta
'trabajando nuestro evento Enter
End If
objeto.CheckActiveCtrl Me
End Sub
Private Sub objeto_GetFocus()
'Este es nuestro evento Enter, cambia el color de los TextBox y de los Combobox
'Adiciolamente despliega los combobox cuando reciben el Foco
ActiveControl.BackColor = VBA.RGB(255, 255, 150)
If TypeOf ActiveControl Is MSForms.ComboBox Then
ActiveControl.DropDown
End If
End Sub
Private Sub objeto_LostFocus(ByVal strCtrl As String)
'Este es nuestro evento Exit
Me.Controls(strCtrl).BackColor = &HFFFFFF
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Set objeto = Nothing
End Sub