Se connecter avec
S'enregistrer | Connectez-vous

[macro excel] Recherche

Dernière réponse : dans Programmation

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.

Donc, sa me donne çà :

  1. Sub Macro3()
  2. '
  3. ' Macro3 Macro
  4. ' Macro enregistrée le 17/11/2007 par CLEMENT
  5. '
  6.  
  7. '
  8. Cells.Find(What:="mots", After:=ActiveCell, LookIn:= _
  9. xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
  10. xlNext, MatchCase:=False, SearchFormat:=False).Activate
  11. ActiveCell.Offset(0, 1).Select
  12. Selection.Copy
  13. Range("J6").Select
  14. ActiveSheet.Paste
  15. Range("G9").Select
  16. Application.CutCopyMode = False
  17. ActiveCell.FormulaR1C1 = ""
  18. Range("G11").Select
  19. End Sub


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.

Autres pages sur : macro excel recherche

Lassé par la pub ? Créez un compte
Expert Programmation

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.

  1. Sub Macro3()
  2. '
  3. ' Macro3 Macro
  4. ' Macro enregistrée le 17/11/2007 par CLEMENT
  5. '
  6.  
  7. '
  8. Cells.Find(What:="mots", After:=ActiveCell, LookIn:= _
  9. xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
  10. xlNext, MatchCase:=False, SearchFormat:=False).Offset(0, 1).Copy
  11. Range("J6").Select
  12. ActiveSheet.Paste
  13. Range("G9").FormulaR1C1 = ""
  14. Application.CutCopyMode = False
  15. End Sub



Bonsoir, et merci de m'avoir répondu, c'est mieux comme çà ?
Expert Programmation

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 :
  1. Sub Test()
  2. Dim c1 As Range, c2 As Range
  3. Stop
  4. Set c1 = Cells.Find("Mots")
  5. Set c2 = Cells.Find("aqwzsxedcrfvtgbyhnujikolpm")
  6. Stop
  7. 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 :
  1. Dim c As Range
  2. Set c = Cells.Find("mots")
  3.  
  4. If c Is Nothing Then
  5. ' // Ah, c'est vide.
  6. FonctionQuiColleZeroJeNeSaisPasOù
  7. Else
  8. ' // Trouvé.
  9. c.Offset(0, 1).Copy
  10. Range("J6" ).Paste
  11. Application.CutCopyMode = False
  12. Range("G9" ).FormulaR1C1 = ""
  13. 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 :sol: 
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. :fou: 
Pourquoi passer par le presse-papier ?

Regarde ton code revu et corrigé :
  1. Dim c As Range
  2. Set c = Cells.Find("mots")
  3.  
  4. If c Is Nothing Then
  5. FonctionQuiColleZeroJeNeSaisPasOù
  6. Else
  7. c.Offset(0, 1).Copy Destination:=Range("J6" )
  8. Range("G9").FormulaR1C1 = ""
  9. End If


Compare ton code du début et celui-ci. Tant sur la concision que sur la facilité à relire donc à comprendre.
Expert Programmation

Bien sûr :sol:  23 ans que je programme, ce serait dommage que ça ne marche pas.

Merci de parler de méthode, car je ne cherche pas à donner MA solution mais à permettre à chacun de trouver la sienne par soi-même. :jap: 
Lassé par la pub ? Créez un compte