Cells FInd erreur

Signaler
Messages postés
29
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2008
-
mortalino
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
-
Bonjour,

tout le monde !!! c'est encore moi !! :)))

voilà j'ai fait une petite macro pour excel dans un fichier "light"

et ensuite la réintroduire dans le fichier de base ( plus lourd )

voilà mon petit probleme : dans mon code j'ai une petite fonction quie me permet de chercher une valeur par rapport à

à une zone de références ZR ( ZR qui est en commun dans mes 2 feuilles excel )

mais il peut arrivé dans certaine circonstances que mon ZR soit "vide"

ou que la valeur rechercher ne soit pas trouvé

dans ce cas là ma macro plante

je voudrais trouvé un moyen sous system de controle d'éviter ces erreurs

pouvez vous m'aider !!

merciiiiiii

voici mon code

ZR = Worksheets("Charges techniciens").Cells(I, 11).Value
        ZR = Left(zr3, 2) ' permet de récupérer les 2 premiers caractére d'une cellule 

'recherche designation Tache
       Windows("Données .xls").Activate
       Worksheets("Feuill1").Activate
       Cells.Find(what:=ZR, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Activate
       designtache = ActiveCell.Offset(0, 1).Value
       Windows("Suivil.xls").Activate
       Worksheets("Feuill1").Cells(I, 22).Value = designtache


j'ai ensuite essayé de réglé mon probleme avec un found en booléen

Found = Cells.Find(what:=zr2, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Activate
        Do While Found = False
        GoTo Suivant 'Saute ma recherche avec ZR2
Loop

cela fonctionne quand mon find est TRUE
et lorque mon code est false j'ai une erreur 91

donc j'ai fini par trouvé ce fameu On Error GoTo

On Error GoTo continue

*

*code 

*

continue:

If Err.Number = 91 Then

  GoTo Saute

End If 


mais celle ci me fait une erreur '-2147352565(800200b)'

je ne s'ais plus quoi faire

j'attend avec impatience votre aide
merci

16 réponses

Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
salut,

dim rResult as range

Set rResult = Cells.Find(ZR, ActiveCell)

If Not rResult is nothing then
designtache = rResult.Offset(0, 1).Value
WorkBooks("Suivil.xls").Worksheets("Feuill1").Cells(I, 22).Value = designtache

end if

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
29
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2008

en effet sa marche!

pourtant j'avais aussi essayé cette technique
avec le range
mon erreur devais venir de mon
designtache = rResult.ActiveCell.Offset(0, 1).Value en trop

j'étais si proche du but ^^

hmm une petite question a propos du cells.find que tu as changé
ma formule cells.find qui étais un peu plus longue que la tienne
cella ne change rien ?
par exemple niveau rapidité vu que ma macro est assez longue jai remarqué que les cells.find etait "gourmand"
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
Ca ne change rien, si tu n'indiques pas les paramètres comme je l'ai fait, VB prends ceux par défaut.
Ce n'est qu'une question de lisibilité.

Concernant la fonction Find, elle peut-être longue suivant le nombre de données recherchées (et suivant le nombres de valeurs dans ta feuille Excel) mais c'est la méthode la plus rapide (plus rapide que d'imbriquer des If et for to Next)

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
29
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2008

merci mortalino
juste un petit probleme dans mon exemple ci dessus mon ZR permet de récupéré les premier caractére le plus souvent les "initiales" de l'utilisateur pour ensuite grace a la fonction cellsfind récupéré le nom entier de l'utisateur et la placer dans une autre cellule.

si mon ZR récupére correctement les valeurs tout va bien
si mon ZR est vide le lui impose la valeur ND ( non défini )
mais si l'utilisateur ne rentre pas correctement ses initiales suivit de sont commentaire par exemple " en construction" au lieu de "RN - en construction"
ma fonctions cells find va prendre le "en" de "en construction"
ma recherche va étre donc érroné et arrété ma macro

alors si quelqu'un à un solution pour contourné le probleme
je suis là :)

encore merci
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
oui, il y a une solution : apprends aux utilisateurs à bien saisir
Peut-être stocker dans une feuille les initiales potentielles; et tu fais une vérification avant de lancer la fonction Find

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
29
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2008

