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 Sub

Si 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 Sub

Vous 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 Sub

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

Rechercher des sujets similaires à "suppression lignes lieu gestion erreur"