Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBA] Problème de réinitialisation de variable

12 réponses
Avatar
ThierryP
Bonjour le forum (bonjour Denis !!!!),

J'avais pondu cette macro (appel=C3=A9e depuis le ruban et il y en a une di=
zaine de m=C3=AAme structure au total) qui me permet de colorier (ou de sup=
primer la couleur) des cellules :

Sub Montage_ARS(ByVal control As IRibbonControl)
' Montage ARS Rouge 255
Application.DisplayAlerts =3D False
With Selection
If .Rows.Count > 1 Then Exit Sub
If .Interior.Color =3D 16777215 Or .Interior.Color =3D 0 Then
.Interior.Color =3D 255
.Font.ColorIndex =3D 2
If .Columns.Count >=3D 2 Then .Font.Size =3D 7 Else .Font.Size =3D 6:
.Merge
ElseIf .Interior.Color =3D 255 Then Call RAZ_Format_Cellule
End If
End With
Application.DisplayAlerts =3D True
End Sub

Afin d'=C3=A9viter les fausses manips, il n'est pas possible de changer dir=
ectement la couleur d'une cellule d=C3=A9j=C3=A0 color=C3=A9e, on doit cliq=
uer sur le bouton correspondant =C3=A0 la couleur actuelle.

Pour ne pas avoir =C3=A0 =C3=A9crire les codes couleur en dur dans les macr=
os, j'ai cr=C3=A9=C3=A9 un tableau avec le nom de toutes mes macros et les =
codes couleurs associ=C3=A9s :
Montage_ARS 255
Montage_PLG 170
Montage_B_S 10089000
Montage_CNG 20871
Montage_IND 5476563
Montage_PLA 10273012
Electrique_ARS 65535
Electrique_PLG 2024143
Electrique_CNG 10088950
Electrique_IND 2017480
Electrique_PLA 16776960
Install_BCF 13336300
Install_CLI 10501340
SAV 10501270
Essais 13434828
Divers 5287936
Week_Ends 8388608
Absences 16750180
Indisponible 0

et la macro est devenue ceci :

'--------------------------------
Sub Montage_PLG(ByVal control As IRibbonControl)
Dim Lig As Long
Couleur =3D 0: Lig =3D 0
With Application.VBE.ActiveCodePane
.GetSelection Lig, 0, 0, 0
Couleur =3D Application.Index(Range("Code_Couleurs"), Application.Match(.Co=
deModule.ProcOfLine(Lig, 0), Range("Liste_Proc_Menu"), 0), 1)
End With
Application.DisplayAlerts =3D False
With Selection
If .Rows.Count > 1 Then Exit Sub
If .Interior.Color =3D 16777215 Or .Interior.Color =3D 0 Then
.Interior.Color =3D Couleur
.Font.ColorIndex =3D 2
If .Columns.Count >=3D 2 Then .Font.Size =3D 7 Else .Font.Size =3D 6:
.Merge
ElseIf .Interior.Color =3D Couleur Then Call RAZ_Format_Cellule
End If
End With
Application.DisplayAlerts =3D True
End Sub

Je r=C3=A9cup=C3=A8re dans un tableau qui liste les macros perso du ruban u=
n code couleur associ=C3=A9 =C3=A0 chaque macro (variable Couleur). Ceci me=
permet de changer de couleur sans devoir =C3=A9crire la valeur "en dur" da=
ns mes macros.

Mon souci est que je n'arrive pas =C3=A0 r=C3=A9initialiser ma variable cou=
leur : une fois que j'ai colori=C3=A9 une cellule avec une des macros, la c=
ouleur reste identique quelle que soit la macro que je lance. De plus, si u=
ne cellule est color=C3=A9e, un clic sur n'importe quel bouton couleur supp=
rime la couleur de la cellule....

Qu'est-ce que je loupe ?????

Merci d'avance =C3=A0 tout g=C3=A9n=C3=A9reux contributeur !!!

ThierryP

2 réponses

1 2
Avatar
ThierryP
Bonjour Jacques,
Jamais de trucs trop simples pour Denis, il risque de s'ennuyer :-):-)
ThierryP
Avatar
MichD
Le 30/09/19 à 03:25, ThierryP a écrit :
Bonjour Denis,
Merci pour ton retour rapide !
Je me suis rendu compte effectivement que ce que j'avais trouvé était un "détournement de fonction" et que cela impliquait l'éditeur.
J'avais vu une solution qui ressemblait à celle que tu me proposes mais je voulais éviter d'avoir à écrire "en dur" dans une variable.... tant pis !

**** La variable "MaSub" n'est pas obligatoire. Dans la ligne de code
Couleur = Application.Index(Range("Code_Couleurs"),
Application.Match(MaSub, Range("Liste_Proc_Menu"), 0), 1)
Remplace "MaSub" par le nom de la procédure entre guillemets et c'est
suffisant.
Je vais écrire un bout de code dans une xlam pour venir écrire automatiquement la ligne de code que tu me proposes, afin d'éviter erreurs de recopie, surtout si il y a beaucoup de procédures impliquées!

Je ne connais pas les détails de ton application. Utiliser un xlam pour
effectuer ce travail semble un peu excessif!
Pour chacune des procédures, même s'il y en avait 20,
A ) Attribuer à MaSub = "Nom de la procédure" pour chacune d'elles.
B ) Effacer la ligne : .GetSelection Lig, 0, 0, 0
Sous le menu édition : la fonction Remplacer fait ce boulot en une
fraction de seconde.
C ) Tu peux utiliser la même fonction "Remplacer" du menu "Édition" de
la fenêtre VBA pour remplacer ta ligne de code par la mienne en quelque
seconde :
Couleur = Application.Index(Range("Code_Couleurs"),
Application.Match(.CodeModule.ProcOfLine(Lig, 0),
Range("Liste_Proc_Menu"), 0), 1)
Par :
Couleur = Application.Index(Range("Code_Couleurs"),
Application.Match(MaSub, Range("Liste_Proc_Menu"), 0), 1)
À toi de voir!
MichD
1 2