Lire dans un fichier fermé

BenHarber

XLDnaute Occasionnel
Re-bonjour le Forum,
J’ai lu plusieurs posts sur le sujet suivant, mais je ne suis pas certain qu’ils répondent à ce que je souhaite faire : quelqu'un peut-il me conseiller, avant que je me lance tête baissée dans un développement qui peut ne pas aboutir ?….

J’ai un fichier ‘A’ avec lequel les DRH peuvent obtenir des informations ‘historisées’ sur le parcours professionnel d’un salarié à partir de son identifiant.
Ces informations complémentaires sont stockées dans un fichier ‘B’ (ce fichier ‘B fait # 10 000 Ko cad 40000 lignes sur 20 colonnes !).
Actuellement, je récupère l’identifiant sous forme de variable, j’ouvre le fichier ‘B’ (avec la méthode Workbooks.Open Filename:=chemin & nomFichier), j’explore la seule feuille (avec la méthode Find), recopie les données dans le fichier ‘A’ et referme le fichier ‘B’ : Cela fonctionne bien mais LES TEMPS D'AFFICHAGE SONT LONGS (ouvrir un fichier de 10 mégas…).

J'ai donc deux questions :
1) Peut-on concevoir une recherche similaire en laissant mon fichier ‘B’ fermé ?
(Tout ce que j’ai pu trouver sur la lecture d’informations d’un fichier fermé semble retourner les valeurs d’une plage de cellules déterminées (ex : ‘A1 :B20’). Seulement moi, il me faut avant tout repérer sur quelle(s) ligne(s) se trouve(nt) les enregistrement(s) correspondant(s).)

2) Si 'oui' à la 1ère question, est ce qu'une telle recherche dans un fichier fermé accélérerait l’affichage des informations dans le fichier ‘A’ ?

Merci d’avance pour vos conseils et avis, toujours lumineux !

Cordialement,
BenHarber
 

José77

XLDnaute Occasionnel
Re : Lire dans un fichier fermé

Bonjour,

Fais l'essai suivant.
Lance Excel et à partir du menu données/Données Externes/Imporer des données.
Sélectionne ton fichier (fermé), clique sur Ouvrir.
La boite de dialogue te renseignera sur la composition du fichier (Nbre de feuilles) et si tu ouvres une feuille tu auras accès aux données.

Je ne sais si ça correspond à ce que tu cherches, mais tiens nous au courant.
A+
josé
 

BenHarber

XLDnaute Occasionnel
Re : Lire dans un fichier fermé

Bonjour José,
Merci pour ta proposition mais je ne crois pas que cela réponde à ma demande (à moins que je passe à côté d'une subtilité, ce qui n'est pas impossible...).

Je cherche à récupérer différentes valeurs en provenance de mon fichier 'B' que je manipule dans des variables et que je 'pose' sur un formulaire convivial et lisible (après concaténation, mise en forme diverses...). Je ne cherche pas simplement à 'piocher' des données et les extraires sous forme de TCD.

Mais bon, peut-être n'ai-je pas tout compris ????...

BenHarber
 

José77

XLDnaute Occasionnel
Re : Lire dans un fichier fermé

Ben,
sans exemple de ta part l'aide sera très difficile, car il faut connaitre un minimum d'éléments.
Ton fichier fermé est peut être une base de données access.
Dans ce cas il va falloir utiliser ADO, utiliser les recordset et les requêtes en MySQL.
Est ce dans cette direction que tu travailles ?
A+
José
 

BenHarber

XLDnaute Occasionnel
Re : Lire dans un fichier fermé

bhbh,
Merci pour l'adresse du site que je ne connais pas : j'irai y faire un tour ce soir...ou plus surement demain !

José,
Merci pour ton intérêt à ma question.
Les 2 fichiers que j'utilise sont des fichiers Excel.
Pour schématiser, le fichier 'A' est un fichier 'léger' : il comporte quelques feuilles (dont une petite base de données dont les informations répondent à 80% des demandes des utilisateurs) et un usf avec lequel l'utilisateur saisit les filtres d'une requête.
Le fichier 'A' peut appeler le fichier 'B' lorsque l'utilisateur appelle des données historisées d'un agent, présentes dans le fichier 'B'.

Comme je l'expliquais au départ, je trouve que, rapporté au temps d'exécution de ma macro, l'opération d'ouverture du fichier 'B' est trop longue (vu que ce fichier est lourd). Je me demandais alors si je ne pouvais pas travailler sur ce même fichier 'B' fermé pour gagner en temps d'exécution.

