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

10 réponses

1 2
Avatar
ThierryP
Petite info de dernière minute : tout se passe bien en mode pas à pas.....
Ce n'est qu'en mode "automatique" que rien ne se passe comme prévu !!
ThierryP
Avatar
MichD
Bonjour,
Je n'ai pas vraiment le temps de regarder cela ce matin, je te donne une
adresse sur le sujet des rubans, tu as toutes sortes d'exemples et des
fichiers à télécharger! Je regarderai le tout ce soir.
https://www.rondebruin.nl/win/s2/win003.htm
Est-ce possible d'avoir une copie de ton fichier sans les données?
Où as-tu déclaré la variable "couleur" ?
MichD
Avatar
Geo
Bonjour
Ca fait penser à un problème de rafraîchissement d'affichage.
Je m'attendais donc à trouver une méthode refresh que je n'ai pas
trouvée.
Avatar
ThierryP
Visiblement, je suis en train d'utiliser quelque chose qui dépasse mes modestes connaissances......
Donc, encore plus besoin d'un gourou :-):-)
ThierryP
Avatar
ThierryP
Bonjour Geo,
Non, non !
De mes recherches sur le Net, je patauge dans un truc qui devrait être simple (connaître le nom de la procédure en cours d'utilisation) mais qui ne l'est pas tant !
J'ai fini par comprendre pourquoi cela fonctionne en pas à pas... Rest à trouver comment faire pour que cela fonctionne en "Production".
ThierryP
Le vendredi 27 septembre 2019 13:09:10 UTC+2, Geo a écrit :
Bonjour
Ca fait penser à un problème de rafraîchissement d'afficha ge.
Je m'attendais donc à trouver une méthode refresh que je n'ai p as
trouvée.
Avatar
ThierryP
Bonjour Denis,
Merci pour l'adresse, je l'utilise déjà régulièrement p our adapter le ruban à mes besoins.
Après quelques recherches rapides, j'ai compris que la syntaxe que j'a i reprise pour trouver le nom de la procédure tient compte du fait que VBE doit être ouvert et actif pour fonctionner.
Je suis tomber sur quelques liens en rapport (entre autres le site de Chip Pearson) mais mes maigres connaissances ne suffisent pas pour comprendre en détail !
Merci de ton retour !
ThierryP
Avatar
MichD
Dans toutes les procédures du type :
Sub Montage_PLA(ByVal control As IRibbonControl)
Les 2 dernières lignes doivent se terminer par :
Application.DisplayAlerts = True
Set control = Nothing 'C'est la ligne à ajouter aux sub
Sans cette dernière ligne, la variable "Control" relève du fichier
contenant la modification du menu. Si tu ne supprimes pas ta variable,
dès que tu fais appel à n'importe quelle procédure, la variable
"control" demeure le même d'où l'extraction de la même couleur a
appliqué à la cellule.
Je n'aurais jamais trouvé sans voir ton fichier!
MichD
Avatar
MichD
Oublie la proposition précédente.
Voici la solution à ton problème :
Le problème, c'est que la variable "Lig" dans la ligne de code
précédente n'est pas fiable. .GetSelection Lig, 0, 0, 0
On pourrait trouver le nom de la déclaration de la variable en cours,
mais c'est un peu plus compliqué. Suggestion pour faire simple.
A ) dans le haut du module, déclare la variable suivante :
Dim MaSub As String
B ) en dessous de chacune des lignes de déclaration du nom des
procédures, tu inscris ceci :
MaSub = "Montage_ARS" à titre d'exemple
C ) Dans chacune des procédures, remplace cette ligne de code :
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)
En fait, tu remplaces ".CodeModule.ProcOfLine(Lig, 0)" par MaSub
Voilà. Amuse-toi bien!
MichD
Avatar
Jacquouille
"MichD" a écrit dans le message de groupe de discussion :
qmlo6j$1gnc$
Je n'aurais jamais trouvé sans voir ton fichier!
MichD
Et la boule de cristal, alors ? -))
Jacques
" Le vin est au repas ce que le parfum est à la femme."
Avatar
ThierryP
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'édite ur.
J'avais vu une solution qui ressemblait à celle que tu me proposes mai s je voulais éviter d'avoir à écrire "en dur" dans une varia ble.... tant pis !
Je vais écrire un bout de code dans une xlam pour venir écrire au tomatiquement la ligne de code que tu me proposes, afin d'éviter erreu rs de recopie, surtout si il y a beaucoup de procédures impliquée s!
Cela me semble tout de même surprenant qu'avec la puissance du VBA on ne puisse pas trouver facilement la procédure active !
Un grand merci pour ton aide !
ThierryP
1 2