XL 2016 Mise En Forme d'un commentaire de cellule

TooFatBoy

XLDnaute Barbatruc
Bonjour,

J'ai créé une petite macro qui modifie la MEF du commentaire d'une cellule quand je double-clique sur ladite cellule.
Mais il y a un petit souci...

Quand je double-clique sur une cellule dont le commentaire n'a pas encore été mis en forme par ma macro, la macro plante lors de la tentative de changement de couleur du commentaire. J'arrête alors la macro.
A partir de là, à chaque fois que je double-clique de nouveau sur la même cellule, la macro ne plante plus sur cette cellule.

Autre bizarrerie : lorsque la macro plante c'est sur une tentative de changement de couleur du texte du commentaire, mais le message d'erreur concerne la taille de la police de caractères...
MsgErreur.png



Question subsidiaire : est-il possible de changer la couleur de fond du commentaire ?
 

Pièces jointes

  • MEF_commentaire.xlsm
    22.6 KB · Affichages: 22
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
pourquoi ma macro plante-t-elle au premier passage (alors qu'elle ne plante pas aux passages suivants) ?
apriori il n'y a aucune raison
Ben voui, c'est bien qu'est-ce que j'me dis, et c'est pour ça que je viens vous poser la question. ;)


pour ce qui sont déjà en place tu a du faire une erreur au depart
Une erreur de quoi ?
Ceux déjà présents dans mon fichier sont faits par Excel, sans modif de ma part.


c'est quoi l'intéret de refaire le theme a chaque fois ?
Je ne sais pas ce que tu appelles "le theme", mais l'intérêt de la macro c'est de pouvoir changer la MEF des commentaires en fonction de la ligne de la cellule qui contient ledit commentaire, ou peut-être changer en fonction de l'auteur.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonjour @TooFatBoy
allez tiens on va faire mumuse avec ces satanés commentaires
tu double click ca ,te formate comme tu veux (j'ai même changé la police)

a chaque double click le commentaire de la cellule cliquée précédemment revient tout en gris et en 8

là oui ça a un sens
on pourrait apparenter cela a un visuel amélioré(si vous voyez pas bien double cliquer)
en gros ,seule la dernière cellule cliqué reste formatée
démonstration
demo.gif

VB:
Dim oldCell As Range
Sub remasterOldCell()
    If Not oldCell Is Nothing Then
        With oldCell.Comment.Shape
            .OLEFormat.Object.Font.Size = 8
            .OLEFormat.Object.Font.Color = RGB(127, 127, 127)
            .OLEFormat.Object.Font.Bold = False
            .OLEFormat.Object.Font.Italic = True
            .OLEFormat.Object.Font.Name = "calibri"
            .TextFrame.AutoSize = False
        End With
    End If
End Sub
Sub MEF_Commentaire_2(MaCellule As Range)
    If MaCellule.Comment Is Nothing Then Exit Sub
    remasterOldCell
    MaCellule.Offset(1).Select
    montexte = MaCellule.Comment.Text

    AuteurNbCar = InStr(1, montexte, ":" & Chr(10)) + 1
    'on passe par l'object .oleformat.object pour remttre tout en normal c'est plus simple
    With MaCellule.Comment.Shape
        .OLEFormat.Object.Font.Size = 8
        .OLEFormat.Object.Font.Color = RGB(127, 127, 127)
        .OLEFormat.Object.Font.Bold = False
        .OLEFormat.Object.Font.Italic = False
        .OLEFormat.Object.Font.Name = "calibri"

        With .TextFrame.Characters(Start:=AuteurNbCar, Length:=200).Font
            .Color = RGB(0, 0, 255)    '!!!!!!!!! TOUJOUR MODIFIER LA COULEUR AVANT  LE SIZE!!!!!!!!!!
            .Size = 10
            .Bold = True
            .Italic = False
            .Name = "broadway"
        End With
        .AutoShapeType = msoShapeRoundedRectangle
        .TextFrame.AutoSize = True
        .Fill.ForeColor.RGB = RGB(255, 255, 150)
        Set oldCell = MaCellule
    End With

enjoy! ;)
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
VB:
Dim oldCell As Range

