Bonjour à Tous
je pense que la question que je vais poser l'a déjà été mais je n'ai trouvé la réponse, probablement parce que mes critères de recherche ne sont pas corrects.
En fait dans le classeur C1 je veux lire toutes les lignes/colonnes remplies de la feuille SHx de chaque classeur d'un répertoire, sans préciser de les bornes en termes de colonnes.
Voici ce que j'ai testé comme code dans une procédure dans le classeur C1 à l'intérieur de ma boucle sur les fichiers:
Code ==========================
....
'Définit le Nom de la feuille dans le classeur fermé servant de base de données
Feuille = subString & "$"
'Adresse de la cellule contenant la donnée à récupérer dans le classeur fermé servant de base de données
Cellule = "A8:h" & Rows.Count
Set Source = New ADODB.Connection
With Source
.Provider = "Microsoft.Jet.OLEDB.4.0;"
.ConnectionString = "Provider=Microsoft.ace.OLEDB.12.0; Data Source=" & Fichier & ";Extended Properties=""Excel 12.0;HDR=yes;"";"
.Open
End With
Set ADOCommand = New ADODB.Command
With ADOCommand
.ActiveConnection = Source
.CommandText = "SELECT * FROM [" & Feuille & Cellule & "]"
End With
Set Rst = New ADODB.Recordset
Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic
Set Rst = Source.Execute("[" & Feuille & Cellule & "]")
nbFields = Rst.Fields.Count
SH1.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).CopyFromRecordset Rst
Rst.Close
Source.Close
.....
Ce code fonctionne.
Le problème est que selon le classeur la dernière colonne utile ne s'arrête pas à "h". Comment faire pour dire que je veux dans le record la ligne entière ou est la cellule "A8" (début des données utiles dans chaque classeur) jusqu'à la denière ligne visée?
Merci pour votre aide.Je continue à regarder la documentation pour essayer de résoudre mon problème.
SamGuelis
A voir également:
Vba copier une feuille dans un autre classeur sans ouvrir
La méthode plus performante que j'ai trouvé c'est d'utiliser ADODB et une requête SQL:
Il faut cocher la référence:
Outils => Références => Microsoft Activex Data Objects 2.x Library
Puis:
Sub LireClasseurFerme()
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 qui contient une feuille avec la première ligne
'comme ligne des champs : Nbr|NumCand|Sexe|Nom|Prenoms|DateNaiss
'La feuille Liste contient les données
Fichier = "c:\users\toto\desktop\test1.xls"
'Nom de la feuille dans le classeur fermé
NomFeuille = "Feuil1$" 'Le $ est obligatoire
'--- Connexion ---
Set Cn = New ADODB.Connection
With Cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
.Open
End With
'..... Définit la requête.
Texte_SQL = "SELECT * FROM [" & NomFeuille & "]"
Set Rst = New ADODB.Recordset
Set Rst = Cn.Execute(Texte_SQL)
'Ecrit le résultat de la requête (ici toute la base) dans la cellule A1 de la feuille active du classeur actif
Range("A1").CopyFromRecordset Rst
'
'--- Fermeture connexion ---
Cn.Close
Set Cn = Nothing
End Sub
J'ai testé ce bout de code qui fonctionne sauf qu'il met des zéros dans les cellules vides... (à gérer)
Sub ImporterDonneesSansOuvrir()
'Exemple de la copie de la colone A et B du fichier notice.xlsx
Dim Chemin As String, fichier As String
Chemin = "C:\Users\toto\Desktop"
fichier = "notice.xlsx"
ThisWorkbook.Names.Add "plage", RefersTo:="='" & Chemin & "[" & fichier & "]Feuil1'!$A:$B"
With Sheets("Feuil2")
.[A:B] = "=plage"
.[A:B].Copy
Sheets("Feuil1").Range("A1").PasteSpecial xlPasteValues
.[A:B].Clear
End With
End Sub
Merci acive pour tes indications.
Mais mon interrogation est de savoir si l'on peut récupérer la ligne entière sans connaitre à priori la référence de la dernière colonne. Je déduis du code exemple que pour récupérer toute la ligne, il faut par, exemple mettre
Cellule = "A8:XFD" & Rows.Count
pour Excel 2010?
SamGuelis
Vous n’avez pas trouvé la réponse que vous recherchez ?
Ah... pour les lignes je n'ai pas trop cherché, sur l'exemple que j'ai mis il récupère bien toute une colonne, mais je ne suis pas très convaincu de l’efficacité de ce code...