Coller un tableau 1D mémoire sur une Range
Bonjour le forum !
J'ai créer une macro qui me permet de récupérer des fichiers .xls parmi plusieurs dossier et sous-dossier.
Ces fichiers, en fonction de leur nom d'abord puis de la version d'une macro présente dans chaque fichier et utilisé pour les remplir, sont classé sur différentes feuilles excel pour une autre utilisation.
Je me suis rendu compte lors de différents test que certain des fichiers .xls présent dans les dossiers, malgré une appellation similaire n'avait parfois rien à voir avec les fichiers que je souhaite extraire, et la macro plantait au moment de vérifier la version de la macro présente dans le fichier, car pas présente.
Je tente donc de créer un tableau 1D qui prendra comme valeur le chemin du "mauvais fichier", puis qui collera ce tableau mémoire sur une feuille lorsque la macro aura terminé de parcourir tout les dossiers et sous-dossiers.
Mon problème se situe sur la partie collage de ce tableau...
Je suis passé par différentes manières de collage mais rien n'y fait, je tombe toujours sur une erreur :
Error : indice n'appartient pas à la sélection :
- Worksheets("UnusableFile").Range("A1").Resize(UBound(table, 1)) = table
- Worksheets("UnusableFile").Range("A1").Resize(UBound(table, 1) + 1) = table
Error : appel de procédure incorrecte :
Worksheets("UnusableFile").Range("A1:A" & measures) = Application.Transpose(table)
Worksheets("UnusableFile").Range("A1:A" & measures) = table
J'avoue que je suis un peu perdu car j'ai déjà effectué plusieurs fois la même manip sur d'autre fonction, et l'une de ces écritures à toujours marché...
Je mets une copie de mon code en dessous.
Merci d'avance pour vos réponse !
Sub GetFiles(ByVal path As String)
Dim FSO As FileSystemObject
Dim folder As Object
Dim subfolder As Object
Dim file As Object
Dim wb As Workbook
Dim table()
Dim measures As Integer, k As Integer
measures = 1 'indice pour redim table
k = 0 'indice pour remplir tableau (measures + 1)
Set wb = Workbooks("FAIR_EXTRACT_FR_2")
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set FSO = New FileSystemObject
Set folder = FSO.GetFolder(path)
For Each subfolder In folder.SubFolders
GetFiles (subfolder.path)
Next subfolder
For Each file In folder.Files
If file.name Like "*.xls" Then
If (file.name Like "*-AP-*") Or (file.name Like "*-FA-*") Or (file.name Like "*-ST-*") Then
Workbooks.Open file
On Error GoTo erreur 'si le fichier ne s'ouvre pas
Worksheets(1).Activate
If ActiveSheet.name <> "ReportHeader" Then 'si le fichier n'est pas conforme
ReDim Preserve table(measures)
table(k) = file.path
measures = measures + 1
k = k + 1
Else 'fichier conforme
If Range("SCPhenix_Version").Value Like "Phenix V1.4*" Then
wb.Worksheets("PhenixV1_4_2").Range("A" & Rows.count).End(xlUp).Offset(1, 0) = file.path 'path of the file
wb.Worksheets("PhenixV1_4_2").Range("B" & Rows.count).End(xlUp).Offset(1, 0) = file.DateLastModified
ElseIf Range("SCPhenix_Version").Value Like "Phenix V1.5*" Then
wb.Worksheets("PhenixV1_5_2").Range("A" & Rows.count).End(xlUp).Offset(1, 0) = file.path 'path of the file
wb.Worksheets("PhenixV1_5_2").Range("B" & Rows.count).End(xlUp).Offset(1, 0) = file.DateLastModified 'Last modification date of the file
ElseIf Range("SCPhenix_Version").Value Like "Phenix V1.6*" Then
wb.Worksheets("PhenixV1_6").Range("A" & Rows.count).End(xlUp).Offset(1, 0) = file.path 'path of the file
wb.Worksheets("PhenixV1_6").Range("B" & Rows.count).End(xlUp).Offset(1, 0) = file.DateLastModified 'Last modification date of the file
End If
Workbooks(file.name).Close
End If
End If
End If
suivant:
Next file
GoTo end_sub
erreur:
ReDim Preserve table(measures)
table(k) = file.path
measures = measures + 1
k = k + 1
On Error GoTo 0
GoTo suivant
end_sub:
Worksheets("UnusableFile").Range("A1").Resize(UBound(table, 1)) = table
Application.EnableEvents = True
Set FSO = Nothing
Set folder = Nothing
Set subfolder = Nothing
Set file = Nothing
Exit Sub '<-------------------------- exit program
End SubBonjour Emoh1998,
Vous pouvez peut-être vous inspirer du code :
Sub test()
Dim t(5), i&
For i = LBound(t) To UBound(t): t(i) = i: Next
Range("a1").Resize(UBound(t) - LBound(t) + 1) = Application.Transpose(t)
End SubBonjour mafraise,
Merci pour votre réponse rapide. J'ai tenté d'adapter le code, sans succès..
Je n'ai d'ailleurs pas bien compris ce qu'il faisait
Bonjour,
par principe je défini toujours la borne basse lors d'un Redim : ReDim Preserve table(0 to measures)
La valeur par défaut peut avoir été changée, au moins je suis sûr de ce qu'elle est...
En théorie Worksheets("UnusableFile").Range("A1").Resize(UBound(table, 1) + 1) = table devrait être bon avec le +1
Du coup, es-tu sûr "UnusableFile" aux majuscules près ? Et cette feuille est-elle bien dans workbook actif à ce moment là vu que tu ne le désignes pas ?
eric
Re,Je n'ai d'ailleurs pas bien compris ce qu'il faisait
Le programme crée un tableau à une dimension t (vous aussi mais avec le nom table) :
For i = LBound(t) To UBound(t): t(i) = i: NextPuis il transfert le tableau t sur la colonne A à partir de A1 :
Range("a1").Resize(UBound(t) - LBound(t) + 1) = Application.Transpose(t)nota : l'instruction de transfert fonctionne quelque soit la base du tableau t et son nombre d'éléments (base 0 ou base 1 ou tout autre base n)
Un petit bémol : dans le temps, de par l'utilisation de la fonction Transpose() le tableau t ne devait pas avoir plus de 65 536 éléments. Je n'ai pas vérifiéce qu'il en est avec les dernière versions d'Excel. A moins que votre répertoire ne soit "blindé", il n'y a aucun risque. Sinon, d'autres méthodes existent (un peu plus longue en lignes de code)
Re,
Merci mafraise pour les précisions.
eriiic, merci pour la réponse.
J'ai tenté de modifier l'écriture du Redim, mais rien ne change. J'obtiens toujours l'erreur : indice n'appartient la sélection..
Pour l'écriture de "UnusableFile" je suis sûr aussi, j'ai rajouté une ligne Workbooks.activate au-dessus mais rien ne change...
Re,
je n'ai jamais dit qu'imposer la borne basse résoudrait ton pb mais que je préférais en terme de sécurité et de clarté.
Workbooks.Activate ne veut rien dire et ne peut que te provoquer une erreur.
Insère ces 2 lignes avant l'écriture sur feuille :
MsgBox ActiveWorkbook.Name
MsgBox Worksheets("UnusableFile").Namela 1ère te dit le classeur actif, la 2nde ne doit pas faire d'erreur si ta feuille y est bien trouvée.
Si ça c'est ok le soucis se situera sur la taille de la sélection o`tu veux coller.
Le mieux serait de mettre un fichier de travail produisant l'erreur (anonymisé et réduit au minimum)
eric