On Error ne ce répète pas
Bonjour,
Je suis entrain de développer une petite macro qui me permettrai de chercher une référence par rapport à un repère topologique.
Ma base de données (que je copie à partir d'une autre fichier) est en feuille 2 : "Comparer BOM"
Lorsque que je colle la plage de donnés j'appuie sur le bouton "Mettre en forme" qui me permet de virer les lignes où la colonne B contient "P" pour éviter les erreur lorsque je vais venir chercher des repères topo.
Ensuite je retourne dans la première feuille je renseigne les repères topo en colonne A et je clique sur le bouton Start.
Lorsque je ne me trompe pas dans les repère topo la macro me renvoie en colonne B la référence.
Si je me trompe la macro doit me renvoyer "Non trouvé" (qui devient rouge avec une Mise en forme conditionnelle).
Toute la macro fonctionne à un petit détail :
Lorsque je me trompe deux fois de suite dans mes repère topo la macro me renvoie bien Non trouvé pour le premier repère mais pour le second la macro me renvoie une erreur ...
Ma question est donc la suivante :
Pourquoi ai-je une erreur seulement sur le deuxième et pas sur le premier aussi ?
Je vous met le fichier en joint.
Merci d'avance
Bonjour Fazzbetter,
Un essai dans le fichier joint.
Sub RepTopoToRef()
Dim i As Integer, PosRech, Ref, Val As String
Application.ScreenUpdating = False
For i = 2 To 100
Val = Range("A" & i).Value
If Val <> "" Then
PosRech = "" 'remise à "blanc" de PosRech
On Error Resume Next ' si pas trouvé, on continue l'exécution
PosRech = Sheets("Comparer BOM").Range("C:C").Find(Val, , xlValues).Address
On Error GoTo 0 'ré-interception des erreurs
If PosRech = "" Then
' si pas trouvé, PosRech est à "blanc"
Sheets("Repère topo").Cells(i, 2).Value = "Non trouvé"
Else
' si trouvé
Ref = Sheets("Comparer BOM").Range(PosRech).Offset(0, -2).Value
Sheets("Repère topo").Cells(i, 2).Value = Ref
End If
End If
Next i
End Sub
Edit : Bonjour ThauThème
Bonjour Fazzbetter, bonjour le forum,
Essaie comme ça :
Sub RepTopoToRef()
Dim i As Integer
Dim PosRech As String, Ref as String, Val As String
For i = 2 To 100
Val = Range("A" & i).Value
On Error Resume Next
PosRech = Sheets("Comparer BOM").Range("C1:C9999").Find(Val, , xlValues).Address
Ref = Sheets("Comparer BOM").Range(PosRech).Offset(0, -2).Value
If Err <> 0 Then Err.Clear: GoTo 50
Sheets("Repère topo").Cells(i, 2).Value = Ref
GoTo 100
50 Sheets("Repère topo").Cells(i, 2).Value = "Non trouvé"
100
Next i
End Sub
Tu as remarqué que j'ai corrigé la déclaration des variables ? Tu peux écrire plusieurs variable sur la même ligne mais tu dois spécifier le type pour chacune d'entre elles sinon elle prendra le type Variant par défaut (plus gourmand en mémoire).
[Édition]
Bonjour Mapoire nos posts se sont croisés...
Bonjour,
ou bien plus classique :
Sub RepTopoToRef()
Dim i As Long
Dim c As Range
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
Set c = Sheets("Comparer BOM").Range("C1:C9999").Find(Range("A" & i).Value, , xlValues)
If c Is Nothing Then
Sheets("Repère topo").Cells(i, 2).Value = "Non trouvé"
Else
Sheets("Repère topo").Cells(i, 2).Value = c.Offset(, -2)
End If
Next
End Sub
Avec range.find on travaille plus souvent avec l'objet Range
Je ne sais pas si tu l'as fait exprès mais tu n'as pas mis paramètre xlWhole, donc il va rechercher une partie de la chaine et non le repère complet. Risque de trouver qq chose à tort...
eric
Bonjour à vous,
Ma poire :
Ton fichier est très bien je te remercie de ton travail
Petit soucis, lorsque je fait une autre recherche la colonne B de la première feuille ne se vide pas, mais c'est un soucis minime puisqu'il suffit de mettre un clear (ou quelque chose comme ça) en début de macro.
ThauThème :
Ta solution fonctionne parfaitement merci
Lorsque l'on déclare toutes ses variables "String" ensemble toute la ligne ne devient pas String ou il faut spécifier à chaque variable ?
Eriiic :
Ta solution fonctionne parfaitement aussi merci
Ce n'était pas voulus de supprimé xlWhole
Encore merci pour votre travail et votre rapidité
Re,
@ Eric
Pfff ! Classique peut-être, mais tellement évident !...
Je navet (si, si, dans ce cas on peut...) même pas vu qu'il y avait une fonction Find, obnubilé par la gestion des erreurs ayant maintes fois galéré sur des cas similaires...
@Fazzbetter
Oui comme je te l'ai expliqué dans mon post précédent il faut chaque fois spécifier le type...
@Thautheme C'est l'avantage quand on arrive après tout le monde. On regarde plus dans la globalité pour voir s'il y a autre chose à apporter
Fazzbetter, l'aide excel sur range.find est complète tu sais
Range.Find, méthode
Cette méthode recherche des informations spécifiques dans une plage.
Syntaxe
expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
expression Variable qui représente un objet Range.
Paramètres
Nom Obligatoire/Facultatif Type de données Description
What Obligatoire Variante Données à rechercher. Il peut s'agir d'une chaîne ou de tout autre type de données Microsoft Excel.
After Facultatif Variante Cellule après laquelle vous souhaitez commencer la recherche.
LookIn Facultatif Variante Type d'informations.
LookAt Facultatif Variante Il peut s'agir de l'une des constantes XlLookAt suivantes : xlWhole ou xlPart.
.Find(Range("A" & i).Value, , xlValues, xlWhole)
Re,
Merci pour ces précisions