Suppression de 2 lignes au lieu d'une après gestion d'une erreur
Bonjour !
J'ai une macro me permettant de parcourir les cellules de la colonne A de mon excel, qui contient le chemin d'accès à plusieurs fichier, afin de vérifier qu'un fichier .xls peut être ouvert pour y extraire des données par la suite (j'ai créé cette macro justement car certain fichier ne pouvait pas être ouvert avec Workbooks.Open, sans que je sache pourquoi).
Le but final est de pouvoir supprimer la ligne contenant le chemin du fichier si ce dernier ne peut pas être ouvert, puis de reprendre l'analyse des fichiers ou elle en était (et non re-tester tout les fichiers après la suppression d'une ligne).
Mon problème est le suivant : un des fichiers ne peut pas être ouvert, et lorsque la macro arrive sur la ligne contenant le chemin du fichier en question, elle supprime non seulement cette ligne mais aussi la suivante ! Je me retrouve donc avec 2 fichiers en moins et pas qu'un seul.
Autre erreur, une fois arriver à la dernière ligne, le code me lève la même erreur, alors qu'il ne devrait pas y en avoir (l'extraction de données a été tester et réussi sur ce fichier), mais ne me supprime pas la ligne. Je n'ai donc pas de "problème" car la ligne est toujours présente, mais le fait d'avoir une erreur sans comprendre me dérange.
Voici mon code :
Sub find_error_open_file()
Dim i As Integer
Dim cell As Range
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
i = 2
debut:
For Each cel In Range("A2", Range("A2").End(xlDown))
If Not IsEmpty(cel) Then
'Ouverture de chaque fichier
file_path = cel.Value
Workbooks.Open file_path
On Error GoTo erreur
file_name = Right(file_path, Len(file_path) - InStrRev(file_path, "\"))
Workbooks(file_name).Close
i = i + 1
End If
Next cel
erreur:
MsgBox "Fichier " & file_path & " : ouverture impossible ! Ligne : " & i
Rows(i).EntireRow.Delete
Resume Next
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End SubSi quelqu'un a une solution à une de mes 2 questions, je suis preneur !
Merci d'avance pour votre aide.
Bonjour,
A votre avis, que se passe-t-il quand le programme quitte la boucle FOR NEXT ?
Et bien, il va traiter une erreur, puisque c'est la suite du programme, alors qu'il devrait le quitter à ce moment là.. il vous manque donc un "Exit sub" juste avant la gestion d'erreur.
Il faut aussi réinitialiser la gestion d'erreur si on veut que les erreurs suivantes soient détectées, puis revenir dans le code pour continuer à traiter les lignes suivantes.
Sub find_error_open_file()
Dim i As Integer
Dim cell As Range
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
i = 2
debut:
For Each cel In Range("A2", Range("A2").End(xlDown))
If Not IsEmpty(cel) Then
'Ouverture de chaque fichier
file_path = cel.Value
Workbooks.Open file_path
On Error GoTo erreur
file_name = Right(file_path, Len(file_path) - InStrRev(file_path, "\"))
Workbooks(file_name).Close
i = i + 1
End If
Suivant:
Next cel
Application.EnableEvents = True
Exit Sub '<-------------------------- sortie du programme
erreur:
MsgBox "Fichier " & file_path & " : ouverture impossible ! Ligne : " & i
Rows(i).EntireRow.Delete
on error goto 0 'on réinitialise la gestion d'erreur
Goto Suivant 'On passe à la ligne suivante à traiter
End SubVous pouvez l'écrire aussi de cette façon:
Sub find_error_open_file()
Dim i As Integer
Dim cell As Range
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
i = 2
For Each cel In Range("A2", Range("A2").End(xlDown))
If Not IsEmpty(cel) Then
On Error Resume Next
'Ouverture de chaque fichier
file_path = cel.Value
Workbooks.Open file_path
If Err.Number = 0 Then
file_name = Right(file_path, Len(file_path) - InStrRev(file_path, "\"))
Workbooks(file_name).Close
Else
MsgBox "Fichier " & file_path & " : ouverture impossible ! Ligne : " & i
Rows(i).EntireRow.Delete
End If
On Error GoTo 0
i = i + 1
End If
Next cel
Application.EnableEvents = True
End SubAttention, en l'absence de fichier, je ai pas testé, donc il est possible qu'il y ait des erreurs, mais le principe est là.
Cdlt
Merci pour votre réponse.
Le programme fonctionne parfaitement, merci beaucoup pour votre aide !
Cdlt