Changement de couleur pour des ComboBox et des TextBox

modus57

XLDnaute Occasionnel
Bonjour. :D

Je fais appel à vous, car je ne suis pas arrivé à résoudre mon problème.

En admettant qu’un Useform contient 1 Combobox et 1 TextBox.

C’est évident d’utiliser les évènements 'Enter' et 'Exit'.

Code:
Private Sub ComboBox1_Enter()
ComboBox1.BackColor = &H80FFFF
End Sub
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ComboBox1.BackColor = &White
End Sub
Private Sub TextBox1_Enter()
TextBox1.BackColor = &H80FFFF
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox1.BackColor = White
End Sub
Par contre si l’Userform contient une quantité plus importante de Combobox et TextBox.

Comment faire une boucle sur ce type de contrôles, afin que le contrôle sélectionné prennne la couleur &H80FFFF et la couleur de autres contrôles devient White.

Existe t'il une solution.

Merci d'avance pour votre aide.
 

Dranreb

XLDnaute Barbatruc
Re : Changement de couleur pour des ComboBox et des TextBox

Bonjour.

Attention: il n'est pas possible, dans un module de classe centré sur un contrôle, de gérer les évènements ayant un rapport de près ou de loin avec le Focus, car ce ne sont pas des évènements du Control.Object mais du Control. Et VBA reste hermétique à toute solution pour les détecter. Toutefois, il est possible de savoir s'il est l'ActiveControl de l'Userform. Il ne resterait qu'à examiner périodiquement celui ci pour détecter un changement de Focus. C'est ce que fait l'usine à gaz du classeur joint.
 

Pièces jointes

  • FocusTBx.xls
    76 KB · Affichages: 91
  • FocusTBx.xls
    76 KB · Affichages: 84
  • FocusTBx.xls
    76 KB · Affichages: 86

modus57

XLDnaute Occasionnel
Re : Changement de couleur pour des ComboBox et des TextBox

Bonjour Dranreb.

Je comprend que c'est une méga usine à gaz.

A tout hasard comment utiliser ActiveControl ??

Tant pis, je vais me palucher autant d'Enter et d'Exit pour tous les Combobox et les Listbox de l'Userfom.

Merci à tous les deux
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Changement de couleur pour des ComboBox et des TextBox

A tout hasard comment utiliser ActiveControl
Voir 1ère instruction de la Private Sub T100ms_Échéance du module de classe BoîtesTexte.
Oui c'est une méga usine à gaz. Elle ne mériterait l'attention que si elle était à même de faire bien plus de choses pour simplifier la programmation dans les UserForm. Mais on peut partir dans tellement de directions différentes en la matière que je ne sais laquelle prendre qui aurait la faveur du plus grand nombre d'utilisateurs. Tout est envisageable, jusqu'à faire un module de classe qui s'occuperait de tout dans un Userform dédié à la mise à jour d'un tableau Excel. Quant à savoir comment il faudrait le paramétrer convenablement, c'est une autre histoire.

… mais j'attendrais volontiers un cahier de charges pour cette paramétrisation …
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Changement de couleur pour des ComboBox et des TextBox

Re

Pourtant cela fonctionne, non ?
Code issu de mes archives
(auteur du code : le fameux Colo - mars 2002)

Code à mettre dans un module de classe
(nommé Class1)
VB:
'--Class Module Code (named Class1)
Public Event GetFocus()
Public Event LostFocus(ByVal strCtrl As String)
Private strPreCtr As String

Public Sub CheckActiveCtrl(objForm As MSForms.UserForm)
    With objForm
        If TypeName(.ActiveControl) = "ComboBox" Or _
           TypeName(.ActiveControl) = "TextBox" Then
            strPreCtr = .ActiveControl.Name
            On Error GoTo Terminate
            Do
                DoEvents
                If .ActiveControl.Name <> strPreCtr Then
                    If TypeName(.ActiveControl) = "ComboBox" Or _
                       TypeName(.ActiveControl) = "TextBox" Then
                        RaiseEvent LostFocus(strPreCtr)
                        strPreCtr = .ActiveControl.Name
                        RaiseEvent GetFocus
                    End If
                End If
            Loop
            End If
        End With
Terminate:
    Exit Sub
End Sub

Code à mettre dans l'useform
VB:
'--Userform1 modile Code
Option Explicit
Private WithEvents objForm As Class1
Private Sub UserForm_Initialize()
    Set objForm = New Class1
End Sub

Private Sub UserForm_Activate()
    If TypeName(ActiveControl) = "ComboBox" Or _
       TypeName(ActiveControl) = "TextBox" Then
        ActiveControl.BackColor = vbRed
    End If
    objForm.CheckActiveCtrl Me
End Sub

Private Sub objForm_GetFocus()
    ActiveControl.BackColor = vbRed
End Sub

Private Sub objForm_LostFocus(ByVal strCtrl As String)
    Me.Controls(strCtrl).BackColor = vbWhite
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Set objForm = Nothing
End Sub
 

Dranreb

XLDnaute Barbatruc
Re : Changement de couleur pour des ComboBox et des TextBox

Possible que ça fonctionne. Mais je n'aime pas, d'une part, les procédures qui ne rendent pas la main tout de suite quand on les invoque, et je préfère d'autre part noter les contrôles eux mêmes par un Set plutôt que leurs noms. Et je n'aime pas non plus bouffer du temps CPU pour rien.
 

Staple1600

XLDnaute Barbatruc
Re : Changement de couleur pour des ComboBox et des TextBox

Re

Dranreb
Que tu n'aimes pas, c'est ton affaire ;)

