Récupérer le nom de classeurs ouverts avec GetOpenFilename dans un tableau

Y compris Power BI, Power Query et toute autre question en lien avec Excel
M
Mateo MNH
Jeune membre
Jeune membre
Messages : 46
Inscrit le : 4 avril 2017
Version d'Excel : 2013

Message par Mateo MNH » 30 juillet 2019, 15:47

Bonjour à tous et à toutes,

Je cherche à récupérer dans un tableau le nom des classeurs que mon utilisateur va choisir d'ouvrir avec la macro afin de faciliter le codage des actions à effectuer sur chaque classeur par la suite.

Pour cela, j'utilise le code suivant :
ChDrive DASHB
ChDir DASHB

Tables = Application.GetOpenFilename(MultiSelect:=True)
ReDim DataTableName(UBound(Tables), 1)

For i = LBound(Tables, 1) To UBound(Tables, 1)
    Workbooks.Open (Tables(i))
    
' C'est ici que je compte récupérer le nom des classeurs dans mon tableau
    DataTableName(i, 1) = ActiveWorkbook.Name
Next

Workbooks(DataSetName).Activate
ActiveWorkbook.Sheets.Add
ActiveSheet.Name = "Testi"

Range(Cells(1, 1), Cells(UBound(Tables), 1)).Value = DataTableName

MsgBox ("Done")

End Sub
Toutefois, lorsque je vais vérifier les résultats dans la feuille "Testi", elle est totalement vide. J'en déduis que mon tableau ne s'incrémente pas dans la boucle For, mais je ne comprends pas pourquoi...

L'un d'entre vous a une idée?

Merci d'avance

Mateo
v
vince1512
Membre fidèle
Membre fidèle
Messages : 220
Appréciations reçues : 25
Inscrit le : 23 avril 2019
Version d'Excel : 2010 EN

Message par vince1512 » 30 juillet 2019, 16:03

Bonjour,

je ne suis pas sûr que ce soit exactement ce que tu recherches.
Le problème vient de l'accès au valeur du tableau qui était mal écrit.

Tables = Application.GetOpenFilename(MultiSelect:=True)
ReDim datatablename(UBound(Tables))

For i = LBound(Tables) To UBound(Tables)
    Workbooks.Open (Tables(i))
    
' C'est ici que je compte récupérer le nom des classeurs dans mon tableau
    datatablename(i) = ActiveWorkbook.Name
    ActiveWorkbook.Close
Next

ThisWorkbook.Activate
ActiveWorkbook.Sheets.Add
ActiveSheet.Name = "Testi"

For i = 1 To UBound(datatablename)
    Cells(i, 1).Value = datatablename(i)
Next i

MsgBox ("Done")
Cordialement.
:btres:
M
Mateo MNH
Jeune membre
Jeune membre
Messages : 46
Inscrit le : 4 avril 2017
Version d'Excel : 2013

Message par Mateo MNH » 30 juillet 2019, 16:21

Bonjour Vince1512 et merci pour ta réponse,

Par contre, il y a quelques détails que je ne comprends pas dans ta réponse :
For i = LBound(Tables) To UBound(Tables)
    Workbooks.Open (Tables(i))
    
' C'est ici que je compte récupérer le nom des classeurs dans mon tableau
    datatablename(i) = ActiveWorkbook.Name
    ActiveWorkbook.Close
Next
Par exemple, je ne comprends pas pourquoi tu fermes les classeurs une fois ouvert... Justement si je les ouvre, c'est pour les utiliser ensuite :scritch:

Ensuite, je ne comprends pas pourquoi tu as reformulé avec cette syntaxe :
ThisWorkbook.Activate
ActiveWorkbook.Sheets.Add
ActiveSheet.Name = "Testi"
Peux-tu m'expliquer?

Merci à toi

Mateo
v
vince1512
Membre fidèle
Membre fidèle
Messages : 220
Appréciations reçues : 25
Inscrit le : 23 avril 2019
Version d'Excel : 2010 EN

Message par vince1512 » 31 juillet 2019, 08:53

pour la fermeture, c'est juste un oublie j'en avais marre que tout les fichiers s'ouvre pendant que je teste :mrgreen:

La suite était également pour les tests tu peux faire comme bon te semble.
Ce n'est pas les parties que je voulais mettre en évidence dans ton code.

C'est cette partie qui doit t’intéresser :
For i = 1 To UBound(datatablename)
    Cells(i, 1).Value = datatablename(i)
Next i


Cordialement
:btres:
M
Mateo MNH
Jeune membre
Jeune membre
Messages : 46
Inscrit le : 4 avril 2017
Version d'Excel : 2013

Message par Mateo MNH » 31 juillet 2019, 11:55

Haha d'acc merci !

Au final, j'ai changé de technique et j'ai adopté un autre approche :
'On ouvre chaque fichier indiqué, puis, on sélectionne la feuille "DATA" sur chaque fichier et on vient y coller les nouvelles données à la place des anciennes

For i = LBound(Tables, 1) To UBound(Tables, 1)
    Workbooks.Open (Tables(i))
    ActiveWorkbook.Sheets("DATA").Select
    Range(Cells(1, 1), Cells(UBound(DataSet), 1)).Value = DataSet
    ActiveWorkbook.Close
Next

Et comme tu peux le voir, j'ai adopté ton code pour fermer le classeur, parce que mon PC n'appréciait pas vraiment pédaler sur 12 classeurs en même temps :lole:
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message