VBA sans ouvrir fichier

Bonjour à tous ,

Je voulais savoir s'il était possible par un code VBA d'aller chercher des infos dans un fichier qui n'est pas obligé d'être ouvert ?

Je m'explique :

J'ai un fichier qui va chercher des infos via VBA dans une base.

Sauf que je suis obligée d'ouvrir ma base pour que cela fonctionne.

Et j'aimerais ne pas être obligée de l'ouvrir automatiquement (car elle met au moins 5 minutes à s'ouvrir...)

Merci,

Clem

Oui c'est possible ... mais pas de faire des calculs fichier fermé (sauf calculs simples).

Est-ce que tu veux un lien permanent ou juste un copier/coller ?

As-tu un exemple de fichiers ? (simplifié)

Proposition

Bonjour à tous,

Sinon pour lire puis écrire dans un fichier fermé, il y a ADO

Voici une démo (un peu simplette, mais fonctionnelle). Les fichiers sont à placer dans un même dossier. Le xlsm lit le xlsx qui lui reste fermé

Pierre

32demo-adodb.xlsm (38.89 Ko)
25data-demo-ado.xlsx (248.22 Ko)

Ben voilà un truc qui me plait !

Cela ressemble au mysqli !

Bon c'est un peu compliqué quand même ... mais tu es plein de ressources cachées !

Salut Steelson,

Rien à cacher, m'sieur le douanier , j'en fait largement état dans mes articles sur Excel et les bases de données => http://tatiak.canalblog.com/archives/excel_base_de_donnees/index.html

Sinon, en effet le principal langage utilisé pour les requêtes c'est du SQL, et l'avantage c'est qu'on peut aussi s'interfacer avec des bases MySql, SqlServer, Oracle, Access, ou autre ...!

Le Vba accepte presque toutes les commandes Sql via ADO (il y a quelques limites toutefois).

Compliqué, pas forcemment, parfois même plus simple que d'utiliser les formules de liaison quand la requête est un peu sophistiquée.

Voici un exemple de requête d'une de mes appli croisant les données de 3 onglets différents :

    Req = "SELECT MAX(V.Date_visite), M.Freq, R.Responsable, M.Id, M.Denomination, " & _
          " M.Reference, M.Emplacement, M.Batiment, M.Etage, M.Info1  " & _
          " FROM ([" & Materiel & "$] AS M " & _
          " LEFT JOIN [" & Verif & "$] AS V On M.Id=V.Id)" & _
          " LEFT JOIN [" & Responsables & "$] AS R On R.Id_Resp=M.Id_Resp" & _
          " WHERE (dateadd('m',12/M.freq, V.Date_visite)<=" & CLng(Date) & _
          " OR V.Date_visite>=" & derJ & _
          " OR ISNULL(V.Date_visite)) " & _
          " AND M.Id_Resp=" & Filtre & _
          " GROUP BY M.Freq, R.Responsable, M.Id, M.Denomination, M.Reference, M.Emplacement, " & _
          " M.Batiment, M.Etage, M.Info1 " & _
          " ORDER BY  MAX(V.Date_visite) ASC, M.Denomination ASC"

Le tout conforme à la norme Sql => https://sql.sh/

Ca peut sembler compliqué, mais écrire ça en VBA sans Sql, c'est encore plus coton!!

Le Sql dans Excel, c'est bon, mangez-en!

Pierre

Le Sql dans Excel, c'est bon, mangez-en!

Pierre

Merci

Pour le moment, je fais les requêtes en php et je sors un fichier csv ... mais excel est peut-être plus souple, je vais essayer chez moi.

Merci pour vos retours !

Le problème c'est que mes fichiers ne peuvent pas être dans un même dossier (à cause de répertoire commun de différents services...)

Il n'y a donc pas de solution ?

je peux joindre un fichier simplifié oui

17fiche.xlsm (489.02 Ko)
16base.xlsx (31.44 Ko)

Le problème c'est que mes fichiers ne peuvent pas être dans un même dossier (à cause de répertoire commun de différents services...)

je peux joindre un fichier simplifié oui

Pour moi le fait d'avoir des répertoires différents ne me pose pas de problème.

Mais on a beau ici avoir des fichiers simplifiés, j'ai du mal à savoir quelle valeur de quel fichier mettre dans quel fichier !

Pour des questions de clarté, je te conseille de rassembler dans un onglet les paramètres et valeurs obtenus, et ensuite par formule de faire appel à ces valeurs en fonction du besoin.

Ci-joint une maquette (pour simplifier je fais appel au même fichier, mais rien n'empêche de distinguer les différents paramètres.

9source.xlsx (8.04 Ko)

Merci Steelson,

Je t'explique le fichier que je t'ai envoyé (car je ne vois pas trop comment faire avec ce que tu m'as montré sachant que je travaille avec des listes + vba)

Alors en B13 je choisis une marque (j'ai fait une liste marque, dans mon vrai fichier il y a 30 marques)

En B14, je choisis mon produit (j'ai fait des listes indirect)

En B15, j'ai une liste via VBA qui va chercher les infos dans ma base en fonction du choix de la marque + du produit

Et lorsque j'ai alimenté ces 3 cases, ça va me chercher automatiquement dans ma base les ingrédients qu'il y a de ma colonne AD à CS (les supérieurs à 0 bien sûr).

Je ne sais pas si c'est clair ?

Clem

Je t'explique le fichier que je t'ai envoyé

Bonjour,

Il est où ?

Ah oui, il s'agit des 2 fichiers postés précédemment.

Ma méthode ne permet pas cela : elle permet juste d'aller chercher une valeur en pointant à une adresse pré-déterminée.

Je pense donc que c'est la méthode de Pierre qui elle seule pourrait sans doute convenir. Je ne sais pas s'il pourra répondre.

Bonjour à tous,

Voici un exemple,

Avant d 'exécuter la macro, n'oublie pas de modifier les lignes qui ont un commentaire " à adapter "

nécessite d'activer la référence: Microsoft ActiveX Data Objects xx Library

Sub Read_File()
Dim Repertoire As String, Fichier As String, Feuille As String
Dim Cnn As ADODB.Connection, texte_SQL As String, Rst As ADODB.Recordset

Sheets.Add After:=Sheets(Sheets.Count)

'les données des variables Fichier et Feuille peuvent être mit dans des cellules.
Fichier = "C:\Users\isabelle\Documents\Test\base.xlsx"                                           'à adapter
Feuille = "Feuil1"                                                                                                                  'à adapter

Set Cnn = New ADODB.Connection

'--- Connexion ---
With Cnn
    .Provider = "Microsoft.Jet.OLEDB.12.0"
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
    & Fichier & ";Extended Properties=""Excel 12.0;HDR=NO;"""
    .Open
End With

'--- récupérer les données --
Set rs = Cnn.Execute("SELECT * FROM [" & Feuille & "$]")
Range("A1").CopyFromRecordset rs

 '--- Fermeture connexion ---
rs.Close
Cnn.Close
Set rs = Nothing
Set Cnn = Nothing
End Sub

Merci pour vos réponses

Alors j'ai testé mais j'ai un message d'erreur :

"erreur de compilation : type défini par l'utilisateur non défini"

j'ai ça de surligné :

Dim Cnn As ADODB.Connection,

Clem

Cela m'arrive souvent

essaie simplement

Dim Cnn As Object

idem pour Rst

j'ai testé et j'ai le même message d'erreur pour :

Set Cnn = New ADODB.Connection

re,

cleiiim, fait la modification comme l'a suggéré Steelson

Dim Cnn As Object

sinon avec

Dim Cnn As ADODB.Connection

il faut cocher la référence Microsoft scripting runtime

Bonjour à tous,

@i20100 : c'est curieux ton code qui utilise les 2 provider Jet et ACE à la suite.

Pour info :

  • un seul suffit
  • Jet c'est plutôt un 'vieux' provider pour se connecter aux fichiers Access et Excel
  • ACE c'est un provider pour se connecter préférentiellement aux fichiers Access
  • un 'bon' provider pour les fichiers Access ou Excel c'est plutôt MSDASQL avec le driver Access ou Excel
  • et la bonne référence pour pouvoir déclarer un ADODB.Connection c'est plutôt MS ActiveX Data Objects 6.1 Library (du moins dans office 2016)

Après c'est l'éternel débat "faut-il écrire en liaison anticipée ou tardive?" Personnellement je préfère le late binding qui permet de s'adapter plus facilement à la config du PC utilisé (cf démo que j'ai postée en page1 de ce fil)

@cleiim : dans ma démo, il suffit de spécifier dans le code le bon chemin vers le bon dossier et ton fichier "Base.xlsx".

Ensuite si dans cette démo tu remplaces le champs "Pays" par ton champ "Marque" et l'onglet

"Donnees" par ton onglet "Base Mère" tu peux récupérer les données correspondantes à la marque choisie dans la liste déroulante.

(En passant, pour le Vba il est souvent préférable de nommer les onglets sans utiliser d'accent ni d'espace "Base_Mere" plutôt que "Base Mère")

Pour ton fichier "Fiche.xlsm" c'est un peu trop fouillis pour que j'arrive à me repérer et à comprendre ce que tu veux obtenir (mais je suis faignant).

Il me semble que tu pourrais arriver à ton objectif plus simplement.

Mais au fait quel est cet objectif?

Pierre

Re,

Alors j'ai essayé la solution de i20100, et ça m'a collé toutes les valeurs de ma base dans ma "fiche".

pierrep56, je vais tester ta solution. Mon objectif : je souhaite que les personnes utilisant ma "fiche" ne soient pas obligées d'ouvrir ma base (des données étant confidentielles et l'ouverture étant assez longue).

Sinon tant pis je vais laisser tomber ...

Clem

Rechercher des sujets similaires à "vba ouvrir fichier"