Commentaire de cellule fourni par VB

Résolu/Fermé
KelvinZer0 Messages postés 13 Date d'inscription dimanche 29 mai 2016 Statut Membre Dernière intervention 19 juillet 2016 - Modifié par KelvinZer0 le 17/07/2016 à 10:17
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 - 20 juil. 2016 à 00:15
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
A voir également:

5 réponses

eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 209
17 juil. 2016 à 10:55
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
KelvinZer0 Messages postés 13 Date d'inscription dimanche 29 mai 2016 Statut Membre Dernière intervention 19 juillet 2016
17 juil. 2016 à 11:17
Bonjour Éric,
Je vais essayer celà au plus vite et je te reviens.
0
KelvinZer0 Messages postés 13 Date d'inscription dimanche 29 mai 2016 Statut Membre Dernière intervention 19 juillet 2016 > KelvinZer0 Messages postés 13 Date d'inscription dimanche 29 mai 2016 Statut Membre Dernière intervention 19 juillet 2016
17 juil. 2016 à 11:53
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
Mike-31 Messages postés 18310 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 mars 2024 5 073
17 juil. 2016 à 11:04
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
KelvinZer0 Messages postés 13 Date d'inscription dimanche 29 mai 2016 Statut Membre Dernière intervention 19 juillet 2016
Modifié par KelvinZer0 le 17/07/2016 à 11:21
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
Mike-31 Messages postés 18310 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 mars 2024 5 073
Modifié par Mike-31 le 17/07/2016 à 11:25
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
Bonjour
peux être comme ça

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


A+
Maurice
0
KelvinZer0 Messages postés 13 Date d'inscription dimanche 29 mai 2016 Statut Membre Dernière intervention 19 juillet 2016
17 juil. 2016 à 11:09
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
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
Mike-31 Messages postés 18310 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 mars 2024 5 073
Modifié par Mike-31 le 17/07/2016 à 12:12
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
Maurice > Mike-31 Messages postés 18310 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 mars 2024
17 juil. 2016 à 12:37
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KelvinZer0 Messages postés 13 Date d'inscription dimanche 29 mai 2016 Statut Membre Dernière intervention 19 juillet 2016
17 juil. 2016 à 12:14
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
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 209
17 juil. 2016 à 12:34
essaie avec :
c.Comment.Shape.Height = 12
c.Comment.Shape.Width = 90

voir si c'est plus supportable
0
KelvinZer0 Messages postés 13 Date d'inscription dimanche 29 mai 2016 Statut Membre Dernière intervention 19 juillet 2016 > eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023
Modifié par KelvinZer0 le 17/07/2016 à 12:59
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
KelvinZer0 Messages postés 13 Date d'inscription dimanche 29 mai 2016 Statut Membre Dernière intervention 19 juillet 2016 > KelvinZer0 Messages postés 13 Date d'inscription dimanche 29 mai 2016 Statut Membre Dernière intervention 19 juillet 2016
Modifié par KelvinZer0 le 17/07/2016 à 13:51
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
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 209
Modifié par eriiic le 17/07/2016 à 15:26
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
KelvinZer0 Messages postés 13 Date d'inscription dimanche 29 mai 2016 Statut Membre Dernière intervention 19 juillet 2016 > eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023
Modifié par KelvinZer0 le 19/07/2016 à 17:08
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