Commentaire suivant mise en forme conditionelle

Chrige

XLDnaute Occasionnel
Bonjour à tous

J'ai trouvé une fonction de Jacques Boisgontier qui convient à ce que je veux faire

Code:
Function AfficheCmt(cel, cond, msg, coul)
  Application.Volatile
  Set f = Sheets(Application.Caller.Parent.Name)
  If Not cel.Comment Is Nothing Then cel.Comment.Delete
  If cond Then
    With cel
     If .Comment Is Nothing Then .AddComment
     .Comment.Shape.Width = Len(msg) * 6 + 2
     .Comment.Shape.Height = 10
     .Comment.Shape.Left = .Left + .Width + 5
     .Comment.Shape.Top = .Top - 2
     .Comment.Visible = True
     .Comment.Text Text:=msg
     .Comment.Shape.Fill.ForeColor.SchemeColor = coul
    End With
  End If
  AfficheCmt = ""
End Function

Mais je souhaiterais régler en plus :
La police
La taille de cette police
La couleur de cette police
Un encadrement de 3
La couleur de cet encadrement
La couleur du fond

Lorsque je rentre manuellement ces paramètres
Ils sont réinitialisés par la fonction et donc perdus

J'ai bien essayé de modifier la fonction pour rajouter ces paramètres
Mais malheureusement en vain