Sub remasterOldCell()
    If Not oldCell Is Nothing Then
        With oldCell.Comment.Shape
            .OLEFormat.Object.Font.Size = 8
            .OLEFormat.Object.Font.Color = RGB(127, 127, 127)
            .OLEFormat.Object.Font.Bold = False
            .OLEFormat.Object.Font.Italic = True
            .OLEFormat.Object.Font.Name = "calibri"
            .TextFrame.AutoSize = False
        End With
    End If
End Sub

Sub MEF_Commentaire_2(MaCellule As Range)
    If MaCellule.Comment Is Nothing Then Exit Sub
    remasterOldCell
    MaCellule.Offset(1).Select
    montexte = MaCellule.Comment.Text

    AuteurNbCar = InStr(1, montexte, ":" & Chr(10)) + 1
    'on passe par l'object .oleformat.object pour remttre tout en normal c'est plus simple
    With MaCellule.Comment.Shape
        .OLEFormat.Object.Font.Size = 8
        .OLEFormat.Object.Font.Color = RGB(127, 127, 127)
        .OLEFormat.Object.Font.Bold = False
        .OLEFormat.Object.Font.Italic = False
        .OLEFormat.Object.Font.Name = "calibri"

        With .TextFrame.Characters(Start:=AuteurNbCar, Length:=200).Font
            .Color = RGB(0, 0, 255)    '!!!!!!!!! TOUJOUR MODIFIER LA COULEUR AVANT  LE SIZE!!!!!!!!!!
            .Size = 10
            .Bold = True
            .Italic = False
            .Name = "broadway"
        End With
        .AutoShapeType = msoShapeRoundedRectangle
        .TextFrame.AutoSize = True
        .Fill.ForeColor.RGB = RGB(255, 255, 150)
        Set oldCell = MaCellule
    End With
End Sub
Merci pour ta réponse, mais c'est exactement la même chose que ce que j'ai fait : tu changes aussi le format à chaque fois alors que tu demandais quel intérêt ça avait. 🙃
Et même pire, ça ne garde pas la mise en forme, ce qui va à l'encontre de ce que je veux obtenir.

En revanche il y a deux commentaires intéressants :
1- celui qui dit qu'il faut toujours modifier la couleur de la police avant sa taille.
C'est ce que j'avais constaté, mais saurais-tu me dire pourquoi ??? Est-ce un bug d'Excel ?
2- celui qui dit que passer par OLEFormat.Object est plus simple.
En quoi est-ce plus simple ? Quel est l'avantage ?
 

patricktoulon

XLDnaute Barbatruc
Merci pour ta réponse, mais c'est exactement la même chose que ce que j'ai fait : tu changes aussi le format à chaque fois alors que tu demandais quel intérêt ça avait. 🙃
Et même pire, ça ne garde pas la mise en forme, ce qui va à l'encontre de ce que je veux obtenir.
relis bien ma réponse tu comprendra

celui qui dit que passer par OLEFormat.Object est plus simple.
En quoi est-ce plus simple ? Quel est l'avantage ?
ben plus facile a coder et les propreties sont plus nombreuses

1- celui qui dit qu'il faut toujours modifier la couleur de la police avant sa taille.
C'est ce que j'avais constaté, mais saurais-tu me dire pourquoi ??? Est-ce un bug d'Excel ?
tout simplement parce que la feuille est basée sur un format xml
et donc certaine fonctions ne sont plus accessibles
en xml un élément ne peut pas etre enfant et parent en même temps;)
c'est une lacune (pas un bug )dans les fonctions vba excel
 

TooFatBoy

XLDnaute Barbatruc
relis bien ma réponse tu comprendra
J'avais déjà lu plusieurs fois, mais comme tu me l'as conseillé, j'ai relu.
Toutefois, je ne comprends toujours pas. 😭

Au départ tu demandes l'intérêt de changer le format à chaque fois (ce qui semble dire qu'on peut changer le format une seule fois et que tous les commentaires auront ensuite ce format), mais tu fais la même chose : tu changes aussi le format à chaque fois, donc je ne pige pas bien la remarque initiale.
 

patricktoulon

