Excel - afficher le contenu d'une cellule

Résolu
mic13710 Messages postés 1165 Date d'inscription   Statut Membre Dernière intervention   -  
mic13710 Messages postés 1165 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Dans un tableau excel 2003, je souhaiterais lorsque je déplace le curseur dans une cellule afficher sous forme de commentaire le contenu d'une autre cellule.

Je sais comment faire pour mettre une image en commentaire, mais pour une cellule, je sèche. Je ne sais même pas si c'est possible.

Si quelqu'un a une solution (simple ou en vba), je suis preneur.

D'avance merci.

2 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    une autre proposition :
    Private Sub Worksheet_Change(ByVal Target As Range)  
        MajCommentaire Target  
    End Sub  
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
        MajCommentaire Target  
    End Sub  
    
    Sub MajCommentaire(Target)  
        ' commentaire auto  
        Dim shComment As Worksheet, lig As Long  
        Set shComment = Worksheets("Feuil1") ' à adapter  
        Target.ClearComments  
        If Left(Target.Formula, Len(shComment.Name) + 3) = "=" & shComment.Name & "!B" Then  
            If IsNumeric(Mid(Target.Formula, Len(shComment.Name) + 4)) Then  
                lig = Mid(Target.Formula, Len(shComment.Name) + 4)  
                Target.AddComment  
                Target.Comment.Visible = False  
                Target.Comment.Text Text:=shComment.Cells(lig, 5).Value  
            End If  
        End If  
    End Sub  
    


    Ne marche que pour les colonnes jusqu'à AZ (BA, etc, posent un problème sûrement inutile à traiter ?)
    Une formule du type =Feuil1!B4&"toto" ou =Feuil1!B4+12 sera sans commentaire.
    Si la formule change le commentaire évolue ou est supprimé.

    CommentaireAuto.xls

    eric

    EDIT: fichier mis à jour et complété grace aux remarques et apports de mic 13710
    1
    1. mic13710 Messages postés 1165 Date d'inscription   Statut Membre Dernière intervention   360
       
      Salut Eric,

      Ouah ! Ca c'est un beau code !
      Merci beaucoup pour ta proposition, elle marche au poil pour associer les commentaires avec les cellules.
      J'aurais pensé qu'il y avait une fonction d'excel pour faire cela, mais s'il faut en passer par du vba, pourquoi pas !

      J'ai donc copié et adapté ton code a mon projet.
      J'ai ensuite limité la zone d'application aux seules cellules concernées en rajoutant les lignes suivantes dans les Sub Worksheet :
      If Target.Row >= 10 And Target.Row <= 159 And Target.Column = 2 Then
      MajCommentaire Target
      End If

      Puis j'ai fait des essais, et j'ai rencontré quelques problèmes.

      Tout d'abord, les cellules sur lesquelles doivent s'appliquer les commentaires sont protégées (j'avais oublié de le préciser), et même si j'autorise les commentaires (DrawingObjects:=False), la macro plante. Elle ne fonctionne que si j'ôte la protection sur la feuille. Franchement, je ne souhaite pas déprotéger cette feuille pour que les commentaires puissent fonctionner car les utilisateurs sont plutôt du genre "gros doigts" et sont tout à fait capables de me véroler le programme.

      Ensuite, la macro plante aussi si je sélectionne plusieurs cellules. Il faudrait qu'elle ne soit active que pour un choix unique de cellule.

      Enfin, la dimension par défaut du cadre des commentaires est insuffisante pour afficher tout le texte. Est-ce que la dimension du cadre peut-être variable en fonction du texte a y insérer (largeur fixe par exemple et hauteur variable par exemple), et sinon, est-il possible de définir une dimension du cadre dans la macro ?

      Je ne suis pas un spécialiste en vba et je n'ai pas compris l'astuce entre les Sub Worksheet_Change(ByVal Target As Range) et Worksheet_SelectionChange(ByVal Target As Range).

      Merci encore une fois pour ton aide.

      Michel
      0
    2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Oulaaa, que de questions...

      les cellules sur lesquelles doivent s'appliquer les commentaires sont protégées
      Au .protect ajoute le paramètre UserInterfaceOnly = True
      Ca devrait suffire

      la macro plante aussi si je sélectionne plusieurs cellules
      Au début de la macro principale ajoute :
      if target.cells.count >1 then exit sub

      la dimension par défaut du cadre des commentaires est insuffisante
      Après le .addcomment ajoute :
      Target.Comment.Shape.Width = 200 'largeur
      Target.Comment.Shape.Height = 100 'hauteur
      A toi de trouver les valeurs qui te vont bien.
      Quant à régler la hauteur.... amuse toi à trouver le coefficient qui va bien pour Height en fonction de la longueur de la chaine ;-)

      Worksheet_Change(ByVal Target As Range)
      Fabrique ou supprime le commentaire sur une édition de la cellule, qu'il apparaisse dès la saisie de la formule sans avoir besoin de sélectionner une autre cellule pour revenir sur celle qui doit avoir le commentaire.

      Worksheet_SelectionChange(ByVal Target As Range).
      Fabrique ou supprime le commentaire sur sélection de la cellule : pour ne pas t'obliger à revalider toutes les formules déjà existante. Le commentaire se met lorsque tu la sélectionnes.
      Ou bien tu vides une plage, les commentaires restent : tu peux les enlever en cliquant sur chaque cellule.

      eric
      0
    3. mic13710 Messages postés 1165 Date d'inscription   Statut Membre Dernière intervention   360
       
      Bonjour Eric,

      Tout d'abord merci pour ta patience et tes explications.

      J'ai continué à travailler sur le code avec les infos de ton dernier message et voila ce qu'il est devenu :

      Option Explicit   
      
      Private Sub Worksheet_SelectionChange(ByVal Target As Range)   
          If Target.Row >= 10 And Target.Row <= 159 And Target.Column = 2 Then   
              MajCommentaire Target   
          End If   
      End Sub   
      
      Sub MajCommentaire(Target)   
          ' commentaire auto   
          If Target.Cells.Count > 1 Then Exit Sub   
          Dim shComment As Worksheet, lig As Long   
          Set shComment = Worksheets("xxxxxxx")   
          ActiveSheet.Unprotect Password:="....."   
          Target.ClearComments   
          If IsNumeric(Mid(Target.Formula, Len(shComment.Name) + 4)) Then   
               lig = Mid(Target.Formula, Len(shComment.Name) + 4)   
               If shComment.Cells(lig, 5) > 0 Then   
                   Target.AddComment   
                   With Target.Comment   
                       .Shape.Width = 300   
                       .Shape.Height = 70   
                       .Visible = False   
                       .Text Text:=shComment.Cells(lig, 5).Value   
                   End With   
               End If   
           End If   
          ActiveSheet.Protect Password:="......", UserInterfaceOnly:=True   
      
      End Sub   
      

      J'ai supprimé le "Private Sub Worksheet_Change(ByVal Target As Range)" car toutes mes cellules sont déjà renseignées par les formules de manière permanente et protégée.

      J'ai donc supprimé aussi la vérification de la formule puisqu'inutile (If Left(Target.Formula, Len(shComment.Name) + 3) = "=" & shComment.Name & "!B" Then)

      J'ai par contre gardé le "If IsNumeric" car j'ai une cellule dans le range qui n'a pas de formule (que du texte) et n'a pas de commentaire attaché.

      J'ai finalement été obligé de désactiver/réactiver la protection car la macro plantait toujours. Pour info, j'avais déjà le" UserInterfaceOnly:=True" dans ma macro Sub Workbook_Open().

      Enfin, j'ai dû rajouter une vérification du contenu de la cellule contenant le texte du commentaire (If shComment.Cells(lig, 5) > 0 Then) car une cellule vide plantait la macro.

      Tout ceci fonctionne à merveille grâce a tes explications.

      Dernier point sur lequel je bute encore en tant que newbie : je voudrais passer la taille des caractères à 10 pour plus de lisibilité. J'ai essayé ".Font.size = 10" et ".Shape.Font.Size = 10" dans le "With Target.Comment", mais je me fais jeter. As-tu une solution à me proposer ?
      0
    4. mic13710 Messages postés 1165 Date d'inscription   Statut Membre Dernière intervention   360
       
      Finalement, je m'auto répond :

      L'instruction a rajouter dans le "With Target.Comment" est la suivante :
         
                          .Shape.TextFrame.Characters.Font.Size = 10  
      
      


      J'en ai profité pour travailler sur les dimensions automatiques et la présentation des commentaires.

      Après quelques recherches sur la toile, voici mon code final :

      Option Explicit  
      
      Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
          If Target.Row >= 10 And Target.Row <= 159 And Target.Column = 2 Then  
              MajCommentaire Target  
          End If  
      End Sub  
      
      Sub MajCommentaire(Target)  
          ' commentaire auto  
          If Target.Cells.Count > 1 Then Exit Sub  
          Dim shComment As Worksheet, lig As Long, cmtarea As Long  
          Set shComment = Worksheets("xxxxxx")  
          ActiveSheet.Unprotect Password:="......"  
          Target.ClearComments  
          If IsNumeric(Mid(Target.Formula, Len(shComment.Name) + 4)) Then  
              lig = Mid(Target.Formula, Len(shComment.Name) + 4)  
              If shComment.Cells(lig, 5) > 0 Then  
                  Target.AddComment  
                  With Target.Comment  
                      .Shape.AutoShapeType = msoShapeRoundedRectangle  
                      .Visible = False  
                      .Text Text:=shComment.Cells(lig, 5).Value  
                      .Shape.TextFrame.Characters.Font.Size = 10  
                      .Shape.TextFrame.AutoSize = True  
                      If .Shape.Width > 300 Then  
                          cmtarea = .Shape.Width * .Shape.Height  
                          .Shape.Width = 300  
                          .Shape.Height = (cmtarea / 300) * 1.1  
                      End If  
                  End With  
              End If  
          End If  
          ActiveSheet.Protect Password:="......", UserInterfaceOnly:=True  
      
      End Sub


      Avec ce code, la hauteur des cadres des commentaires s'ajuste automatiquement en fonction de leur surface si leur largeur est supérieure à 300.
      J'ai aussi arrondi les angles pour faire moins austère et le résultat est très convaincant.

      Mon problème est donc résolu et tout fonctionne comme je le souhaitais.

      Merci à Pilas31 pour son aide et surtout à Eric qui m'a donné toutes les bases nécessaires pour réussir mon projet.
      0
    5. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Je venais te répondre mais plus la peine je vois... :-)

      Je le met quand même car ça ouvre d'autres perspectives : mettre en gras ou en couleur des mots etc
                      With Target.Comment 
                          .Shape.Width = 150 
                          .Shape.Height = 30 
                          .Visible = True 
                          .Text Text:=shComment.Cells(lig, 5).Value 
                          ' changement police commentaire 
                          .Shape.Select 
                          Selection.Characters(1, Len(shComment.Cells(lig, 5).Value)).Font.Name = "Arial" 
                          Selection.Characters(1, Len(shComment.Cells(lig, 5).Value)).Font.Size = 12 
                          Selection.Characters(1, 11).Font.ColorIndex = 3 
                          .Visible = False 
                          Target.Select 
                      End With


      Et merci à toi pour le retour, pas mal pour un newbie (qui apprend vite) ;-)

      eric
      0
  2. pilas31 Messages postés 1878 Statut Contributeur 648
     
    Bonjour,

    Je ne sais pas si c'est exactement cela mais voici une proposition.

    Insérer en VBA dans le code associé à la feuille dans laquelle on souhaite avoir ce comportement, une macro du type :

    
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target = Range("A1") Then
            Range("B3").Comment.Text Text:=Range("A1").Value
        End If
    End Sub
    
    


    Dans cet exemple on suppose que l'on veut en commentaire de la cellule B3 le texte qui se trouve dans la cellule A1.

    Le code de la macro est donc activée chaque fois que la cellule A1 est modifiée.

    A+
    0
    1. mic13710 Messages postés 1165 Date d'inscription   Statut Membre Dernière intervention   360
       
      Salut Pilas et merci pour ta réponse.

      Je n'ai pas encore essayé mais j'y vois deux problèmes dans mon application :
      1- j'ai 150 cellules à surveiller
      2- je fais des classements sur ces 150 cellules et donc elles changent de place alors que les cellules contenant les commentaires sont toujours à la même place.

      Je m'explique.
      Pour simplifier, j'ai un fichier avec 2 feuilles.
      Sur la première feuille se trouvent listées dans un tableau les 150 lignes de données.
      Dans la colonne B se trouvent les noms simples et dans la colonne E les descriptions détaillées correspondantes.
      Sur la deuxième feuille j'ai des liens vers les 150 cellules de la colonne B (noms simples) sur lesquels j'opère des classements selon différents critères.
      Afin de ne pas avoir à changer à chaque fois de feuille pour consulter la description associée à un nom simple, je souhaiterais pouvoir la faire apparaître sous forme de commentaire directement en posant la souris sur le nom simple (ou au pire, en cliquant dessus).
      Il faut donc associer ce commentaire à la cellule correspondante dans la première feuille.
      Par exemple : Feuille1 cellule B15 (nom simple), cellule E15 (détail), la cellule de la feuille 2 comportant la formule "=Feuille1!B15" dont la position peut varier selon le classement doit avoir un commentaire toujours associé au contenu de la cellule E15 de la feuille1.
      Donc le seul élément de la feuille 2 qui peut renvoyer vers la bonne cellule de la feuille 1 est la formule "=Feuille1!B15".
      Pour info, les classements se font sur la même colonne.

      Crois-tu qu'en développant à partir de "Sub Worksheet_Change" on puisse réaliser ce que je souhaite ?
      0
    2. pilas31 Messages postés 1878 Statut Contributeur 648
       
      Je n'ai pas encore regardé si mon exemple peut se généraliser à ton cas mais mon premier reflexe dans le cas décrit est plutôt l'utilisation de RECHERCHEV.

      Par exemple si ton libéllé court se trouve en colonne A (de la feuille2) tu peux mettre automatiquement dans une autre colonne de la feuille 2 la formule suivante (en ligne1) puis en copiant vers le bas :
      
      =RECHERCHEV(A1;Feuil1!$B$1:$E$150;4;FAUX) 
      
      


      ainsi, si tu fais des tris sur ta colonne A, la description ramenée par la formule RECHERCHEV sera toujours la bonne.

      A+
      0
    3. mic13710 Messages postés 1165 Date d'inscription   Statut Membre Dernière intervention   360
       
      Merci Pilas pour ton aide. Je connais bien ces fonctions de recherches matricielles mais ce n'est pas ce que je cherche.
      C'est un commentaire que je souhaite afficher et non effectuer la copie d'une cellule dans une autre.
      La solution qu'eriiic propose ci-dessous me semble plus se rapprocher de mon besoin car c'est réellement le détail sous forme de commentaire qui s'affiche.
      Je vais donc creuser dans cette direction.

      Merci encore d'avoir consacré de ton temps pour me venir en aide.
      0