Bonjours, j'ai crée un macro excel pour rechercher un mots, dans une liste ou il y as un mots dans une cases, puis une valeur numérique qui lui assigné dans la case à droite de celle ou il y as le mot.
Tout, marche, sauf quand il n'y as pas de cellule ou il y as écrit "mots", et dans ce cas, là, j'aimerais que sa me colle 0.
Je sais pas si vous avez tout compris, si vous avez pas compris, n'hésiter pas à me demander plus d'information.
Merci d'avance pour vos réponses, Yojim.
Mais quelle horreur ce code. On reconnais bien là l'enregistreur de macro.
Je vais t'aider à résoudre ton problème, mais d'abord, à chaque fois que tu as un Truc.Select / Selection.Machin, écris Truc.Machin. De la même manière, à chaque fois que tu as un Truc.Activate / ActiveProut.Machin, écris Truc.Machin aussi. Tu vas voir, après c'est limpide.
Oh oui. C'est bien plus joli. Il reste un ActiveTruc. C'est mal. (spa grave)
(J'ai remplacé [fixed] par [code] dans ton message. Pour avoir les numéros de lignes. Je t'invite à l'avenir à poster tes macros de cette manière, conformément au règlement.)
Mais non. Ca ne peut pas marcher. Pourquoi ?
Cells.Find ("mots", ..) renvoie la première cellule qui contient "mots". Sur cette cellule, tu fais un déplacement, et une copie. Bon. Mais si la recherche échoue, tu tentes une action sur quelque chose qui n'exite pas. Donc entre Cells.Find ("mots", ..) et Offset(0, 1).Copy, il faut vérifier que la cellule a été trouvée.
Comment faire ? Essaie ce code :
Code :
Sub Test()
Dim c1 As Range, c2 As Range
Stop
Set c1 = Cells.Find("Mots" )
Set c2 = Cells.Find("aqwzsxedcrfvtgbyhnujikolpm" )
Stop
End Sub
La feuille courante doit contenir "Mots" mais pas "aqwzsx..." bien sûr. Exécute ([F5]). Sur le premier Stop, dans l'éditeur de VB, ouvre la fenêtre espion (Affichage/Espion.) Mets-y c1 et c2. (Soit en les glissant à la souris, soit avec le menu contextuel). Continue l'exécution ([F5]). Au second Stop, espionne les valeurs de c1 et de c2. L'un est un Range/Range de valeur "Mots", l'autre est un Range de valeur Nothing. Voilà la solution.
Reprenons ton exemple :
Code :
Dim c As Range
Set c = Cells.Find("mots" )
If c Is Nothing Then
' // Ah, c'est vide.
FonctionQuiColleZeroJeNeSaisPasOù
Else
' // Trouvé.
c.Offset(0, 1).Copy
Range("J6" ).Paste
Application.CutCopyMode = False
Range("G9" ).FormulaR1C1 = ""
End If
Evidemment, je suis sûr que J6 et G9 sont des valeurs qui devraient ne pas être constantes mais sans plus de commentaires de ta part, on en saura pas plus.
Encore une remarque. Tu as vu, j'ai fait disparaître le dernier ActiveTruc Bon, il y a rien qui m'énerve plus que les Active/Select. Parce que c'est source de gros problèmes : bugs, perfs plombées, relecture difficile. Ben sache qu'il existe un truc qui m'énerve presque autant : ce sont les Copy/Paste/CutCopyMode. Si, si. Pourquoi passer par le presse-papier ?
Regarde ton code revu et corrigé :
Code :
Dim c As Range
Set c = Cells.Find("mots" )
If c Is Nothing Then
FonctionQuiColleZeroJeNeSaisPasOù
Else
c.Offset(0, 1).Copy Destination:=Range("J6" )
Range("G9" ).FormulaR1C1 = ""
End If
Compare ton code du début et celui-ci. Tant sur la concision que sur la facilité à relire donc à comprendre.