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 ?
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
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?
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.
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 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.
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
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
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
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" ?
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!
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
''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! :-)
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.
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 :
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
Je vais essayer celà au plus vite et je te reviens.
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