Microsoft 365 Probleme de changement de couleur d'un bouton

jarc_76

XLDnaute Nouveau
Bonjour à tous,
j'ai un petit problème :
dans ma feuille de travail, j'ai 2 boutons. Lorsque qu'on appui sur un bouton, je mets sa couleur de fond en vert et le fond de l'autre bouton en gris.
Sauf que ca ne fonctionne quand la macro se déroule. (le bouton sur lequel j'appui passe bien en vert mais l'autre bouton reste en gris).
En revanche, si je mets un point d'arrêt sur l'instruction qui colore le 2e bouton en gris , que je lance la macro, alors le prompt s'arrête sur le point d'arrêt, j'appui sur F8 et là le 2e bouton passe bien en gris.

Donc, au niveau syntaxe, c'est correct.
J'ai essayé de mettre un "Application.ScreenUpdating = True" avant l'instruction, mais ca ne change rien:

Sub Pop_Up_Verif()
' Cette fonction permet de saisir le numéro d'ampoule et affiche son défaut et son temps d'inspection
Dim Num_Ampoule, i As Integer
Dim Défaut As String
Dim rep As Integer
Dim flag As Integer

Init_Variables
flag = 0
'Si bouton2 en vert
If ActiveSheet.CommandButton2.BackColor = RGB(128, 255, 128) Then flag = 1

'Si Bp 'Mode Vérification' n'est pas vert
If ActiveSheet.CommandButton2.BackColor <> RGB(128, 255, 128) Then
'Coloration en vert du BP
ActiveSheet.CommandButton2.BackColor = RGB(128, 255, 128) '(**** Ici, l'instruction s'exécute bien, le bouton2 passe en vert ****)
'Coloration du BP 'Mode Saisie' en gris
Application.ScreenUpdating = True
ActiveSheet.CommandButton3.BackColor = RGB(242, 242, 242) '(**** Ici, l'instruction ne s'exécute pas correctement : le bouton3 reste en vert - Si je mets ici un point d'arrêt, le bouton passe en gris dès que j'appui sur F8 ****)
...

j'ai mis le fichier en pj, la ligne concernée se trouve dans le module1,
pour faire apparaitre le probleme :
cliquer sur le BP : "Mode Verif", le bouton passe en vert, ==> entrer une valeur entre 1 et 200, puis OK

ensuite appuyer sur le BP "Mode verif".

Le BP mode verif passe en vert mais le BP "mode saisie" reste en vert, alors qu'il devrait passer en gris.

Si quelqu'un a déjà eu ce problème et connait la solution, je suis preneur.

merci et bonne journée
 

Pièces jointes

  • Bilan Kits Mirage Manuel - Version Beta8 - Copie.xlsm
    725.9 KB · Affichages: 6

patricktoulon

XLDnaute Barbatruc
Bonsoir
c'est quoi le probleme
2 boutons 3 couleurs
couleur1 gris
couelur2 vert
couleur 3 grisgris

a quel moment ces boutons doivent être d'une couleur ou une autre
les deux boutons si j'ai bien compris deviennent verts quand on click dessus

quand l'un est cliqué l'autre devient gris ok

et après ????????
 

jarc_76

XLDnaute Nouveau
Bonjour,

relis mon premier message tout y est expliqué.

==> 2 boutons, qd je clique sur un bouton il devient vert, l'autre gris
qd je clique sur le 2 eme bouton, il devient vert et le premier devient gris

Dans l'execution, le bouton appuyé passe bien en vert, mais l'autre bouton reste vert et ne passe pas en gris .
Le code fonctionne bien en pas à pas, mais pas en auto.

juste derrière la demande de changement de couleur , je lance une msgbox.
si je bypass le lancement de la msgbox, le prog s'execute correctement ...
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour
en vba il est facile de faire une bascule
test cette petite double bascule
VB:
Private Sub CommandButton1_Click()
With CommandButton1
.BackColor = Array(RGB(0, 255, 0), RGB(150, 150, 150))(Abs(.BackColor = RGB(0, 255, 0)))
.Parent.CommandButton2.BackColor = Array(RGB(0, 255, 0), RGB(150, 150, 150))(Abs(.BackColor = RGB(0, 255, 0)))
End With
End Sub