oui en effet donc mon idée de début avec mon found en bouléen pourrais étre utile...si elle fonctionne bien sur
jai bien une feuille avec dans ma colonne A les initiail et la colonne B les nom en entier
Found = Cells.Find(what:=zr2, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Activate
Do While Found = False
GoTo Suivant 'Saute ma recherche avec ZR2
Loop
Messages postés
29
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2008

petit UP dsl xD
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
Salut Mortalino,
C'est rare..., mais je te reprendrai concernant la fonction Find...

En fait, Find n'a pas vraiment de propriété par défaut. Il est toujours préférable de spécifier les paramètres importants.

Je m'explique
Voici un petit bout de code qui recherche le mot "allo" (qui est présent) dans la colonne A

    Dim Recherche As Range, Valeur As String
   
    Valeur = "allo"
   
    Set Recherche = Columns("A").Find(Valeur)
    If Not Recherche Is Nothing Then
        MsgBox "Trouvé en: " & Recherche.Address
    Else
        MsgBox "Non trouvé"
    End If

En principe, si le mot allo est bien là, la fonction retourne l'adresse.
Maintenant, on essaie en enlevant le "o" de allo .... Valeur = "all"
On roule à nouveau la macro
Si l'adresse est trouvée, on va dans Excel et on utilise Ctrl-F en cochant la case "Cellule entière". Comme le mot n'est pas trouvé, on ferme la fenêtre et on retourne dans le code de la macro.
Ce paramètre Cellule entière est conservé en mémoire...et la cellule n'est pas trouvée lorsqu'on roule à nouveau la macro...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
29
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2008

Rebonjour :)
merci pour votre aide !Mpi je n'est pas besoin de messge box ou autre
enfaite je vous explique mon probleme