Tout ce je suis arrivé à faire, c'est de changer le fond en remplaçant "Coul" par 6 (Mauve)
(Je n'ai pas compris comment Jacques paramètre cette couleur en"Vert")

Tous les autres réglages, je butte lamentablement

SI quelqu'un peut m'aider
Merci d'avance

A+
 

PMO2

XLDnaute Accro
Re : Commentaire suivant mise en forme conditionelle

Bonjour,

J'ai extrapolé la fonction de Jacques Boisgontier.
Je ne me suis pas occupé des mises en forme conditionnelle n'étant pas en situation.

Une piste qui montre certaines interactions sur un commentaire (police, encadrement, fond, transparence).

Code à copier dans un module Standard
Code:
Sub test()
AfficheCmt Range("c10"), True, "Il était une fois dans l'ouest", vbBlue
End Sub

Function AfficheCmt(cel, cond, msg, coul)
Dim TB As Excel.TextBox
Dim f As Worksheet
'---
Application.Volatile

On Error Resume Next
Set f = Sheets(Application.Caller.Parent.Name)
If Err <> 0 Then
  Set f = ActiveSheet
  Err.Clear
End If
On Error GoTo 0
  
If Not cel.Comment Is Nothing Then cel.Comment.Delete
If cond Then
  With cel
    If .Comment Is Nothing Then .AddComment
    .Comment.Shape.Width = Len(msg) * 6 + 2
    .Comment.Shape.Height = 20
    .Comment.Shape.Left = .Left + .Width + 5
    .Comment.Shape.Top = .Top - 2
    .Comment.Visible = True
    .Comment.Text Text:=msg
    
    '--- (object Excel.TextBox) ---
    Set TB = .Comment.Shape.OLEFormat.Object

    '/// Fond (object FillFormat) ///
    With TB.ShapeRange.Fill
      .ForeColor.RGB = coul   'La couleur du fond
      
      'retirer la quote pour obtenir la transparence
'      .Transparency = 0.5     'Transparence
    End With

    '/// Encadrement (object LineFormat) ///
    With TB.ShapeRange.Line
      .Weight = 3#            'Un encadrement de 3
      .ForeColor.RGB = vbRed  'La couleur de cet encadrement
    End With
 
    '/// Police (object Font) ///
    With TB.Font
      .Name = "Comic sans MS" 'La police
      .ColorIndex = 6         'La couleur de cette police
      .Size = 12              'La taille de cette police
      .Bold = True
      .Italic = True
    End With
       
  End With
End If
AfficheCmt = ""
End Function
 

Pièces jointes

  • Interactions sur commentaire (police, encadrement, fond, transparence).xlsm
    21.3 KB · Affichages: 38

Chrige

XLDnaute Occasionnel
Re : Commentaire suivant mise en forme conditionelle

Bonsoir

En premier je te remercie pour ton aide

Mon fichier étant trop gros, j’ai réalisé des exemples :
- Commentaire suivant mise en forme conditionnelle 1
Exemple de base
- Commentaire suivant mise en forme conditionnelle 2
Le même exemple avec intégration de ta fonction
- Commentaire suivant mise en forme conditionnelle 2b
Le même exemple avec des changements pour tester la fonction

Tout d’abord je ne comprends pas ce code :
.ForeColor.RGB = coul
Comment ce « = coul » équivaut à une couleur ???
Dans ton exemple cela donne un fond bleu
Dans mon exemple le même code donne une couleur noire !!!

Vois dans la macro de l’exemple « Commentaire suivant mise en forme conditionnelle 2b »
J’ai noté « Ok » pour ce qui est bon et « Problème » Ce qui ne fonctionne pas
Ne fonctionne pas la Police, la taille de la police, Bold, Italic

Bien sûr dans ton exemple ce code fonctionne très bien
Mais en l'incluant dans la procédure conditionnelle
Cela ne fonctionne pas

A+
 

Pièces jointes

  • Commentaire suivant mise en forme conditionelle 1.xlsm
    16.2 KB · Affichages: 35
  • Commentaire suivant mise en forme conditionelle 2.xlsm
    15.9 KB · Affichages: 29
  • Commentaire suivant mise en forme conditionelle 2b.xlsm
    18.4 KB · Affichages: 34

Chrige

XLDnaute Occasionnel
Re : Commentaire suivant mise en forme conditionelle

Bonjour à tous

Je suis toujours à la recherche d'une solution pour paramétrer des commentaires suivant une mise en forme conditionnelle

Si quelqu'un peut m'aider

Merci d'avance
 

PMO2

XLDnaute Accro
Re : Commentaire suivant mise en forme conditionelle

Je suis toujours à la recherche d'une solution pour paramétrer des commentaires suivant une mise en forme conditionnelle

Bonjour,

J'ai vu votre pièce jointe "Commentaire suivant mise en forme conditionnelle 2b".

Tout d'abord, il ne s'agit pas d'une Mise en forme conditionnelle. C'est plutôt l'apparition d'un commentaire selon une condition.

D'autre part, vous passez par une formule dans Excel =Affichecmt(A1;(A1=$A$33);"Commentaire";255)
Cela encombre la feuille et il serait plus judicieux de passer par une procédure événementielle du type Worksheet_Change.
C'est au sein de cette procédure que vous pourrez définir quelles cellules sont concernées et spécifier les paramètres du commentaire (police, taille ,etc).

Mais je souhaiterais régler en plus :
La police
La taille de cette police
La couleur de cette police
Un encadrement de 3
La couleur de cet encadrement
La couleur du fond
Vous fournissez cette liste mais est-elle exhaustive ?

Si la démarche que j'indique vous intéresse, dites le moi et je construirais un exemple.
 

Chrige

XLDnaute Occasionnel
Re : Commentaire suivant mise en forme conditionelle

Bonjour

Oui cela m'intéresse
J'avais pensé à une mise en forme conditionnelle, car je travaille sur des dates qui varient d'une année à l'autre
Les commentaires doivent donc suivre les dates en fonction des années
Si une macro événementielle peut convenir à cette fin, je suis tout à fait partant
Car j'essaye toujours au maximum d'éviter les MFC, car lorsque l'on a que 4 ou 5 cela passe, mais dès que l'on en a plus, cela pose souvent des problèmes, notamment si on déplace des cellules ou incorpore des lignes ou des colonnes

Merci pour votre réponse et l'aide
A+
 

PMO2

XLDnaute Accro
Re : Commentaire suivant mise en forme conditionelle

Bonjour,

Je n'ai pas le temps d'expliquer comment cela fonctionne.
Je me contente, pour l'instant, de mettre l'exemple en pièce jointe.
Testez le et à plus.
 

Pièces jointes

  • Commentaires - fond, bordure, police (couleur et taille).xlsm
    30.5 KB · Affichages: 45

Chrige

XLDnaute Occasionnel
Re : Commentaire suivant mise en forme conditionelle

Bonsoir

C'est assez exceptionnel !
Je vois qu'il y a beaucoup de codes
Je vais essayer de comprendre

Juste la cellule colorée, qui semble poser problème
Mais je n'ai peut-être pas encore bien compris le principe
Je vais regarder cela en détail demain
Je reviens sur le Forum après

En attendant merci beaucoup
A+
 

Chrige

XLDnaute Occasionnel
Re : Commentaire suivant mise en forme conditionelle

Bonjour

Pour le commentaire en fonction de la couleur de la cellule, c’est parfaitement Ok
C’est donc un plus par rapport à ce que je souhaitais et je ne sais pas si j’aurais pu réaliser cela avec une MFC !

En fait, il y a Private Sub Worksheet_Change
Il faut donc nécessairement que je change une valeur dans la zone concernée pour activer la macro et voir le résultat de tout changement de code
Serait-il possible de mettre un bouton pour activer les changements de paramètre sans modifier une valeur inutilement ?
On peut bien sur faire une macro qui écrirait une valeur puis l'effacerai de suite, mais c'est pas très technique

J’apprécie beaucoup l’onglet « Palette couleurs » qui me sera util par ailleurs

J’arrive assez bien à lire le code avec les explications
par contre je me suis essayé à ajouter de nouveaux paramètres (qui sont hors de ma demande)
Juste pour voir si je suis en mesure de faire évoluer le code pour des besoins ultérieurs
Mais là, je n’y suis pas arrivé
En fait le code .FontStyle = "Italique" que l’on obtient si on fait un enregistrement de macro
Devient .PoliceItalique = True
De même .Size = 22 Devient .PoliceTaille = 22
J’ai bien essayé avec l’aide Microsoft de trouver une aide pour découvrir ce genre de correspondance
mais en vain.
Peut-on trouver ce genre de correspondance sur le Net ?
Mes recherches en ce sens n’ont pas abouties, mais c’est probablement que je ne sais pas comment rechercher ce genre de correspondance !

Merci
A+
 

PMO2

XLDnaute Accro
Re : Commentaire suivant mise en forme conditionelle

Mes recherches en ce sens n’ont pas abouties, mais c’est probablement que je ne sais pas comment rechercher ce genre de correspondance !

Bonjour,

Les "Type/End Type" sont des types définis par l'utilisateur. Ce qui signifie que c'est moi qui les ai nommés comme dans
Code:
Public Type strucParamsComment
  Texte As String
  FondCouleurLong As Long
  BordureEpaisseur As Single
  BordureCouleurLong As Long
  PoliceNom As String
  PoliceCouleurIndex As Long
  PoliceTaille As Long
  PoliceGras As Boolean
  PoliceItalique As Boolean
  Transparence As Single
End Type

Vous pouvez renommer les éléments à votre convenance (par exemple PoliceTaille en Size, FondCouleurLong en myColor, etc).
Si vous le faites, il faudra changer les .FondCouleurLong en .myColor dans le code.

En fait, il y a Private Sub Worksheet_Change
Vous pouvez utiliser Worksheet_SelectionChange si vous préférez.

Pour le commentaire en fonction de la couleur de la cellule, c’est parfaitement Ok
C’est donc un plus par rapport à ce que je souhaitais et je ne sais pas si j’aurais pu réaliser cela avec une MFC !
J'ai mis cette condition pour l'exemple.
Maintenant si la cellule contient la bonne couleur ET la valeur "zaza", il y aura conflit entre les 2 conditions et la dernière (dans le code) prendra le pas sur la précédente.
 

Chrige

XLDnaute Occasionnel
Re : Commentaire suivant mise en forme conditionelle

Bonjour

Les "Type/End Type" sont des types définis par l'utilisateur. Ce qui signifie que c'est moi qui les ai nommés

Cela explique pourquoi je n'avais rien trouvé sur le Net !


Vous pouvez renommer les éléments à votre convenance (par exemple PoliceTaille en Size, FondCouleurLong en myColor, etc).
Ces éléments me conviennent très bien et ils sont très clairs.
Je ne souhaite pas les modifier
Ce que je souhaitais faire, non que j'en ai besoin pour l'heure
Mais plus pour une bonne compréhension du code et dans le but d'un besoin ultérieur
C'est rajouter un élément comme pour mettre un attribut barré par exemple
Je devais donc rajouter dans votre code quelque chose comme
"Font.Strikethrough = True"

d'une part, je pense dans le module 1 au niveau de ce script
Code:
With TB.Font
  .Name = ParamsComment.PoliceNom
  
    '°°° Ici, on est obligé de passer par ColoIndex °°°
    '°°° Si on passe par Color, on n'obtient pas la °°°
    '°°° couleur désirée (???)                      °°°
  .ColorIndex = ParamsComment.PoliceCouleurIndex
  
  .Size = ParamsComment.PoliceTaille
  .Bold = ParamsComment.PoliceGras
  .Italic = ParamsComment.PoliceItalique
End With
End Sub

Puis ensuite dans le code de la Feuille Test

Mais là, je me rends compte que ce n'est pas aussi facile que je le pensais.
 

PMO2

XLDnaute Accro
Re : Commentaire suivant mise en forme conditionelle

Mais là, je me rends compte que ce n'est pas aussi facile que je le pensais.
Bonjour,

Il faut d'abord réfléchir à "qui est qui". C'est à dire :
1) qui transmet les paramètres pour exécuter l'ordre
2) qui donne l'ordre
3) qui exécute l'ordre

