IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Insérer un commentaire avec VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 110
    Par défaut Insérer un commentaire avec VBA
    Bonjour

    Sur une case d'une feuille Excel quand je fais bouton droit dessus il y à l'option pour "insérer un commentaire".

    Est il possible de réaliser ça avec VBA dans un code ?

    Si oui comment ça s'appelle le code ou la fonction qui le permet ?

    Merci pour vos réponses.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 553
    Par défaut
    voici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Range("C2").Select
        Range("C2").AddComment
        Range("C2").Comment.Visible = False
        Range("C2").Comment.Text Text:="Ton commentaires"    
        Range("F4").Select
    Evidemment, le commentairesse mettre sur la cellule C2... a toi de te débrouiler pour mettre le commentaire dans le cellule qui t'arrange

  3. #3
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Comme je dis toujours, pour quoi des Select quand on peut s'en passer ? surtout qu'ils ralentissent l'exécution du code...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With Range("C2")
        .AddComment
        .Comment.Visible = False
        .Comment.Text Text:="Ton commentaires"
    end With

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 110
    Par défaut
    ok merci !

    Désolé pour les réponses tardives mais étant en week end sans internet, je n'ai pas pu répondre ni voir vos réponses.

    De retour au bureau ce matin j'essaie ce que vous m'avez donné et je vous fais un retour rapide.

    Merci encore

  5. #5
    Membre éclairé Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Par défaut
    Suis d'accord avec Zaza moi !

    Les Select ça fout le brain...
    Je m'en sert jamais, mais ça doit qd meme avoir une utilité à un moment donné !
    Mais lequel...

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 553
    Par défaut
    Bonjour,

    Avant de dire que le Selct est beaucoup plus lent que le With, il faut vérifier et non pas se fier ce que chacun peut dire ou penser

    Je viens de faire un petit test car je voulais vérifier et savoir pour m'améliorer si le With était effectivement plus performant

    Voici le code et les résultat... vous pouvez essayer si vous le vouler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Function methode(m As Integer,nbre as long) As String
    Dim d1, d2 As Date
    Dim i As Long
    d1 = Now()
    i = 1
    While i <= nbre
        If m = 1 Then
            Range("C" & i).Select
            Range("C" & i).AddComment
            Range("C" & i).Comment.Visible = False
            Range("C" & i).Comment.Text Text:="Ton commentaires"
        End If
        If m = 2 Then
            With Range("D" & i)
                .AddComment
                .Comment.Visible = False
                .Comment.Text Text:="Ton commentaires"
            End With
        End If
        i = i + 1
    Wend
     
    d2 = Now()
    methode = CStr(DateDiff("s", d1, d2))
     
    End Function
     
     
    Sub test()
        Dim str1, str2 As String
        Dim nbreLignes as long
       nbreLignes=5000
        str1 = methode(1,nbreLignes)
        str2 = methode(2,nbreLignes)
     
        MsgBox "Méthode 1 en " & str1 & " secondes" & Chr(13) & "Méthode 2 en " & str2 & " secondes"
    End Sub
    Voici les résultats :
    Pour 100 lignes : m1 en 0 s contre 1 s pour la m2
    Pour 2000 lignes : m1 en 7 s contre 11 s pour la m2
    Pour 5000 lignes : m1 en 25 s contre 75 s pour la m2

    Donc visiblement, les choses ne s'arrangent pas avec masse de données donc, je pense que le select est plus performant que le With (au moins dans ce genre de cas)

    Juste pour vous informer que nos propres habitudes ne sont pas forcément les meilleures....

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    C'est ce qu'on appelle une démonstration par l'absurde.
    J'ai fait le test que tu proposes en utilisant ton code.
    Résultat:
    M1 = 24s
    M2 = 59s

    Je me suis alors amusé à intervertir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        str1 = methode(1, nbreLignes)
        str2 = methode(2, nbreLignes)
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        str2 = methode(2, nbreLignes)
        str1 = methode(1, nbreLignes)
    Ce qui donne:
    M1 = 43s
    M2 = 22s

    Tout ce que ton test prouve, c'est que, plus il y a de commentaires dans une feuille, plus le code est lent.

    Par contre, j'ai fait les 2 tests séparément et voici les résultats:
    M1 = 24s
    M2 = 21s
    Donc, 12,5% de gain de temps.

    Ah oui, encore une chose.
    Pour que le test ait un sens, mes 2 essais ont été faits dans les mêmes conditions:
    Nouveau classeur, copie du code dans le module de feuille, puis exécution via le menu Outils - Macro.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  8. #8
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Bin...

    J'ai fait le test comme toi Alain, 2 procédures différentes, dans 2 classeurs différents, en prenant même soin de fermer Excel entre l'exécution de chaque procédure afin d'être certain de vider la mémoire.

    J'ai en plus ajouter un Application.ScreenUpdating = False à chaque procédure et là j'obtiens des résultats surprenants...!

    Pour 5000 lignes :
    • (M1) procédure avec la méthode "Select" = 1,26 sec.
    • (M2) procédure avec la méthode "With" = 17,07 sec.


    Bin... je vais revoir mon jugement sur ces satanés "Select"

  9. #9
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Je ne crois pas avoir jamais dit que les Select ralentissaient (quoique, à force de le lire, j'aurais, peut-être, fini par le répéter).

    Mais...
    Le code est beaucoup plus robuste sans utiliser de Selection et autre ActiveSheet.

    Au vu des différents tests effectués, je me suis dit que, même en utilisant un objet Range déclaré, il pouvait être utile de sélectionner la cellule sur laquelle on travaille.

    Voici donc le code sur lequel j'ai travaillé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Function methode(nbre As Long) As String
      Dim d1 As Date, d2 As Date
      Dim i As Long
      Dim r As Range
      d1 = Now()
      i = 1
      While i <= nbre
    '    Cells(i, 3).Select
    '    Selection.AddComment
    '    Selection.Comment.Visible = False
    '    Selection.Comment.Text Text:="Ton commentaires"
        Set r = Cells(i, 3)
        r.Select
        r.AddComment
        r.Comment.Visible = False
        r.Comment.Text Text:="Ton commentaires"
        i = i + 1
      Wend
     
      d2 = Now()
      methode = CStr(DateDiff("s", d1, d2))
     
    End Function
     
     
    Sub test()
      Dim str1, str2 As String
      Dim nbreLignes As Long
      Application.ScreenUpdating = False
      nbreLignes = 20000
      str1 = methode(nbreLignes)
     
      MsgBox str1 & " secondes"
    End Sub
    en commentant / décommentant une méthode ou l'autre.

    J'ai dû augmenter le nombre de lignes pour que la différence de temps soit significative (avec 5000 lignes j'arrivais à 2 secondes sur un vieux P3).

    La conclusion est que, en utilisant un objet range déclaré (r) ou Selection, on ne peut pas constater de différence notable entre les 2 méthodes.

    Il semblerait donc qu'Excel se crée un mini environnement d'accès plus rapide autour de la cellule sélectionnée.

    En conclusion:
    Eviter d'utiliser les Selection et Activeqqch pour la robustesse du code MAIS sélectionner la cellule à traiter pour accélérer ce même code (en désactivant le ScreenUpdating, bien entendu).
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Par défaut
    Bonjour a tous,

    Sans vouloir faire de polémique et en toute amitié il me semble que vous oubliez une chose essentielle: Le code proposé est de mauvaise qualité pour la tache à effectuer.

    Si je devais ajouter 5000 commentaires je le ferais plutot comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Methode3()
        Dim Cell As Range
        For Each Cell In Range("A1:A5000")
            Cell.AddComment "Ton commentaire"
            Cell.Comment.Visible = False
        Next
    End Sub
    Je vous laisse mesurer le temps d'exécution qui à n'en pas douter sera certainement bien plus court.

    Je continue donc à penser que l'usage de Select est une pratique qui ne sera jamais bénéfique en terme de performances et toujours génératrice de code plus long à ecrire, plus difficile à lire et plus difficile à maintenir.


    Au plaisir de vous lire,

    Tirex28/

  11. #11
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Citation Envoyé par tirex28 Voir le message
    Sans vouloir faire de polémique
    Idem pour moi.

    Le but était de vérifier une affirmation souvent répétée.
    Il est clair que je privilégie toujours le For Each quand c'est possible mais, s'il faut travailler sur un index, il est bon de connaître les implications des différentes manières.

    Pour info, la boucle sur 20000 lignes avec un For Each à pris 12 secondes (contre 17 pour le code de mon précédent message) dans les mêmes conditions que précédemment.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  12. #12
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Non non Alain, je n'ai pas dit que tu avais dit que...

    J'ai été surpris des résultats de mes tests parce que comme vous, j'étais persuadé que les "Select" étaient à éviter pour différentes raisons alors que les résultats me démontraient le contraire au niveau de rapidité d'exécution, j'en perdais mon latin (j'ai toujours été nul en latin de toute façon ).

    Mais...merci à Tirex d'avoir trouvé la cause de ces résultats
    Le code proposé est de mauvaise qualité pour la tache à effectuer.
    En effet, je me suis braqué sur les résultats et pas sur la procédure proprement dite

    J'ai donc revérifié tout ça sur 25000 lignes and the winner is....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub Test1()
    Application.ScreenUpdating = False
    Dim Cell As Range
        For Each Cell In Range("A1:A25000")
            Cell.AddComment "Ton commentaire"
            Cell.Comment.Visible = False
        Next
    Application.ScreenUpdating = True
    End Sub
     
    Sub Test2()
    Application.ScreenUpdating = False
    Dim Cell As Range
        For Each Cell In Range("A1:A25000")
            Cell.Select
            Selection.AddComment "Ton commentaire"
            Selection.Comment.Visible = False
        Next
    Application.ScreenUpdating = True
    End Sub
    Test1 = 4,74 sec.
    Test2 = 6,42 sec.

    Le même test sans figer le rafraîchissement de l'écran
    Test1 = 5,74 sec.
    Test2 = 142,42 sec. !!!

    Je ne parle évidemment que de l'aspect "rapidité d'exécution" puisque c'est de ça qu'il s'agissait à la base

    Merci Alain et Tirex d'avoir oté le doute que ce petit test avait mis, à l'insu de mon plein gré, dans mon esprit

  13. #13
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Pour en remettre une (dernière ?) couche, attention à la manière dont le traitement est exécuté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test1()
      Dim iStart As Long
      Dim iEnd As Long
      Dim r As Range
      iStart = GetTickCount
      For Each r In Range("C1:C10000")
        r.AddComment "Un commentaire"
        r.Comment.Visible = False
      Next r
      iEnd = GetTickCount
      Debug.Print iEnd - iStart    
    End Sub
    Temps d'exécution 8001 ms

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test2()
      Dim iStart As Long
      Dim iEnd As Long
      Dim r As Range
      iStart = GetTickCount
      For Each r In Range("C1:C10000")
        r.AddComment
        r.Comment.Visible = False
        r.Comment.Text Text:="Un commentaire"
      Next r
      iEnd = GetTickCount
      Debug.Print iEnd - iStart
    End Sub
    Temps d'exécution 81968 ms soit 10 fois plus pour une ligne de plus.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 110
    Par défaut
    J'aime bien mon retour de vacance je relis ce message et je vois les modo qui en discutaient après mon départ

    Bon quoiqu'il en soit j'ai testé et approuvé et je vous remercie pour votre aide.

  15. #15
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 249
    Par défaut
    Bonjour,
    Je déterre ce sujet pour savoir comment faire pour qu'a la place d'un texte ce soit la valeur d'une cellule qui soit dans le commentaire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With Range("C2")
        .AddComment
        .Comment.Visible = False
        .Comment.Text Text:="Ton commentaires"
    end With
    code utilisé avec un texte.
    J'ai essayé quelques trucs comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Comment.Text Text:=Sheets("Feuil2").Range("C3").Value
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Comment.Text Text:=Sheets("Feuil2").[C3].Value
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Comment.Text Text:=Sheets("Feuil2").Range("C3").Text
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Comment.Text Text:=Sheets("Feuil2").Cells(3,3).Value
    Rien n'a marché

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insérer ligne et sous totaux avec vba
    Par T17LR dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 07/11/2011, 01h03
  2. [XL-2003] Insérer une formule avec "Rank" en VBA
    Par apnw7931 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/04/2011, 12h48
  3. Insérer des commentaires Javadoc avec Eclipse
    Par lahmar.abdel1 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 29/04/2010, 15h23
  4. supprimer un commentaire avec une macro vba
    Par nsqualli dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/11/2008, 15h55
  5. Réponses: 9
    Dernier message: 19/02/2007, 21h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo