Clashme
Messages postés29Date d'inscriptionvendredi 6 juin 2008StatutMembreDernière intervention17 juillet 2008
-
9 juin 2008 à 14:30
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 2011
-
12 juin 2008 à 07:08
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)'
Clashme
Messages postés29Date d'inscriptionvendredi 6 juin 2008StatutMembreDernière intervention17 juillet 2008 9 juin 2008 à 15:03
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"
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 9 juin 2008 à 15:06
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)
Clashme
Messages postés29Date d'inscriptionvendredi 6 juin 2008StatutMembreDernière intervention17 juillet 2008 9 juin 2008 à 16:59
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 9 juin 2008 à 17:04
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
Clashme
Messages postés29Date d'inscriptionvendredi 6 juin 2008StatutMembreDernière intervention17 juillet 2008 10 juin 2008 à 09:28
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
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 10 juin 2008 à 13:00
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
Clashme
Messages postés29Date d'inscriptionvendredi 6 juin 2008StatutMembreDernière intervention17 juillet 2008 10 juin 2008 à 16:16
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
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 10 juin 2008 à 16:28
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
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 ^^
Clashme
Messages postés29Date d'inscriptionvendredi 6 juin 2008StatutMembreDernière intervention17 juillet 2008 11 juin 2008 à 10:17
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
'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
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 11 juin 2008 à 10:34
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
Clashme
Messages postés29Date d'inscriptionvendredi 6 juin 2008StatutMembreDernière intervention17 juillet 2008 11 juin 2008 à 13:47
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
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 12 juin 2008 à 07:08
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