1) qui transmet les paramètres pour exécuter l'ordre
Code:
Public Type strucParamsComment
  Texte As String
  FondCouleurLong As Long
  BordureEpaisseur As Single
  BordureCouleurLong As Long
  PoliceNom As String
  PoliceCouleurIndex As Long
  PoliceTaille As Long
  PoliceGras As Boolean
  PoliceItalique As Boolean
  Transparence As Single
  PoliceBarree As Boolean '///ajout
End Type

2) qui donne l'ordre
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim R As Range
Dim C As Range
'---
Set R = ActiveSheet.Range(PLAGE_CONCERNEE)
For Each C In R
  If Not C.Comment Is Nothing Then C.Comment.Delete
  
  '--- Exemple Condition1 ---
  If C = "zaza" Then
    With ParamsComment
      .BordureCouleurLong = 16711935
      .BordureEpaisseur = 5
      .FondCouleurLong = 65535
      .PoliceCouleurIndex = 32
      .PoliceGras = True
      .PoliceItalique = True
      .PoliceNom = "Calibri"
      .PoliceTaille = 18
      .Texte = "La belle de Cadix a des yeux de velours"
      .Transparence = 0.5
      .PoliceBarree = True    '///ajout
    End With
    Call AddCommentaire(C, ParamsComment)
  End If
  
  '--- Exemple Condition2 ---
  If IsDate(C) Then
    If C > CDate("31/5/2011") And C < CDate("1/10/2011") Then
      With ParamsComment
        .BordureCouleurLong = 65280
        .BordureEpaisseur = 2
        .FondCouleurLong = 255
        .PoliceCouleurIndex = 4
        .PoliceGras = False
        .PoliceItalique = False
        .PoliceNom = "Symbol"
        .PoliceTaille = 10
        .Texte = "abcd"
        .Transparence = 0
        .PoliceBarree = False    '///ajout
      End With
      Call AddCommentaire(C, ParamsComment)
    End If
  End If

  '--- Exemple Condition3 ---
  If C.Interior.ColorIndex = 45 Then
    With ParamsComment
      .BordureCouleurLong = 0
      .BordureEpaisseur = 0.5
      .FondCouleurLong = 13434879
      .PoliceCouleurIndex = 5
      .PoliceGras = False
      .PoliceItalique = False
      .PoliceNom = "Arial"
      .PoliceTaille = 36
      .Texte = "La cellule est colorée"
      .Transparence = 0.8
      .PoliceBarree = False    '///ajout
    End With
    Call AddCommentaire(C, ParamsComment)
  End If
