Commentaire de cellule fourni par VB

Résolu
KelvinZer0 Messages postés 13 Statut Membre -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Après moult recherche, sur ce forum et sur le net, je n'arrive pas à débugger mon code. Je vous explique ce que je cherche à faire, et ensuite mon code (défaillant).

J'ai créé un formulaire (UserForm1), dans lequel j'ai 6 TextBox modifiables.
L'utilisateur peut entrer 6 chiffres, qui définiront ensuite le contenu de 6 cellules sur ma feuille principale. Les cellules sont définies en utilisant un bouton du type "Save and Exit", en utilisant la commande "Unload Me". Jusque là, tout baigne ; les cellules sont peuplées par un nouveau contenu défini par l'utilisateur, et la fenêtre se ferme.

Mais voilà, ce que je cherche à faire, c'est que les commentaires d'autres cellules possèdent ces six chiffres, sous la forme (par exemple), de 0-1-2-3-4-5, en commentaires. Voici mon code

Private Sub Bouton1_Click()
Dim SZ_comm As String
SZ_comm = Range("BR9") & "-" & Range("BR10") & "-" & Range("BR11") & "-" & Range("BR12") & "-" & Range("BR13") & "-" & Range("BR14")
With Range("BB7:BB308")
.DeleteComments
.Comment.Text Text:=SZ_comm
End With
Unload Me
End Sub

Donc, pour commencer, ma variable SZ_comm semble bien fonctionner ; en passant ma souris par dessus, l'infobulle indique "SZ_comm = "0-1-2-3-4-5". Les chiffres des cellules sont là, et la chaîne semble s'être bien concaténé.

Seulement, c'est au moment d'attribuer ce String en tant que commentaire pour la plage de cellules BB7:BB308 qui fait défaut. J'ai essayé toutes les formes qui m'ont été proposées sur bien des forums, mais rien à faire!...

Quelqu'un voit-il ce qui cloche? Et comment pouvons-nous faire pour attribuer un même commentaire à une plage de cellules de façon correcte en VB ?

Merci à vous!
Cordialement,
Kelvin