Private Sub CommandButton2_Click()
With CommandButton2
.BackColor = Array(RGB(0, 255, 0), RGB(150, 150, 150))(Abs(.BackColor = RGB(0, 255, 0)))
.Parent.CommandButton1.BackColor = Array(RGB(0, 255, 0), RGB(150, 150, 150))(Abs(.BackColor = RGB(0, 255, 0)))
End With
End Sub
 

jarc_76

XLDnaute Nouveau
Bon, j'ai remplacé la message box par un userform et ca marche très bien...
ca n'explique pas mon problème initial mais ca marche.

Histoire d'essayer de comprendre, j'ai fait un petit exemple qui reflète bien le problème que j'ai rencontré :
- ouvrir le fichier en pj
- cliquer sur le BP1, il passe en vert
- cliquer sur le BP2, le BP1 passe en gris , le BP2 passe en vert ( parfait ^^)

A chaque fois, une msgbox apparait après le clic.
donc ca fonctionne !

Mais, si vous :
- cliquez sur le BP1
- cliquez sur une cellule quelconque
- cliquez sur le BP2
==> le BP2 passe bien en vert, mais le BP1 reste vert
- vs fermez le msgbox (appui sur OK) , le BP1 passe en gris

Si vous effectuez cette 2nde manip en pas à pas, ca fonctionne correctement, le BP1 passe bien en gris avant l'appel de la msgbox


Si quelqu'un peut m'expliquer ce phénomène, ca me permettrait de mieux dormir ^^

Merci
 

Pièces jointes

  • test.xlsm
    22.9 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
RE
Ben c'est simple le msgbox est Modal( prend le dessus sur les autres fenêtres et les bloque
ainsi que tout exécution de code) parti de là tant que le msgbox n'est pas fermé la bascule ne sefait pas
et meme si tu lance le msgbox après la bascule couleur tout simplement par ce que vba il lui faut un certains temps pour faire les chose malheureusement le msgbox est un élément supplémentaire un clisd qui est complétement autonome et ne dépend pas de vba pour son exécution premiere
vba n'en est que l'appelant
autrement dis tu chasse le DAHU depuis
 

jarc_76

XLDnaute Nouveau
RE
Ben c'est simple le msgbox est Modal( prend le dessus sur les autres fenêtres et les bloque
ainsi que tout exécution de code) parti de là tant que le msgbox n'est pas fermé la bascule ne sefait pas
et meme si tu lance le msgbox après la bascule couleur tout simplement par ce que vba il lui faut un certains temps pour faire les chose malheureusement le msgbox est un élément supplémentaire un clisd qui est complétement autonome et ne dépend pas de vba pour son exécution premiere
vba n'en est que l'appelant
autrement dis tu chasse le DAHU depuis
merci de ta réponse.

si je comprends bien : le BP2 passe en vert , le PB1 n'a pas le temps de passer en gris avant de lancer la msgbox car celle-ci est modal et prend la main sur l'exécution du code.

Du coup j'ai tenté autre chose : j'inverse les changement de couleur ds le code, cad , je passe d'abord le BP1 en gris , puis le BP2 en vert, puis la msgbox.

je passe de

Private Sub CommandButton2_Click()

'Coloration du BP2 en vert
ActiveSheet.CommandButton2.BackColor = RGB(128, 255, 128)

'Coloration du BP1 en gris
ActiveSheet.CommandButton1.BackColor = RGB(242, 242, 242)

MsgBox "coucou", vbOKOnly, "Test couleur bouton"

End Sub

à

Private Sub CommandButton2_Click()
'Coloration du BP1 en gris
ActiveSheet.CommandButton1.BackColor = RGB(242, 242, 242)

'Coloration du BP2 en vert
ActiveSheet.CommandButton2.BackColor = RGB(128, 255, 128)


MsgBox "coucou", vbOKOnly, "Test couleur bouton"

End Sub


Si je suis ton explication, dans l'exécution, le BP1 devrait passer en gris, et le BP2 ne passerait en vert qu'apres la fermeture de la msgbox.
Or, ce n'est pas ce qui se passe , le BP2 passe en vert et le BP1 ne repasse en gris qu'après fermeture de la msgbox. comme avant en fait...

Note : ne oublier de cliquer sur une cellule avant de cliquer sur BP2 pour voir le problème

Cochonnerie de DAHU ^^
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Jarc, Patrick,
J'ai essayé pas mal de trucs en pure perte.
Hypothèse :
J'en ai conclu que la mise en couleur des CommandBoutons est "lente", et que le Msgbox fige l'écran à l'affichage. Ecran figé avant que les couleurs soient appliquées et visibles.
J'ai fait un autre test sans bouton mais avec des cellules fusionnées, et cette macro, et ça marche correctement car la mise en couleurs des cellules est très rapide.
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, [G12]) Is Nothing Then
         [G12].Interior.Color = RGB(128, 255, 128)
         [J12].Interior.Color = RGB(242, 242, 242)
        MsgBox "coucou 1", vbOKOnly, "Test couleur bouton"
    ElseIf Not Intersect(Target, [J12]) Is Nothing Then
         [J12].Interior.Color = RGB(128, 255, 128)
         [G12].Interior.Color = RGB(242, 242, 242)
        MsgBox "coucou 2", vbOKOnly, "Test couleur bouton"
    End If
End Sub
 

Pièces jointes

  • test (8).xlsm
    22.9 KB · Affichages: 1

jarc_76

XLDnaute Nouveau
Bonjour Jarc, Patrick,
J'ai essayé pas mal de trucs en pure perte.
Hypothèse :
J'en ai conclu que la mise en couleur des CommandBoutons est "lente", et que le Msgbox fige l'écran à l'affichage. Ecran figé avant que les couleurs soient appliquées et visibles.
J'ai fait un autre test sans bouton mais avec des cellules fusionnées, et cette macro, et ça marche correctement car la mise en couleurs des cellules est très rapide.
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, [G12]) Is Nothing Then
         [G12].Interior.Color = RGB(128, 255, 128)
         [J12].Interior.Color = RGB(242, 242, 242)
        MsgBox "coucou 1", vbOKOnly, "Test couleur bouton"
    ElseIf Not Intersect(Target, [J12]) Is Nothing Then
         [J12].Interior.Color = RGB(128, 255, 128)
         [G12].Interior.Color = RGB(242, 242, 242)
        MsgBox "coucou 2", vbOKOnly, "Test couleur bouton"
    End If
End Sub
Bonjour Sylvanu,
effectivement, ca fonctionne, du coup, on va se dire que mon probleme est un problème de rapidité de traitement ...
Merci de tes infos, en tout cas ^^
et bonne journée
 

patricktoulon

XLDnaute Barbatruc
Bonjour @jarc_76
il ne faut pas interpréter

j'ai du mal m'exprimer en post #21

la coloration d'un activX demande du temps (en mili milli seconde et cela selon la puissance dispo du pc et graphique )

le msgbox lui est autonome est extra vba(vba n'en ai que l'appelant)

étant donné que le msgbox est externe a vba (il est dans une dll) il est forcément plus rapide

pour info
toute fonction dans une dll sera de toute les manières plus rapide qu'une fonction faisant la même chose en VBA

par conséquent il s'affiche avant la fin de l’exécution du re dessin de la couleur sur le bouton

comme il est MODAL(prend le pas sur la fenêtre appelante) il bloque toute exécution de code ou (return de fonction) jusqu’à sa fermeture

conclusion ta couleur se fait quand tu ferme le msgbox

voilà comment ça fonctionne ;)

j'espère avoir été plus clair cette fois ci

la solution serait de différer la coloration en la sortant du tread vba
pour cela il faudrait exécuter cette action en AddressOf
mais le jeu vaut il la chandelle de faire joue joue avec les api
ou!!!
exécuter le msgbox extra a vba
soit en addressof
soit par shell sur vbs
soit un wscript.shell sur vbs ou hta
bref en réfléchissant solution il ya
pour trouver une solution fouiller le net toi devoir
images
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 096
Messages
2 116 183
Membres
112 677
dernier inscrit
Justine11