Next C
End Sub

3) qui exécute l'ordre
Code:
Sub AddCommentaire(C As Range, ParamsComment As strucParamsComment)
Dim TB As Excel.TextBox
'---
On Error Resume Next
'--- Ajoute un object Comment ---
C.AddComment
C.Comment.Visible = True
'--- (object Excel.TextBox) ---
Set TB = C.Comment.Shape.OLEFormat.Object
TB.AutoSize = True
TB.Text = ParamsComment.Texte
'/// Fond (object FillFormat) ///
With TB.ShapeRange.Fill
  .ForeColor.RGB = ParamsComment.FondCouleurLong
  .Transparency = ParamsComment.Transparence
End With
'/// Encadrement (object LineFormat) ///
With TB.ShapeRange.Line
  .Weight = ParamsComment.BordureEpaisseur
  .ForeColor.RGB = ParamsComment.BordureCouleurLong
End With
'/// Police (object Font) ///
With TB.Font
  .Name = ParamsComment.PoliceNom
  
    '°°° Ici, on est obligé de passer par ColoIndex °°°
    '°°° Si on passe par Color, on n'obtient pas la °°°
    '°°° couleur désirée (???)                      °°°
  .ColorIndex = ParamsComment.PoliceCouleurIndex
  
  .Size = ParamsComment.PoliceTaille
  .Bold = ParamsComment.PoliceGras
  .Italic = ParamsComment.PoliceItalique
  
  .Strikethrough = ParamsComment.PoliceBarree  '///ajout
  
End With
End Sub
 

Chrige

XLDnaute Occasionnel
Re : Commentaire suivant mise en forme conditionelle

Bonsoir

Merci pour ces explications
Je n'ai pas encore tout compris, mais c'est beaucoup plus clair pour moi

En tout cas, j'ai déjà un bon nombre de paramètre en choix

Merci encore pour cette macro qui correspond parfaitement à ce que je cherchais

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 236
Messages
2 086 481
Membres
103 232
dernier inscrit
logan035