![]() |
|
Forum
|
|
|
#1 (permalink) |
|
XLDnaute Occasionel
Date d'inscription: septembre 2005
Localisation: Rillieux la Pape
Version Excel : Excel 97 (PC)
Messages: 182
|
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 |
|
|
|
| ANNONCES | |||
|
|
|
|
#2 (permalink) |
|
XLDnaute Nouveau
Date d'inscription: mai 2005
Messages: 37
|
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é |
|
|
|
|
|
#3 (permalink) |
|
XLDnaute Occasionel
Date d'inscription: septembre 2005
Localisation: Rillieux la Pape
Version Excel : Excel 97 (PC)
Messages: 182
|
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 |
|
|
|
|
|
#4 (permalink) |
|
XLDnaute Barbatruc
Date d'inscription: juin 2007
Version Excel : Excel 2003 (PC)
Messages: 3 142
|
Bonjour,
je ne sais pas si tu es allé voir sur son site, mais jboisgontier propose pas mal de solutions pour lire dans un fichier fermé. son site : Formation Excel VBA JB clique sur Index, puis sur ADO |
|
|
|
|
|
#5 (permalink) |
|
XLDnaute Nouveau
Date d'inscription: mai 2005
Messages: 37
|
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é |
|
|
|
|
|
#6 (permalink) |
|
XLDnaute Occasionel
Date d'inscription: septembre 2005
Localisation: Rillieux la Pape
Version Excel : Excel 97 (PC)
Messages: 182
|
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 |
|
|
|
|
|
#7 (permalink) |
|
XLDnaute Accro
Date d'inscription: février 2005
Localisation: Aubenas
Version Excel : Excel 2000 (PC)
Messages: 1 128
|
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)
__________________
A+ Michel_M |
|
|
|
|
|
#8 (permalink) |
|
XLDnaute Occasionel
Date d'inscription: septembre 2005
Localisation: Rillieux la Pape
Version Excel : Excel 97 (PC)
Messages: 182
|
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 |
|
|
|
|
|
#10 (permalink) |
|
XLDnaute Occasionel
Date d'inscription: septembre 2005
Localisation: Rillieux la Pape
Version Excel : Excel 97 (PC)
Messages: 182
|
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 |
|
|
|
|
|
#11 (permalink) |
|
XLDnaute Occasionel
Date d'inscription: septembre 2005
Localisation: Rillieux la Pape
Version Excel : Excel 97 (PC)
Messages: 182
|
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 |
|
|
|
|
|
#12 (permalink) |
|
XLDnaute Accro
Date d'inscription: février 2005
Localisation: Aubenas
Version Excel : Excel 2000 (PC)
Messages: 1 128
|
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é?
__________________
A+ Michel_M |
|
|
|
|
|
#13 (permalink) |
|
XLDnaute Occasionel
Date d'inscription: septembre 2005
Localisation: Rillieux la Pape
Version Excel : Excel 97 (PC)
Messages: 182
|
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 |
|
|
|
|
|
#14 (permalink) |
|
XLDnaute Accro
Date d'inscription: février 2005
Localisation: Aubenas
Version Excel : Excel 2000 (PC)
Messages: 1 128
|
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.
__________________
A+ Michel_M |
|
|
|
|
|
#15 (permalink) |
|
XLDnaute Accro
Date d'inscription: février 2005
Localisation: Aubenas
Version Excel : Excel 2000 (PC)
Messages: 1 128
|
Re,
petit pause café à la mine... ![]() 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
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
__________________
A+ Michel_M Dernière modification par michel_m ; 07/03/2008 à 16h43. |
|
|
|
| ANNONCES | |
![]() |
| Liens sociaux |
| Outils de la discussion | |
|
|
Discussions similaires
|
||||
| Discussion | Auteur | Forum | Réponses | Dernier message |
| Lire une cellule dans un fichier fermé... | pierrof | Forum Excel | 4 | 11/05/2007 11h55 |
| plusieurs combobox pour lire dans un fichier fermé | ben | Forum Excel | 4 | 06/05/2006 21h09 |
| Lire fichier fermé | Pierre | Forum Excel | 1 | 04/04/2006 19h28 |
| un userform peut il lire dans un fichier fermé | balou | Forum Excel | 2 | 05/10/2005 18h30 |
| Ecrire ou lire dans un fichier Excel ferme | Roland | Forum Excel Downloads - Archives | 0 | 07/02/2004 19h40 |