Problème lié à la gestion de potentielles erreurs
Bonjour a tous !
Je travaille sur la récupération de plusieurs fichier excel se trouvant dans un répertoire dans le but d'extraire plusieurs données dans chacun de ces fichiers.
Pour des raisons de conformité de chaque fichier, j'ai créé une sub procédant à 2 vérification :
1) Si le fichier peut être ouvert (il arrive que certain fichier ne puisse pas être ouvert, pour des raisons qui m'échappe encore mais la n'est pas le problème pour le moment)
2) Si la première feuille du fichier se nomme "ReportHeader", caractéristique des fichiers sur lesquelles je souhaite récupérer mes données
Avec une macro de récupération des fichiers, je stocke le chemin de chacun des fichiers dans la colonne A d'une feuille nommé "GeneralData". Puis je lance ma macro de vérification qui va parcourir la colonne A de ma feuille "GeneralData" et vérifier les 2 conditions cités plus haut.
La macro fonctionne en faite très bien lorsqu'un dossier possède des fichiers non conforme : le chemin du fichier non conforme est stocker dans un tableau tab_error(), et lorsque qu'il n'y a plus de fichier à vérifier, ce tableau est collé sur une feuille nommé "UnusableFile" afin de garder une trace de ces fichiers.
Le problème ici visiblement est en faite lorsque le dossier ne possède pas de fichier non conforme, et que mon tableau tab_error ne possède donc pas de ligne... Une fois tout les fichiers parcouru, la macro devrait passer a l'étiquette "end_sub", mais une erreur apparait sur la ligne "next cel" me disant que ma boucle for n'est pas initialisé.. J'avoue que j'ai beaucoup de mal à comprendre cette erreur, d'autant plus que ma msgbox("Je suis ici") apparait correctement.
Je sais qu'il est possible de gérer l'erreur avec On Error Resume Next, mais cela me dérange de ne pas comprendre ce qu'il se passe derrière et pourquoi cette erreur persiste.
Je mets mon code ci-dessous :
Sub find_wrong_file()
Dim i As Integer 'index for file browsing
Dim j As Integer, k As Integer 'index for tab_error
Dim cel As Range, cel1 As Range
Dim tab_error() As Variant 'error file table
Dim nb_file As Integer
Sheets("GeneralData").Select
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'for progress bar
nb_file = 0
For Each cel1 In Range("A2", Range("A2").End(xlDown))
nb_file = nb_file + 1
Next cel1
i = 1
j = 1
k = 0
debut:
ProgressBar.afficher
For Each cel In Range("A2", Range("A2").End(xlDown))
i = i + 1 'file path begin at cell A2 => line 2
file_path = cel.Value
Workbooks.Open file_path
On Error GoTo erreur 'if can't open file go to erreur
Worksheets(1).Activate
If ActiveSheet.Name <> "ReportHeader" Then 'if no report header
file_name = Right(file_path, Len(file_path) - InStrRev(file_path, "\")) 'get the file name only
Workbooks(file_name).Close 'close file
ReDim Preserve tab_error(j) 'redim table while keeping data stored in it
tab_error(k) = Range("A" & i).Value 'get the file path of the unusable file
Rows(i).EntireRow.Delete 'delete the row from the Consolidation_V3 workbook
j = j + 1 'index for tab_error dim
k = k + 1 'index for tab_error row (j-1)
Else 'file can be used
file_name = Right(file_path, Len(file_path) - InStrRev(file_path, "\"))
Workbooks(file_name).Close
End If
ProgressBar.actualiser CInt((i / nb_file) * 100)
Suivant:
Next cel
MsgBox ("Je suis ici")
GoTo end_sub 'when finish file browsing
end_sub:
If Not IsEmpty(tab_error) Then
Worksheets("UnusableFile").Range("A1:A" & k) = Application.Transpose(tab_error()) 'k value is the size of the table
End If
Application.EnableEvents = True
Exit Sub '<-------------------------- exit program
erreur:
ReDim Preserve tab_error(j) 'redim table while keeping data stored in it
tab_error(k) = Range("A" & i).Value 'get the file path of the unusable file
Rows(i).EntireRow.Delete 'delete the row from the Consolidation_V3 workbook
j = j + 1 'index for tab_error dim
k = k + 1 'index for tab_error row (j-1)
On Error GoTo 0 'reset the error management
GoTo Suivant 'go back to the file analyzing process
End SubMerci d'avance pour votre aide !
Bonjour
Il me semble qu'en remplaçant :
If Not IsEmpty(tab_error) Thenpar :
If k > 0 Thença devrait marcher puisque k compte les erreurs. S'il n'ya pas d'erreur k sera &gal à zéro
Effectivement ça fonctionne de cette façon.
Merci pour ta réponse !