Je suppose que le demandeur lui appréciera quand il verra que cela lui évitera sa séance de paluchage
Tant pis, je vais me palucher autant d'Enter et d'Exit pour tous les Combobox et les Listbox de l'Userfom.

PS: J'ai testé sur Excel 2013 et cela fonctionne.
Et pour ce qui est d'aimer, j'ai toujours aimé lire les codes de Colo ;) (A.K.A Masaru Kaji qui fut un Excel MVP)

Les goûts et les couleurs...;)
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Changement de couleur pour des ComboBox et des TextBox

Lorsque je dis que je n'aime pas cela veut dire que ça peut présenter des inconvénients. Pas top la UserForm_Activate qui s'exécute tant que l'Userform est affiché… Si on mettait ça dans l'Userform_Initialize, ce qui serait une démarche sensiblement voisine, il ne s'afficherait pas !

Et puis comme dit dans cette discussion, pas besoin de module de classe pour se contenter de faire ça.

Par contre en surveillant sérieusement le focus périodiquement, je commence à me demander si on a vraiment toujours besoin, pour gérer les évènements de plusieurs TextBox par une même procédure, d'un module de classe, comme on le fait d'habitude.
Un Dim WithEvents TBx As MSForms.TextBox pourrait être déclaré dans l'userform lui même. Ne suffirait-il pas de lui affecter par un Set la TextBox qui reçoit le focus ?…
Resterait quand même la classe Timer100ms et son moteur, le module MTimer100ms. Mais tout bien pesé, ils ne sont vraiment pas très compliqués. Eviter de s'en servir pour engager des actions dans Excel. Dangereux, parce que contrairement au Application.OnTime, il peut se déclencher au beau milieu d'une tâche de calcul de formules. Excel déteste ça: il préfère mourir en silence que d’obtempérer…
 
Dernière édition:

modus57

XLDnaute Occasionnel
Re : Changement de couleur pour des ComboBox et des TextBox

Bonsoir.

La solution Staple1600 est plus légère et elle fonctionne bien, un petit hic je n'arrive pas à alimenter les Combobox et Listbox.

Je vais préparer un petit fichier pour bien comprendre le problème.

@ +
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Changement de couleur pour des ComboBox et des TextBox

Mon dispositif, plus lourd, n'était pas spécialement circonscrit à votre problème particulier. C'était juste une illustration de mes propos.
Nous attendons, lui sans doute comme moi, enfin, votre classeur joint pour apporter nos solutions respectives après les avoir testé.
 

modus57

XLDnaute Occasionnel
Re : Changement de couleur pour des ComboBox et des TextBox

Finalement j'ai corrigé la petite erreur dans la RowSource des contrôles.

La solution Staple1600 fonctionne super bien.

Merci à tous les deux pour votre aide.

Excellente journée.
 

Dranreb

XLDnaute Barbatruc
Re : Changement de couleur pour des ComboBox et des TextBox

Bonjour.
La solution Staple1600 fonctionne super bien.
Oui mais elle peut se simplifier, sans recourir à un module de classe. Cette programmation fait exactement la même chose :
VB:
Option Explicit
Dim Ctrl As MSForms.Control, ÇaRoule As Boolean

Private Sub UserForm_Activate()
ÇaRoule = True
Do While ÇaRoule
   DoEvents
   If Not Ctrl Is Me.ActiveControl Then
      Colorer vbWhite
      Set Ctrl = Me.ActiveControl
      Colorer vbRed
      End If
   Loop
End Sub

Private Sub Colorer(Couleur As Long)
If Ctrl Is Nothing Then Exit Sub
If TypeName(Ctrl) <> "ComboBox" And _
   TypeName(Ctrl) <> "TextBox" Then Exit Sub
Ctrl.Object.BackColor = Couleur
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
ÇaRoule = False
End Sub
Je la trouve simplement moins propre que d'utiliser un Timer API, c'est tout. Mais s'il s'avère à très long terme que ça ne présente jamais aucun inconvénient je finirai par l'adopter.
Ça débouchera à terme sur la suppression de bien des petits modules de classe pas assez étoffés pour être intéressants.
 

modus57

XLDnaute Occasionnel
Re : Changement de couleur pour des ComboBox et des TextBox

Bonjour Dranreb :D

Ta solution fonctionne aussi bien que celle de Staple1600.

J'ai un petit souci avec ma macro qui n'a peut-être rien à voir avec ton code.

A l'initialisation de l'Userform voici le message qui s'affiche : "L'indice n'appartient pas à la sélection"

Je ne comprends pas d’où vient le problème ?

Peux-tu jeter un petit coup d’œil sur le fichier ci-joint.

Merci d'avance.
 

Pièces jointes

  • boucle_controles_3.xlsm
    29.1 KB · Affichages: 82
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Changement de couleur pour des ComboBox et des TextBox

Bonjour.

Je ne sais pas, chez moi ça plante déjà sur Source.Open
Mais il me semble qu'il manque un numéro de ligne derrière Cellule = "D2:D"
Je ne sais pas, on ne peut pas tout savoir, et je suis inculte en dispositif ADO.
Mais plus bas, il y a peut être plus gros : Sheets(4) alors qu'il n'y a qu'une feuille dans le classeur. Elle est directement connue de VBA sous le nom d'objet Worksheet "Feuil4" alors que pour Excel elle s'appelle "Feuil1".
Personnellement je donne toujours aux objets Worksheet de la rubrique Microsoft Excel Objets des noms mnémoniques commençant par F mais en rapport, quoique courts, avec le nom Excel des feuilles qu'ils représentent.
 

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 145
Membres
103 130
dernier inscrit
FRCRUNGR