Gestion d'erreur

Salut,

J'ai une procédure qui balaye un tableau pour reporter des valeurs dans un UserForm et qui va ensuite rechercher ces valeurs dans un autre tableau pour afficher un paramètre lié.

Le code :

Public Sub Initialisation_ListeEffectivitéPNS()

'Liste des PNs effectifs
ListeEffectivitéPNs.Clear
With Tables_matériels.Sheets("PNsPNs")
    On Error GoTo Fin
    RangeUp = WorksheetFunction.Match(Clé_PN, .Columns(vbColonne_PNsPNs_PN), 0)
    RangeDown = RangeUp + WorksheetFunction.CountIf(.Columns(vbColonne_PNsPNs_PN), Clé_PN) - 1
    For Ligne = RangeUp To RangeDown
        'Gestion des doublons
        If .Cells(Ligne, vbColonne_PNsPNs_Actif) = True And .Cells(Ligne, vbColonne_PNsPNs_Clé) <> .Cells(Ligne - 1, vbColonne_PNsPNs_Clé) Then
            CléPNSupport = .Cells(Ligne, vbColonne_PNsPNs_PNSupport)
            'Report des PNs
            ListeEffectivitéPNs.AddItem WorksheetFunction.VLookup(CléPNSupport, Plage_PNs, vbColonne_PNs_PN, False)
            ListeEffectivitéPNs.List(ListeEffectivitéPNs.ListCount - 1, 1) = Chr(124) & " " & WorksheetFunction.VLookup(CléPNSupport, Plage_PNs, vbColonne_PNs_PN, False)
            ListeEffectivitéPNs.List(ListeEffectivitéPNs.ListCount - 1, 2) = Chr(124)
            ListeEffectivitéPNs.List(ListeEffectivitéPNs.ListCount - 1, 3) = .Cells(Ligne, vbColonne_PNsPNs_PNSupport).Value
            ListeEffectivitéPNs.List(ListeEffectivitéPNs.ListCount - 1, 4) = .Cells(Ligne, vbColonne_PNsPNs_Clé).Value

            'Recherche des interchangeabilités définies sur le PN
            With Tables_matériels.Sheets("InterPNs")
                On Error GoTo Suite
                RangeUpInter = WorksheetFunction.Match(Clé_PN, .Columns(vbColonne_InterPNs_PN), 0)
                RangeDownInter = RangeUpInter + WorksheetFunction.CountIf(.Columns(vbColonne_InterPNs_PN), Clé_PN) - 1
                For LigneInter = RangeUpInter To RangeDownInter
                    If .Cells(LigneInter, vbColonne_InterPNs_Clé) <> .Cells(LigneInter - 1, vbColonne_InterPNs_Clé) _
                    And .Cells(LigneInter, vbColonne_InterPNs_PNSupport) = CléPNSupport _
                    And .Cells(LigneInter, vbColonne_InterPNs_Actif) = True Then
                        Usf0380_PNs.ListeEffectivitéPNs.List(Usf0380_PNs.ListeEffectivitéPNs.ListCount - 1, 2) = Chr(124) & " X"
                        Exit For
                    End If
                Next LigneInter
Suite:
            End With
        End If
    Next Ligne
End With

Call Tri_Listes(Me.ListeEffectivitéPNs)

Fin:

Call Activation_contrôles

End Sub

Dans l'idée je voudrais que si la première boucle dans

Tables_matériels.Sheets("PNsPNs")

est en erreur (la fonction Match ne trouve pas la valeur cherchée,) je saute la procédure pour aller à la fin. Et si la valeur est trouvée mais que la deuxième boucle dans

