FORUM Tom's Hardware » Programmation » Autre » [macro excel] Recherche
 

[macro excel] Recherche

Il y a 272 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : [macro excel] Recherche
 
Plus d'informations

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 çà :
 

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


Message édité par Yojim le 20-11-2007 à 18:37:04

zeb
Profil : Modérateur libre
Plus d'informations

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.


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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


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


Message édité par zeb le 20-11-2007 à 10:42:26
zeb
Profil : Modérateur libre
Plus d'informations

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 :
  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 :

Code :
  1. Dim c As Range
  2. Set c = Cells.Find("mots" )
  3. If c Is Nothing Then
  4.     ' // Ah, c'est vide.
  5.     FonctionQuiColleZeroJeNeSaisPasOù
  6. Else
  7.     ' // Trouvé.
  8.     c.Offset(0, 1).Copy
  9.     Range("J6" ).Paste
  10.     Application.CutCopyMode = False
  11.     Range("G9" ).FormulaR1C1 = ""
  12. 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é :

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

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


Message édité par zeb le 20-11-2007 à 11:07:51

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

Ok, je vais essayer de faire des codes, plus lisible, en tout cas, un grand merci à toi car en suivant ta méthode, ça marche parfaitement.

zeb
Profil : Modérateur libre
Plus d'informations

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:


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...

Aller à :
Ajouter une réponse
  FORUM Tom's Hardware » Programmation » Autre » [macro excel] Recherche
 

Annonces Google
Publicité