5 réponses

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

    je ne pense pas que tu puisse travailler sur la plage.
    Sub test()
        Dim c As Range
        For Each c In Range("A2:A5")
            If c.Comment Is Nothing Then c.AddComment
            c.Comment.Text Text:="test"
            c.Comment.Shape.TextFrame.AutoSize = True
        Next c
    End Sub 

    eric
    1
    1. KelvinZer0 Messages postés 13 Statut Membre
       
      Bonjour Éric,
      Je vais essayer celà au plus vite et je te reviens.
      0
      1. KelvinZer0 Messages postés 13 Statut Membre > KelvinZer0 Messages postés 13 Statut Membre
         
        Bonjour Eriic,
        Euréka! Le code s'exécute et les commentaires sont changées pour la valeur contenu dans la variable "SZ_comm". Merci !

        Seulement, j'aimerais ton commentaire (ou d'autres personnes) sur mes 3 observations suivantes :

        1- Si je comprends bien ton code, la fonction "AddComment" crée un objet "comment", car sinon, cet objet n'existe pas? Je croyais que chaque cellules possédaient déjà un commentaire vide, et qu'il s'agissait de le peupler. Donc, il serait inutile d'utiliser ".Comment" si un object de commentaire n'est pas d'abord créé. C'est celà ?

        2- Que vient faire la formule "c.Comment.Shape.TextFrame.AutoSize = True" ?

        3- Lorsque j'appuis sur mon bouton pour exécuter ma sous-routine, je ressens un puissant LAG, alors qu'en bas à gauche, un descriptif qui dit : "Cellule #cellule commenté par User" s'incrémente graduellement, mais tout à coup gèle complètement l'application aux alentours de BB100, puis débloque pour effectuer le reste. Est-ce que ma deuxième observation serait reliée à ce problème?

        Merci à toi!
        Cordialement,
        Kelvin
        0
  2. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    Bonjour,

    pour supprimer tes commentaires le code n'est pas
    .DeleteComments
    mais
    .ClearComments

    ensuite que veux tu faire avec cette ligne
    .Comment.Text Text:=SZ_comm
    1
    1. KelvinZer0 Messages postés 13 Statut Membre
       
      Bonjour Mike,
      Avec cette ligne, j'essais d'attribuer la variable SZ_comm (qui contient ma série concaténée de chiffres "0-1-2-3-4-5") aux commentaires des cellules de la plage BB7:BB308.
      0
    2. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
       
      Re,

      Alors prends le code d'Eriiic que je salue et adapte le


      Dim c As Range
      Dim SZ_comm As String
      SZ_comm = Range("BR9") & "-" & Range("BR10") & "-" & Range("BR11") & "-" & Range("BR12") & "-" & Range("BR13") & "-" & Range("BR14")
      For Each c In Range("BB7:BB308")
      If c.Comment Is Nothing Then c.AddComment
      c.Comment.Text Text:=SZ_comm
      c.Comment.Shape.TextFrame.AutoSize = True
      Next c
      0
  3. Maurice
     
    Bonjour
    peux être comme ça

    With Range("BB7:BB308")
        .ClearContents
        .Value = SZ_comm
    End With
    


    A+
    Maurice
    0
    1. KelvinZer0 Messages postés 13 Statut Membre
       
      Bonjour Maurice,
      Celà ne fonctionne pas. Avec ton code, toutes les cellules sont peuplées par SZ_comm, mais pas les commentaires. C'est ce que je cherche à faire : modifier les commentaires des cellules de BB7 jusqu'à BB308, pas le contenu des cellules elles-mêmes.
      Merci tout de même pour cette tentative. J'apprécie beaucoup.
      0
  4. Maurice
     
    Re Bonjoup
    j'ais mal lu HI
    test avec cette macro
    Sub Bouton()
    Dim SZ_comm As String
    SZ_comm = Range("BR9") & "-" & Range("BR10") & "-" & Range("BR11") & "-" & Range("BR12") & "-" & Range("BR13") & "-" & Range("BR14")
    
       Range("BB7:BB308").Delete
       
       For L = 7 To 308
          Range("BB" & L).AddComment SZ_comm
       Next
    End Sub
    

    A+
    Maurice
    0
    1. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
       
      Salut Maurice,

      je pense que tu voulais écrire
      Range("BB7:BB308").ClearComments
      et non Range("BB7:BB308").delette
      qui supprime la plage ce qui décale d'autant les données colonne BR

      cordialement
      0
      1. Maurice > Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Bonjour Mike
        oui je vais un peux vite
        voila j'ais fini

        Sub Bouton()
        Dim SZ_comm As String
        SZ_comm = Range("BR9") & "-" & Range("BR10") & "-" & Range("BR11") & "-" & Range("BR12") & "-" & Range("BR13") & "-" & Range("BR14")
        For L = 7 To 308
        Range("BB" & L).ClearComments
        Range("BB" & L).AddComment SZ_comm
        Next
        End Sub

        A+
        Maurice
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. KelvinZer0 Messages postés 13 Statut Membre
     
    Donc voici.
    Après test (et adaptation du code d'Ériiic), celà fonctonne très bien. Donc voici à nouveau ce même code :
    Dim SZ_comm As String
    Dim c As Range
    SZ_comm = Range("BR9") & "-" & Range("BR10") & "-" & Range("BR11") & "-" & Range("BR12") & "-" & Range("BR13") & "-" & Range("BR14")
    For Each c In Range("BB7:BB308")
    If c.Comment Is Nothing Then c.AddComment
    c.Comment.Text Text:=SZ_comm
    c.Comment.Shape.TextFrame.AutoSize = True
    Next c

    Cependant, celà génère un lag (ralentissement sévère) de l'application lorsque le code est exécuté. J'ai soutiré la ligne contenant le "Shape. TextFrame.Autosize", et le code s'exécute de façon éclair sans aucun lag. Je comprends que cette ligne sert à rendre l'infobulle de la même taille que son contenu, mais c'est si pesant à exécuter qu'on a l'impression que Excel va planter...

    Puisque le contenu de cette infobulle devrait être relativement toujours de la même grosseur, existe-t-il un moyen de lui donner une dimension précise sans la confronter à un redimensionnement "auto" ?

    Merci à vous tous!
    Cordialement,
    Kelvin
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      essaie avec :
      c.Comment.Shape.Height = 12
      c.Comment.Shape.Width = 90

      voir si c'est plus supportable
      0
    2. KelvinZer0 Messages postés 13 Statut Membre > eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Effectivement !
      Le code s'exécute de façon instantané si les valeurs de dimension sont précises, et que la fonction "AutoSize" n'est pas sollicitée. Cette dernière faisant vraiment ralentir l'application au point mort durant 5 à 6 secondes... effrayant!

      Je m'approche rapidement d'une réponse entièrement satisfaisante à tous mes besoins présents (et futurs!). Ce que je cherche maintenant à faire pour conclure, vous expliquant textuellement, c'est ceci :

      Serait-il possible que le premier commentaire soit "Autosize", mais que par la suite, les commentaires suivants empruntent la nouvelle dimension du premier commentaire? Nous aurions donc affaire à un seul autosize, et le reste des commentaires emprunteraient cette dernière dimension.

      Je pense qu'après ça, mon problème serait résolu de façon totale.

      Vous ne pouvez pas imaginer ma joie d'avoir des réponses si rapides.
      Vous faites ma journée! Merci!

      Cordialement,
      Kelvin
      0
    3. KelvinZer0 Messages postés 13 Statut Membre > KelvinZer0 Messages postés 13 Statut Membre
       
      Alors voilà !
      J'ai joué un peu avec le code (et mon peu de connaissance excel) pour en arriver à une formule qui fonctionne tel que je l'ai décrit. J'ai simplement créé 2 variables supplémentaires, contenant les valeur X et Y des dimensions du premier commentaire :
      Dim SZ_comm As String
      Dim c As Range
      Dim SZ_x_size As Integer
      Dim SZ_y_size As Integer

      SZ_comm = Range("BR9") & "-" & Range("BR10") & "-" & Range("BR11") & "-" & Range("BR12") & "-" & Range("BR13") & "-" & Range("BR14")

      ''Création du premier commentaire :
      If Range("BB7").Comment Is Nothing Then Range("BB7").AddComment
      Range("BB7").Comment.Text Text:=SZ_comm
      Range("BB7").Comment.Shape.TextFrame.AutoSize = True

      ''Requête des dimensions de ce dernier :
      SZ_x_size = Range("BB7").Comment.Shape.Width
      SZ_y_size = Range("BB7").Comment.Shape.Height

      ''Création des autres commentaires
      For Each c In Range("BB9:BB308")
      If c.Comment Is Nothing Then c.AddComment
      c.Comment.Text Text:=SZ_comm
      c.Comment.Shape.Width = SZ_x_size
      c.Comment.Shape.Height = SZ_y_size
      Next c

      Bien que je trouve le code un peu plus compliqué (peut-être pour rien, si vous voyez, dites!), Excel semble toutefois trouver cette formule plus élégante et l'exécute de façon automatique (au lieu d'un délai critique de 5 à 6 secondes).

      Merci à tous pour votre aide! Ériiic, Mike et Maurice !
      Vous m'avez grandement aidé aujourd'hui! :-)

      À Bientôt!
      Cordialement,
      Kelvin
      0
    4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      5 lignes de plus ce n'est rien si ça fonctionne comme tu l'entends.
      Seul truc que je changerais : As Integer
      256 c'est souvent trop court.
      Surtout que vba converti tous les entiers en Long... Du coup plutôt que de gagner du temps comme dans un autre langage en fait tu en perds (temps de la conversion) en plus de limiter en taille.
      Les inconvénients sans les avantages quoi.
      0
    5. KelvinZer0 Messages postés 13 Statut Membre > eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Rebonjour Ériiic,
      Je ne comprends pas ce que tu veux dire par : "256 c'est souvent trop court", alors qu'un Integer couvre 16 bits (-32,768 à +32,768).......? Je me trompe ?

      Après avoir lu un article, je conclu avec toi qu'utiliser "As Integer" n'est pas une bonne idée. Ce qui est intéressant, c'est que ce n'est pas VBA qui converti l'Integer en Long, mais le CPU ! L'ordinateur se doit de traiter les choses en 32bits minimum, et après calcul, reconverti le résultat en Integer pour VBA, qui lui en circonstance ne traitera pas autre chose.

      Donc,.. que devrais-je écrire lorsque je déclare mes variables? Ne rien mettre du tout? tel :
      Dim SZ_y_size = 0
      ?

      Merci beaucoup de ton aide Ériiic.

      Au plaisir!
      Kelvin
      0