Tables_matériels.Sheets("InterPNs"

est en erreur (même critère d'erreur) je ne saute que la boucle en question.

Mon problème est que le

On Error GoTo Suite

semble ne pas fonctionner. Si le Match est en erreur la macro plante au lieu d'aller au Suite :

J'ai essayé d'annuler le On Error Goto Fin par un On Error Goto 0 après le premier Match dans l'espoir que ça permette au On Error Goto Suite d'être validé mais ça n'a rien changé. Je bloque là dessus depuis 2 jours.

Pourquoi est ce que le deuxième Goto ne fonctionne pas ?

Merci d'avance.

Manu

Bonjour,

Je pense que votre fermeture des indentations n'est pas correcte. Je n'ai pas vu, de mémoire, de fermeture de boucle au sein d'une procédure alternative, après je dis peut être de bêtises, mais à tester tout de même :

Public Sub Initialisation_ListeEffectivitéPNS()

'Liste des PNs effectifs
ListeEffectivitéPNs.Clear
With Tables_matériels.Sheets("PNsPNs")
    On Error GoTo Fin
    RangeUp = WorksheetFunction.Match(Clé_PN, .Columns(vbColonne_PNsPNs_PN), 0)
    RangeDown = RangeUp + WorksheetFunction.CountIf(.Columns(vbColonne_PNsPNs_PN), Clé_PN) - 1
    For Ligne = RangeUp To RangeDown
        'Gestion des doublons
        If .Cells(Ligne, vbColonne_PNsPNs_Actif) = True And .Cells(Ligne, vbColonne_PNsPNs_Clé) <> .Cells(Ligne - 1, vbColonne_PNsPNs_Clé) Then
            CléPNSupport = .Cells(Ligne, vbColonne_PNsPNs_PNSupport)
            'Report des PNs
            ListeEffectivitéPNs.AddItem WorksheetFunction.VLookup(CléPNSupport, Plage_PNs, vbColonne_PNs_PN, False)
            ListeEffectivitéPNs.List(ListeEffectivitéPNs.ListCount - 1, 1) = Chr(124) & " " & WorksheetFunction.VLookup(CléPNSupport, Plage_PNs, vbColonne_PNs_PN, False)
            ListeEffectivitéPNs.List(ListeEffectivitéPNs.ListCount - 1, 2) = Chr(124)
            ListeEffectivitéPNs.List(ListeEffectivitéPNs.ListCount - 1, 3) = .Cells(Ligne, vbColonne_PNsPNs_PNSupport).Value
            ListeEffectivitéPNs.List(ListeEffectivitéPNs.ListCount - 1, 4) = .Cells(Ligne, vbColonne_PNsPNs_Clé).Value

            'Recherche des interchangeabilités définies sur le PN
            With Tables_matériels.Sheets("InterPNs")
                On Error GoTo Suite
                RangeUpInter = WorksheetFunction.Match(Clé_PN, .Columns(vbColonne_InterPNs_PN), 0)
                RangeDownInter = RangeUpInter + WorksheetFunction.CountIf(.Columns(vbColonne_InterPNs_PN), Clé_PN) - 1
                For LigneInter = RangeUpInter To RangeDownInter
                    If .Cells(LigneInter, vbColonne_InterPNs_Clé) <> .Cells(LigneInter - 1, vbColonne_InterPNs_Clé) _
                    And .Cells(LigneInter, vbColonne_InterPNs_PNSupport) = CléPNSupport _
                    And .Cells(LigneInter, vbColonne_InterPNs_Actif) = True Then
                        Usf0380_PNs.ListeEffectivitéPNs.List(Usf0380_PNs.ListeEffectivitéPNs.ListCount - 1, 2) = Chr(124) & " X"
                        Exit For
                    End If
                Next LigneInter
            End With
        End If
    Next Ligne
End With

Suite:
Next Ligne
Call Tri_Listes(Me.ListeEffectivitéPNs)

Fin:
Call Activation_contrôles
End Sub

Ou sinon vous testez que RangeUpInter n'est pas rien via :

If Not RangeUpInter Is Nothing Then
    'Mes exécutions
End If

Ce ne sont que des pistes il y en a d'autres telle que On Error Resume Next, On Error GoTo Line, etc ....

Cdlt,

Bonjour,

Founir le fichier svp

A+

Suite à la réponse de Ergotamine j'ai déplacé le Fin: avant le dernier End with et j'ai pris l'option de tester la valeur de RangeUpInter en mettant un On Error Resume Next devant. Ca fonctionne.

En essayant de conserver le On Error Goto Suite la boucle fonctionne pour les 2 premières valeurs et plante ensuite... Vu que l'autre solution fonctionne je laisse tomber cette option.

Merci pour le coup de main.

Pour Galopin : je ne peux pas fournir le fichier, c'est un système complet qui comprend 6 fichiers imbriqués et qui font appel à plus de 4 Go de données. Ca limite mes possibilités de partage.

Manu

Rechercher des sujets similaires à "gestion erreur"