VBA code stop lorqu'il tombe sur #N/A

Bonjour à tous

Petit (gros) problème en VBA (je ne suis pas une pro).

j'ai fait ce code :

Sub DLUO()

Dim Réf As Variant
Dim x As Variant, y As Variant, z As Variant
Dim chemin As String

Range("DLUO").MergeArea.ClearContents
Réf = Sheets("TRAME").Cells(14, 2) & Sheets("TRAME").Cells(13, 2) & Sheets("TRAME").Cells(15, 2)
For x = 5 To Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Range("A" & Rows.Count).End(xlUp).Row
    If Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, 4) & Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, 6) & Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, 7) = Réf Then
         For y = 15 To 15
        If Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, y).Value <> "" Then
                            Sheets("TRAME").Range("DLUO") = Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, y)
                                               End If
                                               Next
                                               End If
                                               Next

End Sub

Il fonctionnait très bien.

Je vous l'explique, il va me chercher des données dans une base. Lorsqu'il trouve la recherche demandée il se stoppe et me marque le résultat trouvé.

Le problème que je rencontre c'est que lorsqu'il balaye la base et trouve un "#N/A" il s'arrête et m'envoie un message d'erreur.

J'aimerais que mon code continue à balayer la base même si entre temps il a rencontré un #N/A.

Mais j'avoue que je ne sais pas comment faire ...

Merci de votre aide !

Clem

Bonjour

Ajoute un test comme ceci :

If Not WorksheetFunction.IsNA(Cellule) = True Then

dans ce cas la cellule n'a pas d'erreur et tu peux continuer

Bonjour,

Ton code est illisible avec toutes ces références, voilà déjà un code plus lisible :

Sub DLUO()

Dim Réf As String, chemin As String
Dim x As Integer, y As Integer
Dim WBQ As Worksheet, WT As Worksheet

Set WT = ThisWorkbook.Worksheets("TRAME")
Set WBQ = Workbooks("Base Mère.xlsm").Worksheets("Base Qualité")
Range("DLUO").MergeArea.ClearContents
Réf = WT.Cells(14, 2) & WT.Cells(13, 2) & WT.Cells(15, 2)
With WBQ
    For x = 5 To .Range("A" & Rows.Count).End(xlUp).Row
        If .Cells(x, 4) & .Cells(x, 6) & .Cells(x, 7) = Réf Then
             For y = 15 To 15 '<-- utilité d'une boucle ?
                    If Not WBQ.Cells(x, y) = "" Then Range("DLUO") = WBQ.Cells(x, y)
             Next y
        End If
    Next x
End With

End Sub

Maintenant, je ne vois rien qui puisse poser problème en rapport avec un "#N/A". Ce serait bien que tu donnes davantage de précision sur ce que fait et ne fait pas la macro par rapport à ce que tu souhaites, et surtout fournir un fichier représentatif dans lequel elle pourrait s'appliquer.

edit : salut Steelson !

Merci de vos réponses

Steelson j'ai essayé ton code mais ça ne fonctionne pas...

Pedro22, merci pour les conseils.

J'ai testé ton code sur mon fichier d'origine et j'ai toujours le même soucis.

J'ai fait un fichier simplifié (pour vous montrer) qui reprend exactement mon fichier d'origine.

J'ai fait exprès d'avoir un #N/A, et là le problème d'exécution n’apparaît pas.

Donc je ne comprends pas...

Surtout que sur mon fichier d'origine quand ça plante, j'utilise le pas à pas. Et par exemple s'il me dit que c'est la ligne 422, et bien je vais voir sur ma ligne 422 dans ma base, et c'est bien où il y a des #N/A.

Si je corrige le problème de #N/A le code continue et s'arrête à la prochaine ligne où il y a un #N/A

Et du coup je ne comprends pas pourquoi dans mon fichier simplifié le problème n'est pas présent...

Clem

10test-vba.xlsm (31.70 Ko)

Steelson j'ai essayé ton code mais ça ne fonctionne pas...

curieux ! surpris !

J'ai fait exprès d'avoir un #N/A, et là le problème d'exécution n’apparaît pas.

Et du coup je ne comprends pas pourquoi dans mon fichier simplifié le problème n'est pas présent...

ton #N/A n'est pas ici une erreur si tu l'as tapé à la main, c'est du texte

un test simple :

=ESTERREUR(A3)

donnera faux, donc ce n'est pas ici une erreur

Voici une différence entre un vrai et un faux #N/A

6na.xlsx (13.44 Ko)

Ce que tu m'as proposé il faut le mettre au début du code ?

non, non c'est un vrai NA qu'il y a dans le fichier joint, j'ai supprimé une réf dans la base mère du coup dans la base qualité un NA est apparu

A tester :

Sub DLUO()

Dim Réf As String
Dim x As Integer, y As Integer
Dim WBQ As Worksheet, WT As Worksheet

Set WT = ThisWorkbook.Worksheets("TRAME")
Set WBQ = Workbooks("Base Mère.xlsm").Worksheets("Base Qualité")

Range("DLUO").MergeArea.ClearContents
y = 15
Réf = WT.Cells(14, 2) & WT.Cells(13, 2) & WT.Cells(15, 2)
With WBQ
    For x = 5 To .Range("A" & Rows.Count).End(xlUp).Row
        If Not IsError(.Cells(x, 4)) Then
            If .Cells(x, 4) & .Cells(x, 6) & .Cells(x, 7) = Réf And Not WBQ.Cells(x, y) = "" Then Range("DLUO") = WBQ.Cells(x, y)
        End If
    Next x
End With

End Sub

Sinon, rajoute en début de macro :

On Error Resume Next

Cette instruction permet à VBA d'ignorer les erreurs (de tout type !) et continuer l'exécution.

Je vais tester ça, je vous tiens au courant !

Je connaissais on error resume next mais je préférais ne pas l'utiliser

Merci

Clem

Re bonjour,

Alors j'ai testé le code

sans le "on error resume Next" ça ne focntionne pas

Et avec ça me mets les donnée de la première ligne de ma base, donc pas les bonnes données...

Clem

Re,

Alors j'ai fait ce code et il fonctionne nickel :

Sub DLUO()

On Error Resume Next

Dim Réf As String
Dim x As Integer, y As Integer
Dim WB As Worksheet, WD As Worksheet

Set WD = ThisWorkbook.Worksheets("DEMARRAGE")
Set WB = ThisWorkbook.Worksheets("BASE")

Cells(23, 2).ClearContents
Réf = WD.Cells(7, 2) & WD.Cells(8, 2) & WD.Cells(9, 2)

With WB
    For x = 5 To .Range("A" & Rows.Count).End(xlUp).Row
    Err.Clear
        If .Cells(x, 6) & .Cells(x, 4) & .Cells(x, 7) = Réf Then
        If Err.Number = 0 Then
        y = 15
        WD.Cells(23, 2) = WB.Cells(x, y)
        End If
        End If
    Next
End With
End Sub

Voilà,

Merci à vous

2 petites remarques :

  • Inutile d'affecter y=15 à chaque tour de boucle, autant le sortir du For...Next
  • Inutile de préciser WB.Cells(... dans ta structure With WB...End With, il suffit de mettre .Cells(...

PS :

Rechercher des sujets similaires à "vba code stop lorqu tombe"