dans mon code jai 5 finds a faire pour trouver des valeurs qui sont lié par un numéro ( d'ou mon ZR qui est ma références )
puis ensuite je jou avec les offsets.

le code que ma gentillement proposé mortalino permet de faire un controle sur la cellule trouvé
si mon rresult est vide je fait rien sinon instruction..

mais je ne trouve pas le moyen de faire un controle sur mon fameu ZR
mon traitement se réalise sur 2000 lignes à peu prés et il peut arriver que ma valeur ZR ne soit pas trouvé et plante
ce qui est embétant lorqu il reste plus de 1000 ligne à traité!
 pouvais m'eclairé
je vous remet mon code
donc j'essaye toujours de manupulé pas recherche par un false  /true enfin si vous avez une autre technique pas de probleme :)
'recherche
Dim coordinateur As String
Dim rResult As Range
Dim Found As Boolean

      
ZR = Worksheets("Resultat").Cells(I, 11).Value

'recherche designation Tache
Windows("Données .xls").Activate
Worksheets("Feuill1").Activate
Found = Cells.Find(zr3, ActiveCell)
Set rResult = Cells.Find(zr3, ActiveCell)
Do While Found = False
GoTo Continue 'Saute ma recherche avec ZR2
Loop
If Not rResult Is Nothing Then

      coordinateur = rResult.Offset(0, 1).Value
       Windows("Suivi_des_Ofs.xls").Activate
       Worksheets("Resultat").Cells(I, 25).Value = coordinateur
       End If
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
Ben, il faut utiliser la méthode que t'a suggéré Mortalino.
If Not rresult Is Nothing Then

Donc, si rresult n'est pas rien, c'est qu'il est quelque chose... donc trouvé, donc Vrai
Autrement, pas trouvé, donc faux

Nul besoin ici d'utiliser un Boolean, à moins que ce ne soit nécessaire dans ton cas pour autre chose. Dans ce cas, insère ta variable dans la condition

Code de Mortalino:
dim rResult as range

Set rResult = Cells.Find(ZR, ActiveCell)

If Not rResult is nothing then
Trouve = True

designtache = rResult.Offset(0, 1).Value
WorkBooks("Suivil.xls").Worksheets("Feuill1").Cells(I, 22).Value = designtache
Else
Trouve = False

end if

Et si tu dois continuer la recherche pour trouver d'autres occurences, regarde du côté de FindNext

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
29
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2008

non j'étais à coté de la plaque avec mon booléen
j'ai bien compri l'instruction nothing maintenant

enfaite j'ai remarqué, que pour chaque cas ou mon rResult est nothing ( trouvé false ) ma macro plante à l'instruction suivante :(

erreur d'éxécution '2147352565 (800200b)'

j'ai lancé ma macro en metant ma recherche en commentaire et mon traitement sur les 2000 lignes se déroule normalement

je ne comprend pas !

i need help xD
merci Mpi
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
http://support.microsoft.com/kb/186063/fr



salut,
ton problème est un problème d'Index.

un moment, tu dis :
enfaite j'ai remarqué, que pour chaque cas ou mon rResult est nothing (
trouvé false ) ma macro plante à l'instruction suivante :(

Quelle instruction ?
Ca ne peut pas être coordinateur = rResult.Offset(0, 1).Value
car tu n'est pas censé rentré dans le If.
Mais après le End If, on a pas la suite ^^

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
29
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2008

oui je me suis renseigné sur l'erreur
je pense pas que sa soit un probléme avec mon instruction qui suit puisqu'elle fonctionne pour toutes les autres recherche lorsque mon find est true
et des que je tombe sur un find false je plante et le souligne la ligne d'aprés en débogage! et comme je les dis juste avant lorsque je rend inactif mon find ( en commentaire )
mes 2000 lignes sont traité intégralement

mon code :

'recherche designation Tache , designation projet et numéro de tache

Windows("Données.xls").Activate
Worksheets("Feuil1").Activate
Set rResult = Cells.Find(zr2, ActiveCell)
If Not rResult Is Nothing Then

designtache = rResult.Offset(0, 1).Value
designprojet = rResult.Offset(0, 3).Value
projet = rResult.Offset(0, 2).Value

'place les resultats

Windows("Resultat.xls").Activate

Worksheets("Feuil1").Cells(I, 22).Value = designtache
Worksheets("Feuil1").Cells(I, 23).Value = designprojet
Worksheets("Feuil1").Cells(I, 24).Value = projet

End If

'date début date fin en statut non lancés
Controle1 = Worksheets("Feuil1").Cells(I, 13).Value
Controle2 = Worksheets("Feuil1").Cells(I, 14).Value
If Not IsDate(Controle1) And Controle1 <> "" Then GoTo Suivant
If Not IsDate(Controle2) And Controle2 <> "" Then GoTo Suivant

mon rresult est bien en range les autre varaibles sont en variant


encore une fois merci
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
Ps : ne jamais sauf cas extreme travailler avec des Variant.
Type tes variables, et place en toute premiere ligne de code :
Option Explicit.

Ca sert justement a trouver plus facilement l'erreur, que de tourner autour sans pour autant la voir !

je pense avoir trouver ton problème.
Si rResult vaut une cellule, ça rentre dans la condition, et a un moment, tu changes de classeur (Resultat.xls)
Alors que SI on ne rentre pas dans la condition, tu codes un

    Controle1 = Worksheets("Feuil1").Cells(I, 13).Value

Mais sur le classeur précédement choisi, et a tous les coups, Feuil1 n'y est pas.

Bref, replace un   Windows("Resultat.xls").Activate
après le End If

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
29
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2008

bah grand merci a toi mr.mortalino
parcontre j'ai pas compris ou mettre mon option explicit
je déclare tout mes dim en debut d'algo
ensuite j'ouvre un un fichier xls
jai un compteur, un selection clear blablalbla puis des mise en variable..enfin bref


parcontre j'ai un tout petit probleme

j'utilise la fonction
TotalJour = DateDiff("d", DateDebut, DateFin)

j'ai un calendrier devant moi j'ai fait plusieur test
Et j'ai l'impression qu'il me manque un jour a chaque fois
éyant déjà utilisé la formule avant
je me souviens pas de se genre de probleme !
c'est normal ou suis je obligé de rajouté un Nbjour + 1


encore merci pour ton aide
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
le Option Explicit se mets au dessus de tous codes, en ligne n°1

Pour ton histoire de DateDiff, si DateDébut et DateFin sont le même jour (genre le 12/06/2008), ça ne comptabilise pas de jour puisque c'est le même. Suivant tes besoins, il faudra donc faire un + 1

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA