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

12reperetopotrouve.xlsm (258.91 Ko)

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 , eriiic

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 Pourrais tu me montrer la synthaxe à adopter si on veut la valeur exacte stp ?

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

Rechercher des sujets similaires à "error repete pas"