12/02-2004 à 19:41héhé, ok... je n'avais pas testé la recopie.... bon, on s'y prend différemment, car en fait, Target est valable pour une seule cellule car si on envoit seulement la sélection Target vaut par exemple $D$10 et le code fonctionne mais lorsque tu fais une sélection multiple (comme lorsque tu veux recopier vers le bas) Target vaut par exemple $D$10:$D$20 et donc ça bugge parce que l'on ne peut pas vérifier si plusieurs cellules en même temps sont égales à "" , on doit boucler sur les différentes cellules... donc voilà, j'ai modifié le code pour qu'il boucle sur chaque cellule et ma foi, s'il n'y a qu'une seule cellule, il boucle 1 fois (CQFD)...bref ! je vois à tes yeux ronds que tu ne comprends pas...
![[:D]](/medias/forum/images/smileys/4.gif)
je suis moi même épaté lorsque je me relis
![[:D]](/medias/forum/images/smileys/4.gif)
...bref, je remets le nouveau code des 2 procédures ci-dessous...testes le ....et viens réclamer si tu trouves d'autres anicorches..
Private Sub Worksheet_Change(ByVal Target As Range)
'je désigne 2 variables, les noms importe peu
'par contre le type est important
Dim Var As Range, c As Integer
'je détermine le type de donnée que contient target
'ça peut être un chiffre, un caractère, une date, autre
'comme je ne veux que traiter les chiffres, il est important
'd'obtenir ce paramètre, sinon ça bug dans la formule de
'multiplication, forcément. On ne multiplie pas une lettre
For Each Var In Range(Target.Address)
c = VarType(Var)
'ensuite, il me faut l'adresse de la cellule, pour ne
'traiter que la colonne D et aussi pour paramètrer
'le commentaire correspondant, si je traite D3, je dois
'bien sûr traiter le commentaire de D3 et pas de D6
'Var = CStr(Target.Address)
'ici, il faut que je prévois le cas où on remet la cellule à blanc,
If Var = "" Then
' j'enlève le commentaire tout simplement
ActiveSheet.Range(Var).ClearComments
'et je sors de la procédure, je n'ai plus rien à y faire
Exit Sub
End If 'si la cellule est de type chiffre, bon là je renvois vers l'aide
'places toi sur le mot VarType (plus haut), fais F1
'tu verras que 2 est un integer, 6 un double, etc
'je teste aussi si dans l'adresse de target, si j'ai la lettre D
'pour que notre procédure ne traite que cette colonne
If c > 2 And c < 6 And Mid(Var.Address, 2, 1) = "D" Then
'j appelle la macro mise dans le module et je lui transmets Var
Call Macro_Commentaire(Var)
Else 'si cela ne correspond pas, je nettoie les commentaires
'si on arrive jusqu ici, remarques que la procédure va
'se terminer toute seule
ActiveSheet.Range(Var.Address).ClearComments
End If
Next
End Sub
Sub Macro_Commentaire(Var)
'ici on entre dans la procédure et l'on est
'accompagné avec notre adresse Var, exemple $D$4
Dim Montant_EURO As String, Montant_FB As String
'on remplit la variable avec le contenu de Var
Montant_EURO = Var
'on fait le calcul on formate le résultat à 2 décimales
Montant_FB = Format((Montant_EURO * 40.3399), "###0.00")
'on doit enlever éventuellement un ancien commentaire
'avant de pouvoir le remplacer sinon bug assuré
ActiveSheet.Range(Var.Address).ClearComments
'on ajoute le commentaire à la cellule , enfin !
ActiveSheet.Range(Var.Address).AddComment "Montant en FB: " & Chr(13) & CStr(Montant_FB) & " FB"
'on formate le commentaire, d'abord la couleur exemple 3=rouge, 5=bleu
ActiveSheet.Range(Var.Address).Comment.Shape.TextFrame.Characters.Font.ColorIndex = 3
'on place en gras
ActiveSheet.Range(Var.Address).Comment.Shape.TextFrame.Characters.Font.Bold = True
'on place en italique, pourquoi pas
ActiveSheet.Range(Var.Address).Comment.Shape.TextFrame.Characters.Font.Italic = True
'on place en taille 14, pour les mal-voyants, ce qui est louable
ActiveSheet.Range(Var.Address).Comment.Shape.TextFrame.Characters.Font.Size = 14
ActiveSheet.Range(Var.Address).Comment.Shape.Height = 40
ActiveSheet.Range(Var.Address).Comment.Shape.Width = 120
End Sub
----------
Bipbipcoyote 