Récupérer des données dans un fichier Excel avec ADO

nak

XLDnaute Occasionnel
Bonjour,

Je viens de récupérer une macro sur le très bon site de Frederic Sigonneau.
Celle-ci permet de récupérer l'ensemble des données d'un feuille Excel dans un classeur fermé. J'arrive à l'adapter pour mes besoins sauf que je viens de remarquer un "bug".
Lorsque j'ai une colonne avec plusieurs formats de cellule un des formats n'est pas récupéré.
Dans mon exemple en PJ la date n'est pas récupérée dans le fichier donnee.xls

Pouvez vous m'apporter votre aide SVP.

Merci

'Attribute VB_Name = "ADOImporterFeuilleEntiere"

'importer le contenu d'une feuille de calcul d'un classeur fermé
'(seules les données sont importées, pas les mises en forme)

Sub recup()
fich$ = ThisWorkbook.Path & "\donnees.xls"
Feuille$ = "Donnees"
QueryWorksheet fich, Feuille
End Sub

Public Sub QueryWorksheet(NomFichier$, Feuille$)
'Rob Bovey, mpep
'nécessite une référence à la librairie
'Microsoft ActiveX Data Object 2.x Library
Dim rsData As ADODB.Recordset
Dim szConnect As String
Dim szSQL As String

''' Crée la chaîne de connexion
szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & NomFichier & ";" & _
"Extended Properties=Excel 8.0;"

' La requête est basée sur le nom de la feuille. Ce nom
' doit se terminer par un $ et doit être entouré de crochets droits.
' Adapter ce nom à vos besoins
szSQL = "SELECT * FROM [" & Feuille & "$];"

Set rsData = New ADODB.Recordset
rsData.Open szSQL, szConnect, adOpenForwardOnly, _
adLockReadOnly, adCmdText

''' Vérifie qu'on a bien reçu des données
If Not rsData.EOF Then
Sheets("Recup").Range("A1").CopyFromRecordset rsData
Else
MsgBox "Aucun enregistrement renvoyé.", vbCritical
End If

''' On nettoie pour finir...
rsData.Close
Set rsData = Nothing

End Sub
 

Pièces jointes

  • nako.zip
    18.1 KB · Affichages: 55

chris

XLDnaute Barbatruc
Re : Récupérer des données dans un fichier Excel avec ADO

Bonjour

Je n'ai pas testé mais de façon générale ADO se basant sur les principes des bases de données, les colonnes sont supposées de contenu homogène : si tu mélanges des dates avec des textes tu risque effectivement des problèmes.
 
G

Guest

Guest
Re : Récupérer des données dans un fichier Excel avec ADO

Bonjour

Hello Chris:)

Cris a raison, mais en changeant un peu la chaine de connexion, on peut forcer MSADO à lire toute les données des colonnes hétérogènes comme du texte. Après, comment excel va interpréter les chaines retournées, c'est un autre problème! Parfois il interprète bien les dates, suivant les configurations, parfois non à toi de faire les rectifications necessaires.


Code:
 szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & NomFichier & ";" & _
        "Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"

Il retournera toutes les données y compris l'entête malgrè HDR=No, avec HDR=Yes il ne renvoit pas l'entête.

A+
 
Dernière modification par un modérateur:

Theze

XLDnaute Occasionnel
Re : Récupérer des données dans un fichier Excel avec ADO

Bonjour,

Il y a plus facile pour récupérer des valeurs dans un classeur fermé. Il faut juste savoir quelle plage on veut récupérer. Un exemple (adapter le chemin du dossier et le nom du classeur, plage en A1:F17) :
Code:
Sub Recup()

    Dim Fichier As String
    Dim Chemin As String
    
    Chemin = "D:\Mon Dossier\"
    
    Fichier = "Classeur1.xls"
    
    
    'récupère les valeurs par formules
    Range("A1:F17").Formula = "='" & Chemin & "[" & Fichier & "]Feuil1'!A1:F17"
    
    'et ne garde que les valeurs
    Range("A1:F17").Value = Range("A1:F17").Value
    
End Sub

Hervé.
 
G

Guest

Guest
Re : Récupérer des données dans un fichier Excel avec ADO

Re,

Hello tototiti:),

Oui, mais avec d'autres limites.
exemple dans une colonne source qui aurait des dates, des textes, des valeurs 'VRAI', 'FAUX'
les résultats peuvent être inattendus:confused:. VRAI par exemple est importé comme TEXTE et n'est plus numérique (1). Quant au dates, cela dépend plus du système et des langues régionnales.

A++
 

Jam

XLDnaute Accro
Re : Récupérer des données dans un fichier Excel avec ADO

Bonjour à tous,

Je m'étonne que vous vous étonniez sur le résultat et plus spécifiquement le format de la requête ?
En fait ce n'est pas si surprenant car bon nombre d'entre nous confondent base de données et tableau Excel. C'est pourtant bien différent. Une base de données est pour faire simple et comme le fait remarquer Chris, composées de tables ayant des champs de données ayant un format bien défini à l'origine (texte, numérique...) avant même d'y stocker une donnée quelconque. Un tableau Excel est composé de cellules ordonnées comme bon nous semble avec un contenu/format très hétérogène. Bref, tout le contraire d'une base de données.
Au final il faut donc savoir que le résultat renvoyé par la requête, et par conséquent le format appliqué aux données, est analysé par le moteur (il est quand même sympa le p'tit moteur de nous aider un petit peu :D ) sur la base du contenu des premiers enregistrements lus, puis appliqué à la totalité des autres enregistrements.
Au final, et si je puis dire, ne demandez pas à un boucher de vous faire de la pâtisserie, ce n'est tout simplement pas son métier.

Bonne journée à tous.
 

Discussions similaires

Statistiques des forums

Discussions
312 303
Messages
2 087 047
Membres
103 441
dernier inscrit
MarioC