XL 2013 Attribuer les mêmes propriétés à des combobox lors de l'évènement change

cyrikou

XLDnaute Occasionnel
Bonjour à tous,

J'ai 40 combobox numérotés de 1 à 40 dans un Userform.

A par le combobox1,jJ'aimerai appliquer une mise en forme conditionnelle identique au 39 autres déclenchée par l’événement "Change"

Voici le code de la mise en forme (non optimisé pour le moment) :
Code:
Sub Item_color()
Dim Item As Long
If Controls("ComboBox" & Item).Value = "TB" Then
Controls("ComboBox" & Item).BackColor = RGB(0, 0, 255)
Controls("ComboBox" & Item).ForeColor = RGB(255, 255, 255)
End If
If Controls("ComboBox" & Item).Value = "B" Then
Controls("ComboBox" & Item).BackColor = RGB(2, 187, 6)
Controls("ComboBox" & Item).ForeColor = RGB(0, 0, 0)
End If
If Controls("ComboBox" & Item).Value = "AB" Then
Controls("ComboBox" & Item).BackColor = RGB(255, 255, 255)
Controls("ComboBox" & Item).ForeColor = RGB(0, 0, 0)
End If
If Controls("ComboBox" & Item).Value = "M" Then
Controls("ComboBox" & Item).BackColor = RGB(255, 153, 51)
Controls("ComboBox" & Item).ForeColor = RGB(0, 0, 0)
End If
If Controls("ComboBox" & Item).Value = "P" Then
Controls("ComboBox" & Item).BackColor = RGB(255, 51, 0)
Controls("ComboBox" & Item).ForeColor = RGB(0, 0, 0)
End If
If Controls("ComboBox" & Item).Value = "ABST" Then
Controls("ComboBox" & Item).BackColor = RGB(0, 255, 255)
Controls("ComboBox" & Item).ForeColor = RGB(0, 0, 0)
End If
If Controls("ComboBox" & Item).Value = "NE" Then
Controls("ComboBox" & Item).BackColor = RGB(224, 170, 255)
Controls("ComboBox" & Item).ForeColor = RGB(0, 0, 0)
End If
End Sub
J'ai essayé différentes choses et copier le code 40 fois, n'est pas très propre et surtout encombrant même si c'est efficace.

J'ai compris qu'il fallait créer un module de classe et l'initialiser à l'ouverture.
j'ai trouvé des bouts de code de ci-delà mais cela ne fonctionne pas.

Si quelqu'un à une idée je suis preneur, merci d'avance :cool:
 

jpb388

XLDnaute Accro
Re : Attribuer les mêmes propriétés à des combobox lors de l'évènement change

Bonjour à tous
essaye
VB:
Sub Item_color(Cbo As Object)
    Select Case UCase(Cbo.Value)
        Case Is = "TB"
            Cbo.BackColor = RGB(0, 0, 255)
            Cbo.ForeColor = RGB(255, 255, 255)
        
        Case Is = "B"
            Cbo.BackColor = RGB(2, 187, 6)
            Cbo.ForeColor = RGB(0, 0, 0)
        
        Case Is = "AB"
            Cbo.BackColor = RGB(255, 255, 255)
            Cbo.ForeColor = RGB(0, 0, 0)
        
        Case Is = "M"
            Cbo.BackColor = RGB(255, 153, 51)
            Cbo.ForeColor = RGB(0, 0, 0)
        
        Case Is = "P"
            Cbo.BackColor = RGB(255, 51, 0)
            Cbo.ForeColor = RGB(0, 0, 0)
        
        Case Is = "ABST"
            Cbo.BackColor = RGB(0, 255, 255)
            Cbo.ForeColor = RGB(0, 0, 0)
        
        Case Is = "NE"
            Cbo.BackColor = RGB(224, 170, 255)
            Cbo.ForeColor = RGB(0, 0, 0)
            
        Case Else
            Cbo.BackColor = -2147483643
            Cbo.ForeColor = -2147483640
     End Select
End Sub
 

cyrikou

XLDnaute Occasionnel
Re : Attribuer les mêmes propriétés à des combobox lors de l'évènement change

