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 Sub

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

Bonjour 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: Next

Puis 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").Name

la 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

Rechercher des sujets similaires à "coller tableau memoire range"