Mais cette opération est-elle possible ? Si oui, est-elle judicieuse ?

Cordialement,
BenHarber
 

michel_m

XLDnaute Accro
Re : Lire dans un fichier fermé

Bonsoir à tous,

Ca ne devrait pas poser trop de pb (chuis pt'et imprudent!)

il faudrait que tu mettes un extrait (quelques lignes banalisées de ton fichier b) en PJ
avec notamment l'identifiant (texte ou nombre?)de la personne cherchée, sinon on va y passer le mois de mars

mais le + sage serait de proposer à ta drh de basculer le fichier B en Access ( 10Mo un fichier XL, c'est idéal pour se planter et pour se corrompre)

on utiliserait ADO pour se connecter
et une commande SQL select * from B WHere identifiant= salarié cherché

la rapidité de l'opération par cette technique? normalement instantané

je repasserai demain soir (pas trop le temps au boulot)
 

BenHarber

XLDnaute Occasionnel
Re : Lire dans un fichier fermé

Bonjour Michel,
Merci pour ton aide.
Ci-joint un extrait de mon fichier 'B' banalisé.

PS : bhbh, je suis allé sur l'adresse que tu m'a communiquée (jboisgontier) : ce site est vraiment tres bon : il foisonne d'exemples sous une présentation propre et structurée !
Chapeau à lui !
Je me l'enregistre en 'favoris' illico : merci

Cordialement,
BenHarber
 

Pièces jointes

  • ExempleFichierB.xls
    30 KB · Affichages: 182

BenHarber

XLDnaute Occasionnel
Re : Lire dans un fichier fermé

Bonjour Kiki,
Merci pour ta contribution : après avoir fouillé sur le site auquel tu fais référence, j'ai fait un 'mix' des divers codes glanées de ci de là : je suis parvenu au code suivant, qui fonctionne mais qui, à ce stade, me retourne LA TOTALITE des enregistrements du fichier 'B'.

'---------------------------------------------------------------
Sub TestConnection()
Dim Cn As Object, Rst As Object
Dim Fichier As String, nomFeuille As String

'Définit le classeur fermé servant de base de données
Fichier = "C:\BenHarber\ExempleFichierB.xls"
nomFeuille = "Feuil1"

Set Cn = CreateObject("ADODB.Connection")

With Cn
.Provider = "MSDASQL"
.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=" & Fichier & "; ReadOnly=True;"
.Open
End With

'Définit la requête.
'/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
texte_SQL = "SELECT * FROM [" & nomFeuille & "$]"

Set Rst = CreateObject("ADODB.Connection")
Set Rst = Cn.Execute(texte_SQL)

'Ecrit le résultat de la requête dans la cellule A2
Range("A1").CopyFromRecordset Rst

'--- Fermeture connexion ---
Cn.Close
Set Cn = Nothing
Set Rst = Nothing

End Sub
'---------------------------------------------------------------

Or, ce que je souhaiterais, c'est de ne retourner que la ou les lignes correspondant à un identifiant précis (par exemple : si je travaille sur l'id 'TTT888', je ne souhaiterais obtenir que les lignes 13 à 21 de mon fichier 'ExempleFichierB').

Je suppose qu'il y a une solution pour requêter, mais avec un code qui dépasse mon entendement....

Cordialement,
BenHarber
 

BenHarber

XLDnaute Occasionnel
Re : Lire dans un fichier fermé

Bon ca y est ! Je vient de trouver le code qui me permet de requeter sur un enregistrement.
(Il faut au préalable que je remplace tous les espaces de ma ligne d'entête par des '_'.

Puis, si je désire importer les seuls champs Agents+Entité+libellé entité je saisis :

texte_SQL = "SELECT Agents, Affectations_Entite, Affectations_Libellé_entité FROM [" & nomFeuille & "$] where Agents='TTT888'"
(je mettrai l'id Agents en variable).

Par contre, je me demande si je peux remplacer la commande
Range("A1").CopyFromRecordset Rst
par une 'mise en variable' des valeurs récupérées (cad mettre Entité+libellé dans des variables plutôt que les copier physiquement sur ma feuille).

Quelqu'un aurait-il une suggestion à me faire ?

Merci à tous pour votre aide très précieuse.

Cordialement,
BenHarber
 

michel_m

XLDnaute Accro
Re : Lire dans un fichier fermé

Bonjour à tous!

Tu vois, c'était pas trop compliqué! Félicitations toutefois pour le boulot que tu as sorti pour une première appli avec ADO

en plis des excellents Boisgontier et Silkyroad (bonjour,Mon cher Michel si tu nous lis), tu as aussi le site de Frédéric Sigonneau très intéressant!

Dire que cette solution est sur le WIKI d'XLD maintenant inaccessible!!, va comprendre

Ton identifiant est un texte donc

tavar="TT8888"

texte_SQL = "SELECT Agents, Affectations_Entite, Affectations_Libellé_entité FROM [" & nomFeuille & "$] where Agents='" & tavar &"';"
lire apostrophoque guillemet pour '""

Peux tu préciser ou plutôt éclaicir ta demande entité+ libellé?
 

BenHarber

XLDnaute Occasionnel
Re : Lire dans un fichier fermé

Michel,
Merci d'être ''repassé par là''.
Je suis assez content du résultat. Merci encore à tous les contributeurs de ce post qui m'ont orienté et refilé de bons tuyaux.

Concernant ma dernière demande, je vais essayer d'être + explicite.

La requête SQL du code VBA, et notamment la commande :
''Range("A1").CopyFromRecordset Rst''
'pose' dans la feuille active de mon fichier 'A' l'identifant en [A1], le code de l'entité en [B1] le libellé de l'entité en [C1]. Eventuellement, s'il y a plusieurs lignes correspondante dans mon fichier 'B', j'aurai à nouveau l'identifiant en [A2], le code d'une autre entité en [B2], le libellé de cette autre entité en [C2]...etc...

Or, je souhaiterais récupérer ces données SANS LES POSER COMME çA SUR LA FEUILLE ACTIVE. Schématiquement, j'aimerais concaténer certaines données entre elles, en copier d'autres dans divers cellules (non attenantes), voire, pourquoi pas, les 'poser' dans un usf. Dans ces conditions, je me demande s'il ne serait pas possible de récupérer toutes les données dans des variables avec lesquelles je travaillerais pour les mettre en forme directement, plutôt que les poser dans une feuille pour les reprendre et faire ensuite mon traitement.

A défaut d'être clair, j'espère que tu auras compris ce que je souhaitais faire....

Cordialement,
BenHarber
 

michel_m

XLDnaute Accro
Re : Lire dans un fichier fermé

Bonjour,

Okay, la solution serait de mettre le résultat de la requete dans un tableau VBA (array) que tu pourrais alors plus facilement répartir dans des usf.

Il me semble que j'ai ça dans mon grenier du boulot: j'essaierai de regarder sinon ce soir at home.

Si tu as des projets de liste dans un userform, va sur l'adresse indiquée par Kiki29 consulter l'article de Silkyroad sur les listviews, ça pourrait t'intéresser.

Bon, j'vas au boulot.
 

michel_m

XLDnaute Accro
Re : Lire dans un fichier fermé

Re,
petit pause café à la mine...:p

Ci dessous code qui permet de restituer les enregistrements sélectionnées dans un tableau intermédiaire puis dans une listbox sur un userform
Code:
Dim Tableau()
ReDim Preserve Tableau(2, X)
....
....
....
   If requete.EOF Then ' astuce d'après @+Thierry xld
        MsgBox "Plage vide..."
        Exit Sub
    End If
    
    '---------- affectation des membres de la requête dans un tableau intermédiaire : solution fournie par Michel_xld
    With requete
    .MoveFirst
    Do While Not .EOF
        Tableau(0, X) = .Fields(0)
        Tableau(1, X) = .Fields(1)
        Tableau(2, X) = .Fields(2)
        X = X + 1
        ReDim Preserve Tableau(2, X)
        .MoveNext
     Loop
    End With
    
' -------------------- affectations des valeurs du tableau à la liste de données (Michel_xld)
Me.LbxDonnees.Column() = Tableau
Me.tbx_nbre.Value = " Nombre d'éléments dans la liste: " & X + 1
'fermeture des connexions
requete.Close
source.Close
Tu vois que tu peux facilement conténer avec le & classique lors de l'affectation des champs au tableau
Tableau(3, X) = .Fields(3) & " " & .Fields(25)
les champs (fields) commencent à 0 et non à 1 comme dans un tableau (ca tombe bien!)

En espèrant que...
allez, encore un wagonnet à pousser.
Bon WE
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 347
Messages
2 087 504
Membres
103 564
dernier inscrit
Paul 1