Commentaire de cellule fourni par VB [Résolu/Fermé]

Signaler
Messages postés
13
Date d'inscription
dimanche 29 mai 2016
Statut
Membre
Dernière intervention
19 juillet 2016
-
Messages postés
23898
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
25 février 2021
-
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

Messages postés
23898
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
25 février 2021
6 668
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
13
Date d'inscription
dimanche 29 mai 2016
Statut
Membre
Dernière intervention
19 juillet 2016

Bonjour Éric,
Je vais essayer celà au plus vite et je te reviens.
Messages postés
13
Date d'inscription
dimanche 29 mai 2016
Statut
Membre
Dernière intervention
19 juillet 2016
>
Messages postés
13
Date d'inscription
dimanche 29 mai 2016
Statut
Membre
Dernière intervention
19 juillet 2016

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
Messages postés
17301
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
20 janvier 2021
4 505
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
13
Date d'inscription
dimanche 29 mai 2016
Statut
Membre
Dernière intervention
19 juillet 2016

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.
Messages postés
17301
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
20 janvier 2021
4 505
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
Bonjour
peux être comme ça

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


A+
Maurice
Messages postés
13
Date d'inscription
dimanche 29 mai 2016
Statut
Membre
Dernière intervention
19 juillet 2016

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.
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
Messages postés
17301
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
20 janvier 2021
4 505
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
>
Messages postés
17301
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
20 janvier 2021

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
Messages postés
13
Date d'inscription
dimanche 29 mai 2016
Statut
Membre
Dernière intervention
19 juillet 2016

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
Messages postés
13
Date d'inscription
dimanche 29 mai 2016
Statut
Membre
Dernière intervention
19 juillet 2016
>
Messages postés
23898
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
25 février 2021

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
Messages postés
13
Date d'inscription
dimanche 29 mai 2016
Statut
Membre
Dernière intervention
19 juillet 2016
>
Messages postés
13
Date d'inscription
dimanche 29 mai 2016
Statut
Membre
Dernière intervention
19 juillet 2016

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
Messages postés
23898
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
25 février 2021
6 668
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.
Messages postés
13
Date d'inscription
dimanche 29 mai 2016
Statut
Membre
Dernière intervention
19 juillet 2016
>
Messages postés
23898
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
25 février 2021

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
Messages postés
23898
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
25 février 2021
6 668
Bonjour,

Oui tu as raison, les integer c'est jusqu'à 32768. J'avais fait une régression au siècle dernier ;-)

Par contre pas sûr que le CPU soit fautif. Dans d'autres langages les Integer conservent leur avantage de rapidité.
Un exemple de test avec 2 boucles, puis une affectation suivie des 4 opérations de bases. Chez moi :
Long : 22 s
Integer : 27 s, soit 20% de plus ce qui n'est pas négligeable, alors que théoriquement ça devrait être plus rapide.
Pour les seules boucles l'avantage revient aux Int avec -3%
https://www.cjoint.com/c/FGtwl5Ja5eQ

Sinon il faut toujours essayer de typer les variables au mieux et donc éviter les Variants.
Et pour les objets être le plus précis possible. Pour une feuille As Worksheet sera mieux que As Object qui sera mieux que as Variant.
eric