Microsoft 365 Création d'un combobox avec uniquement des couleurs

popcorn9

XLDnaute Nouveau
Bonjour à tous ,

Je suis débutant en VBA, je me lance dans la programmation.

J'aimerais crée un combobox, dans lequel il y aurait le choix de plusieurs couleurs.

Puis lorsque l'on sélectionne cette couleur, elle s'applique a une ligne de ma listview. Et quand la couleur est choisi, elle s'enleve du combobox.

Merci par avance :)
 

Dudu2

XLDnaute Barbatruc
Bonjour @patricktoulon,

L'instruction est plutôt ActiveWorkbook.ResetColors.

En effet, à la lecture de la doc de ces fonctions:
- Dialogs().Show -> https://docs.microsoft.com/en-us/office/vba/api/excel.dialog.show
- ActiveWorkbook.Colors -> https://docs.microsoft.com/en-us/office/vba/api/excel.workbook.colors
Je me suis demandé à quoi servait cette valeur passée en paramètre et je n'ai pas vraiment compris.

A la lecture de ton post, j'ai eu un doute sur l'effet sur la palette des 56 ColorIndex du Workbook car à aucun moment on ne fait un ActiveWorkbook.Colors(X) = <valeur>.

Alors j'ai fait un test et effectivement, sans le ResetColors, on altère la couleur du Colorindex utilisé dans la fonction (voir fichier joint AVEC et SANS ResetColors). Donc, tu as raison, cette instruction est nécessaire.

Edit: Quant à la valeur de départ, elle peut être définie par le RGB ou simplement par l'Index du ColorIndex dans le Application.Dialogs(xlDialogEditColor).Show(Index, [Red], [Green], [Blue]).
VB:
'------------------------------------
'Fonction pour le choix d'une couleur
'------------------------------------
Private Function ChoixCouleur() As Long
    If Application.Dialogs(xlDialogEditColor).Show(3) Then
        ChoixCouleur = ActiveWorkbook.Colors(3)
    Else
        'Annulation
    End If
    ActiveWorkbook.ResetColors
End Function
 

Pièces jointes

  • VBA Afficher dialogue choix couleur.xlsm
    35.7 KB · Affichages: 5
Dernière édition:

Dudu2

XLDnaute Barbatruc
Je suis revenu sur ce fichier pour coder la mémoire de la couleur précédemment choisie comme couleur "Actuelle" dans cette petite boîte colorée dans le dialogue. C'est pratique si on veut choisir la même couleur que celle précédemment choisie, surtout en couleurs personnalisées.
1659459225637.png


Dans le code du fichier joint c'est:
- soit automatiquement valorisé par la couleur du choix précédent mémorisé (rien à faire),
- soit valorisé par argument de couleur facultatif prioritaire sur la couleur du choix précédent.

A noter que selon la palette utilisée (couleurs standards / couleurs personnalisées) pour la couleur mémorisée, Excel sait proposer la palette correspondante automatiquement lors de la proposition de choix d'une nouvelle couleur.
 

Pièces jointes

  • VBA Afficher dialogue choix couleur avec mémoire choix.xlsm
    39.6 KB · Affichages: 4

Dudu2

XLDnaute Barbatruc
Salut @patricktoulon,
Ben c'est le but. C'est à dire proposer par défaut à l'affichage (sauf au 1er évidemment car pas d'historique où le rouge est proposé par défaut) la couleur choisie précédemment pour pouvoir éventuellement la re-sélectionner. Et pas proposer toujours le rouge.

A noter qu'au 1er affichage (et aux suivants), il est toujours possible de passer en argument la couleur de la plage qui sera prise au lieu du rouge par défaut (c'est ce qui est fait dans le SANS RESET à titre d'exemple).
Couleur.gif
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
sinon en 2 coups de cuillere a pot tu te fait la tienne perso
dans un module
VB:
Sub test()
MsgBox palette.chooseColor
End Sub

dans un userform(vide) que l'on nommera "palette"
Code:
Public WithEvents bt As MSForms.Label
Dim cl(1 To 56) As New palette
Public couleur
Public Function chooseColor()
With palette: .Show: chooseColor = couleur: Unload palette: End With
End Function


Private Sub bt_Click(): palette.couleur = bt.BackColor: palette.Hide: End Sub

Private Sub UserForm_Activate()
Dim I&, T&, A&, obj
For I = 1 To 56
Set obj = Me.Controls.Add("forms.Label.1", "c" & I)
With obj
A = A + 1: .Left = l: .Top = T: .Width = 15: .BackColor = ThisWorkbook.Colors(I)
l = l + 15: If A = 8 Then A = 0: l = 0: T = T + 15
Set cl(I).bt = obj
End With
Next
With Me
.Width = Me.Controls("c" & 56).Left + 20
.Height = Me.Controls("c" & 56).Top + 20
End With
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then couleur = False: Cancel = True: Me.Hide
End Sub

la réponse est false si tu clique sur la croix ou la couleur choisie

j'ai fait ca de mémoire en 5 secondes ,on peut améliorer
 

patricktoulon

XLDnaute Barbatruc
re
voila un exemple concret avec un menu contextuel pour listview
chaque colonne peut être cliqué
pas 2 fois la même couleur dans la même colonne
on clique gauche pour selectionner une ligne dans une colonne et click droit pour choisir la couleur
a chaque choix pour chaque colonne séparément la couleur est retiré du menu
elle revient si vous rechangez la couleur

j'ai organisé un pseudo event column_click pour la listview pour simplifier la tache

PS: j'ai travaillé sur excel 2007 , il vous faudra changer le control listview sur les versions supérieures
 

Pièces jointes

  • exemple listview simple.xlsm
    44 KB · Affichages: 10

Discussions similaires

Statistiques des forums

Discussions
312 270
Messages
2 086 684
Membres
103 370
dernier inscrit
pasval