XLDnaute Barbatruc
re
bon
ma demande plus clairement était (dans les conditions de ton code bien sur )
pourquoi le faire en sub déclenché par un events si c'est pas pour le remettre apres
car une fois que c'est fait c'est fait pas la peine de le refaire a chaque click

maintenant si comme dans mon modèle tu veux simplement que cela soit fait au double click mais qu'au survol cela soit normal là j'y vois un sens
un peu comme une option(mal voyant)" si vous voyez pas bien veuillez double cliker"

bref maintenant tu sais comment ça fonctionne
 

TooFatBoy

XLDnaute Barbatruc
ma demande plus clairement était (dans les conditions de ton code bien sur )
pourquoi le faire en sub déclenché par un events si c'est pas pour le remettre apres
car une fois que c'est fait c'est fait pas la peine de le refaire a chaque click
En fait le double-clic n'est là que pour mes tests.
Ça me permet de facilement choisir quel commentaire je veux modifier.


bref maintenant tu sais comment ça fonctionne
En fait rien n'a changé par rapport à ma question initiale qui n'a toujours pas trouvé de réponse.

La seule différence, c'est que j'ai réussi à trouver, par tâtonnements, une solution pour empêcher le plantage de la macro : ajout d'une instruction resize.
Oups... j'allais oublier la réponse de Phil69970 qui m'a permis de découvrir comment changer la couleur de la surface d'un commentaire.


En tout cas, je ne sais toujours pas pourquoi la macro plante lors de son premier passage (si je n'ajoute pas ce fameux resize) pour modifier le commentaire.
Peut-être que ça vient de .Characters(Start:=x, Length:=y) ou peut-être que ça vient des commentaires qui sont mal "codés" par mon Excel...
 

patricktoulon

XLDnaute Barbatruc
re
je te l'ai donné la réponse
c'est le fait de sizer avant autre propriété qui ne correspond pas au shema (MSO) "VML" de la hiérarchie xml
en gros quand tu size avant l'élément devient l’élément maitre et on ne peut pas colorer un element size ni en xml ni en html d'ailleurs
ouvre ton fichier xl avec winrar et fouille tu va comprendre
voilà ce qu'est la shape du commentaire a l’intérieur de ton fichier xl
ben tu dois le faire dans le meme ordre ;)
XML:
  <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>


[URL='https://excel-downloads.com/#']-[/URL] <comments xmlns="[B]http://schemas.openxmlformats.org/spreadsheetml/2006/main[/B]">


[URL='https://excel-downloads.com/#']-[/URL] <authors>


  <author>patrick</author>


  </authors>


[URL='https://excel-downloads.com/#']-[/URL] <commentList>


[URL='https://excel-downloads.com/#']-[/URL] <comment ref="[B]A1[/B]" authorId="[B]0[/B]" shapeId="[B]0[/B]">


[URL='https://excel-downloads.com/#']-[/URL] <text>


[URL='https://excel-downloads.com/#']-[/URL] <r>


[URL='https://excel-downloads.com/#']-[/URL] <rPr>


  <b />


  <sz val="[B]9[/B]" />


  <color indexed="[B]23[/B]" />


  <rFont val="[B]Tahoma[/B]" />


  <family val="[B]2[/B]" />


  </rPr>


  <t>patrick:</t>


  </r>


[URL='https://excel-downloads.com/#']-[/URL] <r>


[URL='https://excel-downloads.com/#']-[/URL] <rPr>


  <b />


  <sz val="[B]9[/B]" />


  <color indexed="[B]81[/B]" />


  <rFont val="[B]Tahoma[/B]" />


  <charset val="[B]1[/B]" />


  </rPr>


  <t xml:space="[B]preserve[/B]"></t>


  </r>


[URL='https://excel-downloads.com/#']-[/URL] <r>


[URL='https://excel-downloads.com/#']-[/URL] <rPr>


  <b />


  <sz val="[B]10[/B]" />


  <color indexed="[B]12[/B]" />


  <rFont val="[B]Tahoma[/B]" />


  <family val="[B]2[/B]" />


  </rPr>


  <t xml:space="[B]preserve[/B]">il fait beau aujourd'hui</t>


  </r>


  </text>


  </comment>


  </commentList>


  </comments>
 

