Lire une feuille d'un classeur sans l'ouvrir [Résolu]

- 23 mai 2013 à 18:28 - Dernière réponse :  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
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
- 27 mai 2013 à 15:59
3
Merci
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

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
- 26 mai 2013 à 18:40
0
Merci
Bonjour,

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


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
- 26 mai 2013 à 19:02
0
Merci
J'ai vu ça SUR CE SITE
D'ailleurs je ne vois pas pourquoi il fait un copier/coller, j'ai testé en direct et ça fonctionne:

Private Sub Récupère(Chemin As String, Fichier As String, Feuille As String)
ThisWorkbook.Names.Add "plage", RefersTo:="='" & Chemin & "[" & Fichier & "]" & Feuille & "'!$A:$B"
Sheets("Feuil1").[A:B] = "=plage"
End Sub


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
- 27 mai 2013 à 12:42
0
Merci
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
Commenter la réponse de SamGuelis
- 27 mai 2013 à 13:02
0
Merci
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...

Je regarderais et je te dirais.

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
- 27 mai 2013 à 16:00
0
Merci
(En gros c'est ce que tu essayais de faire au début)


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
- 31 mai 2013 à 11:29
0
Merci
Merci.
Cest plié.

SamGuelis
Commenter la réponse de SamGuelis

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.