Récupérer tout le contenu d'une feuille d'un fichier Excel sans l'ouvrir
Bonjour !
J'ai fait pas mal de recherche pour pouvoir copier le contenu d'un fichier excel n°2 dans un fichier excel n°1, sans ouvrir le classeur n°2.
Je place ici mon fichier n°1 (fichier cible) et mon fichier n°2 (fichier source) dans le même dossier, ce qui me donne comme code :
Sub test()
Dim Fichier As String
Fichier = "source.xlsx"
ThisWorkbook.Names.Add "plage", _
RefersTo:="='" & ThisWorkbook.Path & Application.PathSeparator & "[" & Fichier & "]Feuil1'!$A$1:$F$10"
With Sheets("Feuil1")
.[A1:F10] = "=plage"
.[A1:F10].Copy
.Range("A1").PasteSpecial xlPasteValues
Application.CutCopyMode = False
End With
End Sub
Donc là je peux récupérer le contenu de la plage de cellule [A:F] du classeur source pour le copier dans mon fichier cible.
J'ai une question à ce stade : on est d'accord qu'avec mon code, je n'ai aucune connexion entre les deux classeurs ? Car je n'en veux surtout pas. Je veux dire par là que la variable "plage" (si c'en est une) est supprimée ? Je n'ai pas tout compris du code que j'ai récupéré, je voulais m'en assurer.
Deuxième question : j'aimerais garder un peu le même code mais cette fois ci, copier TOUT le contenu de la feuille du fichier source, sans spécifier de plage de cellule (le fichier source que je récupère a près d'un million de lignes mdr).
Dernière question : Comment modifier mon code pour récupérer le contenu de la feuille excel du fichier source et le copier dans une variable de type à deux dimensions VBA ? Je dois manipuler ces lignes, et j'aimerais autant le faire en passant par VBA, ce sera plus rapide.
Merci et bonne soirée !
KillChief
Bonjour KillChief,
j'aimerais garder un peu le même code mais cette fois ci, copier TOUT le contenu de la feuille du fichier source, sans spécifier de plage de cellule (le fichier source
voici un exemple,
les données sont récupérées dans la variable Rst
Sub RequeteClasseurFerme()
'activer la référence Microsoft ActiveX Data Objects x.x Library
Dim Cn As ADODB.Connection
Dim Fichier As String
Dim NomFeuille As String, texte_SQL As String
Dim Rst As ADODB.Recordset
'Définit le classeur fermé servant de base de données
Fichier = "C:\Users\isabelle\Documents\base.xlsx"
'Nom de la feuille dans le classeur fermé
NomFeuille = "Feuil1"
Set Cn = New ADODB.Connection
'--- Connection ---
With Cn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
& Fichier & ";Extended Properties=""Excel 12.0;HDR=NO;"""
.Open
End With
'Définit la requête.
'/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
Set Rst = New ADODB.Recordset
Set Rst = Cn.Execute(texte_SQL)
'Ecrit le résultat de la requête dans la cellule A2
Range("A2").CopyFromRecordset Rst
'--- Fermeture connexion ---
Cn.Close
Set Cn = Nothing
End Sub
Bonjour sabV,
Merci d'avoir répondu!
Lorsque je lance la macro, on me marque
Erreur de compilation : Type défini par l'utilisateur non défini
Cela concerne la première ligne. Je crois qu'il faut activer la référence Microsoft ActiveX Data Object x.x Library.
En fait, je devrai passer ensuite ce code d'autres personnes. Existe un moyen de faire la même chose sans avoir à activer cela ? Quelque chose dans le même ordre d'idée que le code écrit au début ?
re,
Cela concerne la première ligne. Je crois qu'il faut activer la référence Microsoft ActiveX Data Object x.x Library.
oui c'est bien ça.
En fait, je devrai passer ensuite ce code d'autres personnes. Existe un moyen de faire la même chose sans avoir à activer cela ? Quelque chose dans le même ordre d'idée que le code écrit au début ?
j'ai trouvé une autre méthode,
ici: https://www.commentcamarche.com/faq/32961-vba-excel-lire-dans-un-classeur-ferme
il faut impérativement que les fichiers soient mit dans le même répertoire.
j'ai trouvé une autre méthode,
ici: https://www.commentcamarche.com/faq/32961-vba-excel-lire-dans-un-classeur-ferme
il faut impérativement que les fichiers soient mit dans le même répertoire.
Ce lien permet juste de récupérer une plage de cellules, non ?
J'ai cherché un peu partout sur internet, je crois qu'en fait c'est vraiment compliqué, je vais donc ouvrir mon fichier source je pense! Je voulais éviter de le faire car il est assez lourd (180 méga) mais cela devrait être plus simple à coder!