TooFatBoy

XLDnaute Barbatruc
je te l'ai donné la réponse
c'est le fait de sizer avant autre propriété qui ne correspond pas au shema (MSO) "VML" de la hiérarchie xml
Non, ce que tu m'as dit, c'est qu'il n'y avait à priori aucune raison pour que ça plante et que j'avais dû merder lors de la mise en forme précédente de mes commentaires avec un mauvais .size, or c'est Excel qui a mis les commentaires en forme, ce n'est pas moi.

Mais admettons que ce soit le fait de faire un .size en premier qui provoque le plantage de la macro (bien que le .size ne soit pas en premier, comme on peut le voir dans mon code initial).
Dans ce cas, pourquoi la solution que j'ai trouvée pour que ça ne plante plus est justement de faire l'inverse, c'est-à-dire faire un .size en tout premier ?


en gros quand tu size avant l'élément devient l’élément maitre et on ne peut pas colorer un element size ni en xml ni en html d'ailleurs
ouvre ton fichier xl avec winrar et fouille tu va comprendre
voilà ce qu'est la shape du commentaire a l’intérieur de ton fichier xl
ben tu dois le faire dans le meme ordre ;)
Voilà une bonne piste. Je vais suivre ton conseil et regarder ça de près.
Merci 👍
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
J'ai épuré et remis en forme ton code XML pour qu'il soit lisible :
XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

<comments xmlns="[B]http://schemas.openxmlformats.org/spreadsheetml/2006/main[/B]">

  <authors>
    <author>patrick</author>
  </authors>

  <commentList>

    <comment ref="[B]A1[/B]" authorId="[B]0[/B]" shapeId="[B]0[/B]">

      <text>

        <r>
          <rPr>
            <b />
            <sz val="[B]9[/B]" />
            <color indexed="[B]23[/B]" />
            <rFont val="[B]Tahoma[/B]" />
            <family val="[B]2[/B]" />
          </rPr>
          <t>patrick:</t>
        </r>

        <r>
          <rPr>
            <b />
            <sz val="[B]9[/B]" />
            <color indexed="[B]81[/B]" />
            <rFont val="[B]Tahoma[/B]" />
            <charset val="[B]1[/B]" />
          </rPr>
          <t xml:space="[B]preserve[/B]"></t>
        </r>

        <r>
          <rPr>
            <b />
            <sz val="[B]10[/B]" />
            <color indexed="[B]12[/B]" />
            <rFont val="[B]Tahoma[/B]" />
            <family val="[B]2[/B]" />
          </rPr>
          <t xml:space="[B]preserve[/B]">il fait beau aujourd'hui</t>
        </r>

      </text>

    </comment>

  </commentList>

</comments>


Hélas ça ne résout rien pour moi, et je ne vois aucune logique par rapport à ton explication :

1- Je ne vois pas le rapport entre la façon de coder les données en XML dans le fichier, et la façon qu'Excel peut avoir d'y accéder en mémoire.

2- Il ne semble pas y avoir de parent ou d'enfant. Tout le monde semble au contraire être au même niveau.

3- Dans le code de la macro je donne le "chemin" complet d'accès à la donnée que je veux modifier.

Tout ça fait que je ne vois pas de raison logique de procéder dans un ordre plutôt que dans un autre, même si j'ai effectivement pu constater que c'est pourtant le cas. ;)
 

patricktoulon

XLDnaute Barbatruc
re
tu vois toujours pas ?
<sz val="9" /> //font.size
<color indexed="81" />//couleur
<rFont val="Tahoma" />//font.name
<charset val="1" />

VB:
With MaCellule.Comment.Shape
        .OLEFormat.Object.Font.Size = 8                                   ''font.size
        .OLEFormat.Object.Font.Color = RGB(127, 127, 127)    'font.color
        .OLEFormat.Object.Font.Bold = False                            ' ca c'est du format
        .OLEFormat.Object.Font.Italic =  true                            'ca c'est format
        .OLEFormat.Object.Font.Name = "calibri"                   'font.name
 

Discussions similaires

Statistiques des forums

Discussions
315 096
Messages
2 116 183
Membres
112 677
dernier inscrit
Justine11