VBA EXCEL lire fichier sans l'ouvrir

[Fermé]
Signaler
-
 Kree -
Bonjour,

Je recherche de l'aide pour lire les données d'un fichier sans l'ouvrir et importer ces données sous Excel. Monfichier Excel (Appelons XL) contient indirectement le nom du fichier où se trouvent mes données (Appelons le DN) via différentes colonne (disons que DN= Range ("A1") & "_a_" & Range("A2") ,avec un chemin toujours identique type v:\..\DN).

Le problème est que DN n'est pas un .xls. En demandant l'ouverture par Excel, je récupère les données que je souhaite travailler toujours dans la même colonne. Je voudrais donc savoir si il est possible d'effectuer une macro qui me permette de lire DN comme un document Excel mais sans l'ouvrir.
NB: DN est un .dbf

Cela me permettrait d'inclure une formule de type ="sumprod(subsitute('v:\..\[DN]feuil1'!$B2:$B1065,""."","","")*1)" et d'obtenir instantanément la somme dans XL sans avoir à ouvrir/fermer DN dans un nouveau doc Excel.

Novice en VBA, je demande votre aide, au moins savoir si c'est possible. Je me demandais également s'il était possible de récupérer directement l'emplacement des données sous dbf et transposer les "." en "," pour obtenir des nombres utilisables sous Excel (j'ai tenté de changer mon séparateur de décimale sous Excel, mais ça ne résout pas ce problème), si possible en ayant directement la somme de ces données de type "123.456".

J'espère avoir été assez clair et obtenir au moins quelques pistes. Désolé de vous faire travailler en ce 1er mai...
Merci

5 réponses

Messages postés
16523
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
28 septembre 2021
3 229
Bonjour,

un exemple qui insère dans ton classeur les données d'un champ d'une base DBF en utilisant la technologie ADO
en gras éléments à personnaliser

Sub importer_champDBF()
'necessite d'activer la reference Microsoft ActiveX Data Objects x.x Library (dans VBE outils-référence)
Dim source As ADODB.Connection
Dim Requete As ADODB.Recordset
Dim Chemin As String, fichier As String, texte_SQL As String

Chemin = "F:\emplacement de tabase"
'Chemin = ThisWorkbook.Path si ta base est dans le m^répertoire
fichier = "tabase.dbf"

Set source = New ADODB.Connection
source.Open _
"Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & _
Chemin & ";"

texte_SQL = "SELECT tonchamp FROM " & fichier & ";" 'si tu importe tout met * au lieu de tonchamp

Set Requete = New Recordset
Requete.Open texte_SQL, source, adOpenKeyset, adLockOptimistic

If Requete.EOF Then
MsgBox "Table vide..."
Exit Sub
End If

Application.ScreenUpdating = False
Range("B2").CopyFromRecordset Requete

Requete.Close
source.Close

End Sub


d'après MichelXLD sur www.excel-downloads.com

Michel
Bonjour Michel,

Waooh, je ne comprends pas tout au code et n'ai pas les moyens de le tester aujourd'hui, mais ça a l'air suffisament complexe pour que ça marche...
Et moi qui cherchais un code simple, je pouvais y rester ancore des lunes avant d'avoir une ébauche de la solution.
Si je comprends bien, j'importe toute ma base ou plutôt toute la plage que je désire mais ne peux y faire une opération.
Et si je comprends toujours bien, Source s'ouvre aussi mais là je ne suis pas sûr de bien comprendre parcequ'il serait plus simple de l'ouvrir en tant que fichier Excel, non?
En tout cas, merci beaucoup pour l'aide, je vais tester le code le plus vite possible pour voir vraiment ce que ça donne et tenter de comprendre un peu mieux le fonctionnement de la chose.
Messages postés
16523
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
28 septembre 2021
3 229
re,

bin.. si la source est un dbf, ce n'est pas un xls

tu te connectes à Source mais tu ne l'ouvres pas car c'est un fichier séquentiel indexé; SQL te permet d'avoir des données-sources très rapidement (voir exemple fichier secu ou ta banque)

tu peux faire des calculs (opérations ?) avec la syntaxe SQL

par exemple
SELECT [nbre]*[px_unit] AS total FROM....

crée un champ "total" en multipliant les valeurs des champs nombre et prix unitaire...

si tu veux filtrer sur une variable tu ajoutes WHERE nom="toto"

Je te concèdes que ce n'est pas forcément évident et qu'à chaque fois, j'y pique pas mal de prises de tête avec chorales occitanes.
Oula, ça commence vraiment à sortir de ma compréhension tout cela, à la base je voulais juste me simplifier un peu la vie, mais le problème étant lancé, je crois que le résoudre va la compliquer...
OK (ou à peu près) pour les calculs sous SQL et d'accord (je te crois sur parole) pour la rapidité SQL.
J'ouvrais mon dbf de la façon suivante:

Dim AppXL As Excel.application
Dim ClassR As Excel.workbook
Dim Feuye As Excel.worksheet
Set AppXL = createObject("Excel.application")
Dim a As string
a= Range ("A1") & "_a_" & Range("A2") 'Nom de mon fichier
Dim b As string
b = "v:\..\" & a
Workbook.opentext filename: = b

Et mon dbf apparaissait sous forme classeur Excel dans lequel je pouvais tranquillement jouer avec mes cellules avant de le refermer.
Le souci résidait surtout dans le temps que cela prenait d'ouvrir et fermer un doc excel pour chaque référence de fichier dbf.
En conclusion, si je veux gagner en vitesse, je dois apprendre le SQL en plus du VBA...
Messages postés
16523
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
28 septembre 2021
3 229
re,

Oui, mais si tu dis commencer en VBA, utilises ce que tu sais et ce que tu comprends en découvrant de nouvelles techniques; tu sais maintenant que c'est possible de lire ou d'écrire dans un fichier fermé, tu arriveras 1 de 4 à aborder ces notions... On utilise ADO-SQL pour des fichiers volumineux ou pour consolider N données de P fichiers dans un récapitulatif.

Pour moi, c'est pas venu tout de suite et encore maintenant, j'hésite et me plante souvent (9/10)

Cordialement

Michel
re,

Ce que je sais c'est que j'ai encore beaucoup à comprendre et que le plus sûr moyen d'avancer c'est d'y aller pas à pas.

Ce que je crois comprendre: quand je demande à ouvrir mon fichier par la commande workbook.opentext filename:=b je crée ledit classeur en l'ouvrant cela sous entend que d'une part je crée le classeur b (ou plutôt "a" dans mon exemple) et d'autre part, je l'ouvre, le tout en une seule commande.
Ce que je ne comprends pas c'est que je ne puisse pas simplement le créer et m'y référer (il doit sûrement y avoir une technique à découvrir). Car, une fois créé, je devrais pouvoir accéder à son contenu et faire mes calculs sans avoir à l'ouvrir (ce que je sais faire avec un.xls classique tant que le chemin est connu). Ca, c'est ce que je commence à comprendre comme illusoire.
- Où bug mon raisonnement? - Vraisemblablement dans mes préceptes VBA et le potentiel d'ADO-SQL (pour le moment très obscur) pour ce que je cherche à faire.

En tout cas, un grand merci pour la piste SQL que je vais tester et pour le reste.