Lire une feuille d'un classeur sans l'ouvrir

Résolu
SamGuelis - 23 mai 2013 à 18:28
 SamGuelis - 31 mai 2013 à 11:29
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

7 réponses

Utilisateur anonyme
27 mai 2013 à 15:59
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



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
3