J'ai trouvé un tuto sur une autre communauté, donc voici mon module de classe :
Code:
Public WithEvents TargetBox As MSForms.ComboBox
''''''''
' le code a exécuter pour chacun des combobox, mais je pense qu'il plante
Private Sub Item_color()
Dim Cbo As ComboBox
If Cbo.Value = "TB" Then
Controls("ComboBox" & Item).BackColor = RGB(0, 0, 255)
Controls("ComboBox" & Item).ForeColor = RGB(255, 255, 255)
End If
If Cbo.Value = "B" Then
Controls("ComboBox" & Item).BackColor = RGB(2, 187, 6)
Controls("ComboBox" & Item).ForeColor = RGB(0, 0, 0)
End If
If Cbo.Value = "AB" Then
Controls("ComboBox" & Item).BackColor = RGB(255, 255, 255)
Controls("ComboBox" & Item).ForeColor = RGB(0, 0, 0)
End If
If Cbo.Value = "M" Then
Controls("ComboBox" & Item).BackColor = RGB(255, 153, 51)
Controls("ComboBox" & Item).ForeColor = RGB(0, 0, 0)
End If
If Cbo.Value = "P" Then
Controls("ComboBox" & Item).BackColor = RGB(255, 51, 0)
Controls("ComboBox" & Item).ForeColor = RGB(0, 0, 0)
End If
If Cbo.Value = "ABST" Then
Controls("ComboBox" & Item).BackColor = RGB(0, 255, 255)
Controls("ComboBox" & Item).ForeColor = RGB(0, 0, 0)
End If
If Cbo.Value = "NE" Then
Controls("ComboBox" & Item).BackColor = RGB(224, 170, 255)
Controls("ComboBox" & Item).ForeColor = RGB(0, 0, 0)
End If
End Sub
End Sub
Et le code lorsque l'userform s'initialise pour créer la collection

Code:
Dim NumBoxes As Collection


Private Sub UserForm_Initialize()
Dim ligne As Long
Dim Cbo As MSForms.Control
Dim MyNumBox As Numbox

   Set NumBoxes = New Collection
   For Each Cbo In Me.Controls
      If TypeOf Cbo Is MSForms.ComboBox Then
         Set MyNumBox = New Numbox     'Crée une nouvelle instance
         Set MyNumBox.TargetBox = Cbo  'Connecte la variable à l'objet
         NumBoxes.Add MyNumBox         'Ajoute l'instance à la collection
      End If
   Next
Le code tourne mais rien ne se passe dans les combobox

Au secour !;)
 

jpb388

XLDnaute Accro
Re : Attribuer les mêmes propriétés à des combobox lors de l'évènement change

Bonsoir à tous
Ce n'est pas le tout d'appeler au secours mais quand une personne se donne la peine de t’écrire une macro tu pourras peut-être lui dire si tu as su t’en servir, il suffit de la mettre dans le module de classe et de l’appeler Item_color TargetBox
Quand à ta macro item est = 0 et aucune combobox0 existe
sinon met ton fichier
 

cyrikou

XLDnaute Occasionnel
Re : Attribuer les mêmes propriétés à des combobox lors de l'évènement change

Bonjour à tous, désolé pour la réponse tardive ainsi que le test de la macro. C'est tout simplement que j'étais plus focalisé sur le fonctionnement du module de classe.

Donc pour la macro, elle fonctionne, il a juste fallut adapter le code. Merci, c'est plus propre et efficace ! ;)

Voici le code complet

module de classe nommé "ColorBox", en tête :
Code:
Public WithEvents TargetBox As MSForms.ComboBox
et ensuite toujours dans le module de classe :
Code:
Private Sub TargetBox_Change()
   'jpb's macro
Select Case UCase(TargetBox.Value)
        Case Is = "TB"
            TargetBox.BackColor = RGB(0, 0, 255)
            TargetBox.ForeColor = RGB(255, 255, 255)
        
        Case Is = "B"
            TargetBox.BackColor = RGB(2, 187, 6)
            TargetBox.ForeColor = RGB(0, 0, 0)
        
        Case Is = "AB"
            TargetBox.BackColor = RGB(255, 255, 255)
            TargetBox.ForeColor = RGB(0, 0, 0)
        
        Case Is = "M"
            TargetBox.BackColor = RGB(255, 153, 51)
            TargetBox.ForeColor = RGB(0, 0, 0)
        
        Case Is = "P"
            TargetBox.BackColor = RGB(255, 51, 0)
            TargetBox.ForeColor = RGB(0, 0, 0)
        
        Case Is = "ABST"
            TargetBox.BackColor = RGB(0, 255, 255)
            TargetBox.ForeColor = RGB(0, 0, 0)
        
        Case Is = "NE"
            TargetBox.BackColor = RGB(224, 170, 255)
            TargetBox.ForeColor = RGB(0, 0, 0)
            
        Case Else
            TargetBox.BackColor = -2147483643
            TargetBox.ForeColor = -2147483640
     End Select
End Sub
Puis en haut de l'userform (initialisation de la collection):
Code:
Dim NumBoxes As Collection
et à l'initialisation de celui-ci :
Code:
Private Sub UserForm_Initialize()
Dim Ctl As MSForms.Control

'module de classe: 
   Set NumBoxes = New Collection
   For Each Ctl In Me.Controls
      If TypeOf Ctl Is MSForms.ComboBox Then
         Set MyNumBox = New Colorbox     'Crée une nouvelle instance
         Set MyNumBox.TargetBox = Ctl  'Connecte la variable à l'objet
         NumBoxes.Add MyNumBox         'Ajoute l'instance à la collection
      End If
   Next

' plus le reste des choses à initialiser dans l'userform
Quand on a une centaine de contrôles, c'est très bien la POO.

Merci à jpbb pour la macro
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas