XLS : Sélecteur de Couleur

Lu76Fer

XLDnaute Occasionnel
Bonjour,

Il existe une interface pour choisir des dossiers ou fichers qui retourne leurs noms complets : Application.FileDialog. Par contre, il est possible de choisir une couleur à partir de la barre d'outils standard du menu <<Home>> mais il n'est pas possible de faire directement appel à l'interface et de récupérer la valeur de la couleur sélectionnée.
Du coup j'ai codé et partage ma solution, pour pouvoir intégrer une interface de sélection d'une couleur, simple d'utilisation, au sein d'un projet.

SélecteurDeCouleur.jpg


Il y a différente façon d'intéragir, soit en utilisant la souris, soit en basculant sur un contrôle au clavier. La bascule au clavier interdit l'accès aux cellules car dans ce cas les touches flèchés ne sont pas affectées aux même actions. Voici le code qui permet dans une feuille protégée de dé/bloquer l'accès aux cellules de la feuille S_Spectre :
VB:
'Bloquer tout accès aux cellules (attention la suppression fonctionne toujours sur la cellule active)
S_Spectre.EnableSelection = xlNoSelection
'Autoriser à nouveau l'accès aux cellules déverrouillées
S_Spectre.EnableSelection = xlUnlockedCells
<CONTROL> Permet de basculer entre souris & clavier
Dans le mode clavier :
<TAB><SHIFT> Cela donne la possibilité de naviguer entre les 4 zones : l'échelle de luminance, le graphe de couleur (teinte, Saturation), les paramètres RGB et enfin les paramètres TSL.​
<TOUCHES FLECHEES><SHIFT>Sur les graphes les flèches remplacent la souris et la touche <Shift> booste le déplacement.​
Pour les composantes, les touches haut et bas permettent de se déplacer entre les valeurs et les touches droite et gauche font varier la valeur de chaque paramètre en fonction de celui sélectionné. Dans ce dernier cas d'utilisation <Shift> permet également de booster la variation.​
<RETURN> Pour valider son choix et revenir à la feuille ayant lancée l'interface.​
<ECHAP> Pour annuler et sortir en revenant sur la feuille ayant lancée l'interface.
<CLIC-DROIT> Change l'apparence du pointeur du "Spectre" de couleur​

Comment interfacer le sélecteur de couleur avec votre projet Excel ?​

Si vous aviez besoin d'utiliser ce petit outil dans votre projet voici la procédure :
Copier les modules ColorChoice, LibColor et LibTools ainsi que la feuille S_Spectre et adapté le code de ThisWorkbook avec le votre.
Remarque : par défaut, la fermeture du fichier by-pass toute sauvegarde !
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If UserMode Then ThisWorkbook.Saved = True
End Sub
'Pour désactiver cela du coup il suffit de modifier le code ainsi :
Private Sub Workbook_Open()
   'UserMode = True
End Sub

Pour afficher la feuille S_Spectre et lancer le sélecteur il suffit d'appeler la procédure ChooseColor. Par défaut l'application pointe sur la dernière couleur sélectionnée mais si vous passez en paramètre une valeur Long de couleur c'est celle-ci qui sera pointée.
Pour récupérer la valeur sélectionnée il faut que vous implémentiez une procédure ColorChose ainsi :
VB:
Sub ColorChose(lCol As Long)
   'Si lCol = -1 alors pas de choix
End Sub

Paramétrer l'application pour l'ajuster à votre besoin​

Dans le Module LibTools :
REFRESH_TIME = 40 ms de période de raffraichissement, soit une fréquence d'appel de la procédure LoopRealTime de 1000/40 soit 25 fois par seconde.​
TIME_RPT = 200 ms soit 2 dixième de seconde : temps de répétition touche​
MAXSPEED = 500 : détermine la vitesse maximale de "déplacement" au clavier du pointeur (ou d'une valeur)​
SHIFT_QUICK = 50 : gain de vitesse sur la touche de booste <Shift>

J'ai ajouté en annexe toutes les fonctions d'initialisation graphique permettant de générer le "Spectre de couleur", les barres de titre, l'activation de la main du pointeur souris sur les 'CellForms' : InitGraphiques.vbs

Note technique sur les difficultés rencontrées​

J'ai du renoncer à utiliser une grande matrice de 256x256 celules pour mon "Spectre" de couleur car cela génère une erreur liée à une contrainte d'Excel : "Nombre de formats de cellule différents trop élevé".
Pour plus de détail allez voir le sujet à partir de ce lien :​
J'ai pour la même raison dû utiliser des formes de type Rectangle pour l'affichage de l'échelle de lumière, de l'aperçu et de la couleur sélectionnée.​
Afin de réduire le nombre de format différent j'ai utilisé 2x256 cellules pour générer le graphe en couleur. Chaque cellule comportant des dégradés qui permettent d'obtenir une bonne approximation des couleurs souhaitées. La partie haute comporte 10 dégradés soit 11 positions, sur chaque position la couleur est calculée précisement et elle évolue de façon linéaire jusqu'à la position suivante. La partie basse ne comporte qu'un dégradé soit 2 positions.
 

Pièces jointes

  • InitGraphiques.txt
    2.1 KB · Affichages: 3
  • ColorChooser_v1-0.xlsm
    185.3 KB · Affichages: 3

Dranreb

XLDnaute Barbatruc
J'ai aussi une ébauche d'un nouveau système pour des critères de choix encore différents
 

Pièces jointes

  • CouleurCMJN.xlsm
    259.9 KB · Affichages: 5

Lu76Fer

XLDnaute Occasionnel
Bonsoir.
Voir mon classeur CouleurCls.xlsm qui a d'autres interfaces.
Bonjour,
Je suis sûr de trouver des éléments techniques intéressant dans votre projet comme toujours et je remarque qu'il y a toujours une approche très scientifique.
De mon côté, mon projet comporte plein de point technique mais pourrait être simplifié par l'utilisation d'un UserForm et d'une simple image pour afficher le "Spectre" de couleur.
Merci pour votre attention !
 

AR MOR

XLDnaute Nouveau
Bonsoir ou Bonjour suivant l'heure,

Une bidouille personnelle qui m'aide bien

Une fois en mémoire, on peut coller le code dans les propriétés BackColor ou ForeColor du Projet

Si cela peut servir à qq
 

Pièces jointes

  • POMPE RAL.xlsm
    33.7 KB · Affichages: 3
Dernière édition:

Lu76Fer

XLDnaute Occasionnel
Bonsoir AR MOR,
Bonsoir ou Bonjour suivant l'heure,

Une bidouille personnelle qui m'aide bien

Une fois en mémoire, on peur coller le code dans les propriétés BackColor ou ForeColor du Projet

Si cela peut servir à qq
Merci pour ce partage de code mais je ne comprend pas le besoin d'utiliser la méthode Copy dans ton code :
VB:
With USF_COULEURS.TextBox1 ' On met en mémoire le code de la couleur
    .SelStart = 0: .SelLength = Len(USF_COULEURS.TextBox1): .Copy
    Debug.Print .Value 'Ajout de code
End With
On peut stocker la valeur .Value dans une variable ...
 

Dranreb

XLDnaute Barbatruc
Mon CouleurCls.xlsm a aussi des copies du code couleur hexadécimal dans le presse papier pour pouvoir le coller ensuite soit dans du code soit dans la fenêtre de propriétés pour une propriété couleur d'un contrôle.
 

AR MOR

XLDnaute Nouveau
Un peu mieux:

Merci d'avoir regardé! :)

Voici une variante un peu plus expéditive avec "MouseMove"

A noter que si le Label1 clignote un peu,
vous pouvez mettre le DrowBuffer de l'usf à 1 000 000 au lieu de 32000 ou 64000.
 

Pièces jointes

  • POMPE RAL_2.xlsm
    34.6 KB · Affichages: 3

Lu76Fer

XLDnaute Occasionnel
Mon CouleurCls.xlsm a aussi des copies du code couleur hexadécimal dans le presse papier pour pouvoir le coller ensuite soit dans du code soit dans la fenêtre de propriétés pour une propriété couleur d'un contrôle.
Je comprends mieux du coup, le but étant de récupérer la couleur choisie pour la coller dans son projet.
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
315 087
Messages
2 116 084
Membres
112 655
dernier inscrit
fannycordi