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 SubDans 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 Suitesemble 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 SubOu sinon vous testez que RangeUpInter n'est pas rien via :
If Not RangeUpInter Is Nothing Then
'Mes exécutions
End IfCe 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