VBA : obtenir des valeurs de cellules dans des fichiers fermés

JNP

XLDnaute Barbatruc
Bonjour à toutes et à tous :),
Je m'interroge sur une petite chose en VBA :eek:...
Dans une cellule, on peut faire référence à la valeur d'un fichier fermé simplement en donnant le chemin de celui-ci, type
Code:
='C:\Users\JNP\Desktop\[Téléphone.xls]JNP'!$A$1
J'ai essayé de l'appliquer en Evaluate, mais je n'y suis pas arrivé :eek:...
David84 m'a proposé la méthode GetObject, mais celle-ci ouvre le fichier :rolleyes:...
Merci d'avance si vous avez une piste ou une solution :p
Bon WE :cool:
PS : je n'ai pas mis de fichier exemple, désolé, mais je ne vois pas ce que ça apporterait ;)
 

Hulk

XLDnaute Barbatruc
Re : VBA : obtenir des valeurs de cellules dans des fichiers fermés

Bonjour à tous :)

Je ne peux t'apporter de réponse, mais juste pour te saluer !

Il me semble que tu m'avais envoyé un mp et que je ne t'ai pas répondu (oubli :rolleyes:)

Bon week à toi et tous !
 
C

Compte Supprimé 979

Guest
Re : VBA : obtenir des valeurs de cellules dans des fichiers fermés

JNP,

La méthode OLE proposée est la plus simple à utiliser, mais effectivement ça ouvre le classeur

Il y a donc la méthode ADO, mais moins simple, quoique ;)
VB:
' Lire la valeur d'une cellule dans un classeur fermé
Sub test()
Dim fich$, feuil$, Cell As Range
  fich = "D:\TestADO.xls"
  feuil = "feuil1"
  Set Cell = Range("A1")
  MsgBox GetValueWithADO(fich, feuil, Cell)
End Sub
Function GetValueWithADO(Classeur$, Feuille$, Cell As Range)
'renvoie la valeur de la cellule Cell de la feuille Feuille
'du classeur fermé Classeur
  Dim RcdSet As Object
  Dim strConn As String
  Dim strCmd As String
  Dim dummyBase As Range
  'prépare une "base de données" bidon pour la clause SELECT
  '(une entête fictive et une ligne de données)
  Set dummyBase = Cell.Resize(2)
  'prépare les commandes ADO et SQL
  strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & Classeur & ";" & _
            "Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"";"
  strCmd = "SELECT * FROM [" & Feuille & "$" & dummyBase.Address(0, 0) & "]"
  ' crée l'objet Recordset
  Set RcdSet = CreateObject("ADODB.Recordset")
  ' va chercher l'info
  RcdSet.Open strCmd, strConn, 0, 1, 1  'adOpenForwardOnly, adLockReadOnly, adCmdText
  ' et la renvoie
  GetValueWithADO = Application.Clean(RcdSet(0))
  ' autre syntaxe possible
  'GetValueWithADO =Application.Clean(RcdSet.GetString(NumRows:=1))
  'nettoyage
  Set RcdSet = Nothing
End Function

A+
 

david84

XLDnaute Barbatruc
Re : VBA : obtenir des valeurs de cellules dans des fichiers fermés

Bonjour Jean-Noël,
regarde ce Ce lien n'existe plus si cela peut t'éclairer. Il est notamment précisé :
Avant de vous lancer dans l'exploration du modèle ADO, n'oubliez pas qu'Excel possède 2 outils afin de lire dans un classeur fermé:

Les formules de liaison:

='C:\Documents and Settings\mimi\dossier\excel\[ClasseurBase.xls]Feuil1'!$A$1

'Faire une RECHERCHE Verticale dans un classeur fermé:
'Rechercher "DVP" dans la colonne A du classeur fermé et afficher la donnée correspondante de la colonne B.
=RECHERCHEV("DVP";'C:\Documents and Settings\mimi\dossier\excel\[ClasseurBase.xls]Feuil1'!$A:$B;2;FAUX)

Les macros Excel4:
Vba

'Lecture de la cellule A1 dans la Feuil1 du classeur fermé
MsgBox ExecuteExcel4Macro("'C:\Documents and Settings\mimi\dossier\excel\[ClasseurBase.xls]Feuil1'!R1C1")
A+
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : VBA : obtenir des valeurs de cellules dans des fichiers fermés

Bonjour,

Fonction de lecture d'une cellule dans un classeur fermé

Pour récupérer la cellule A4 de ADOSource.xls, =LitUneCellule(D2;D3;D4;D5)

Pour un appel à partir de VBA


Code:
Sub essai()
  x = LitUneCellule("c:\mesdoc\excelmacronouveau\1001exemples", "ADOsource.xls", "feuil1", "A4")
  MsgBox x
End Sub

Code:
Function LitUneCellule(repertoire As String, fichier As String, feuille As String, cellule As String)
  'Microsoft ActiveX DataObject 2.8 doit être coché
  Application.Volatile
  Set cnn = New ADODB.Connection
  cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Data Source=" & repertoire & "\" & fichier & _
         ";Extended Properties=""Excel 8.0;HDR=No;"";"
  Set rs = cnn.Execute("SELECT * FROM [" & feuille & "$" & cellule & ":" & cellule & "]")
  LitUneCellule = rs(0)
  rs.Close
  cnn.Close
  Set rs = Nothing
  Set cnn = Nothing
End Function

Pour écrire dans une cellule d'un classeur fermé

Code:
Sub Ecrit()
  Call ModifieUneCellule("c:\mesdoc\excelmacronouveau\1001exemples", "ADOsource.xls", "feuil1", "A4", "totox")
End Sub

Code:
Sub ModifieUneCellule(repertoire As String, fichier As String, feuille As String, cellule As String, NouvelleValeur)
  'Microsoft ActiveX DataObject 2.8 doit être coché
  Set cnn = New ADODB.Connection
  cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & repertoire & "\" & fichier & _
     ";Extended Properties=""Excel 8.0;HDR=No;"";"
  Sql = "SELECT * FROM [" & feuille & "$" & cellule & ":" & cellule & "]"
    Set rs = New ADODB.Recordset
  rs.Open Sql, cnn, adOpenDynamic, adLockOptimistic
  rs(0).Value = NouvelleValeur
  rs.Update
  rs.Close
  cnn.Close
  Set rs = Nothing
  Set cnn = Nothing
End Sub

JB
 

Pièces jointes

  • LitEcritCelluleAdo.xls
    32 KB · Affichages: 86
Dernière édition:

YANN-56

XLDnaute Barbatruc
Re : VBA : obtenir des valeurs de cellules dans des fichiers fermés

Bonjour JNP, Hulk, Bruno, david, BOISGONTIER et à ceux qui passeront par ici,

J'ai sur ce Fil posé une question et obtenu de belles aides.
https://www.excel-downloads.com/thr...s-une-cellule-manque-incomprehensible.172281/
Aujourd'hui, pour ce qui est de récupérer des données dans un Classeur Fermé; c'est o.k.
Pour écrire c'est pas mal non plus, sauf que je n'arrive pas à écrire en remplaçant toutes les données,
mais seulement à les ajouter en-dessous des existants.

J'ai un peu abandonné, car les contraintes sont un peu lourdes, et mon niveau un peu limite pour savoir adapter.

J'ai déjà utilisé " ExecuteExcel4Macro", mais là aussi je n'ai jamais été fichu que de pomper cellule par cellule.
(Je ne sais pas adapter pour faire une boucle sur plusieurs Lignes et Colonnes)

De la même façon faire l'inverse: Ecrire!

Pardon de m'immiscer, mais la discussion m'intéresse.
(Je vais parallèlement faire une recherche ici, et sur le Web)

Amicalement,

Yann
 

JNP

XLDnaute Barbatruc
Re : VBA : obtenir des valeurs de cellules dans des fichiers fermés

Re :),
Merci à tous de vos réponses :).
Effectivement, Bruno, la méthode ADO n'est pas forcément très simple :rolleyes:...
David, ta solution Excel4 est excellente, j'ai testé
Code:
ExecuteExcel4Macro("'C:\Users\JNP\Desktop\[Téléphone.xls]JNP'!R1C1")
et vu la vitesse d'exécution, je n'ai pas l'impression que le classeur s'ouvre :)...
Merci Jacques, mais c'est ce que je voulais éviter, de passer par la feuille :rolleyes:.
Yann, par rapport à boucler, ceci fonctionne chez moi
Code:
For i = 1 To 2
MsgBox ExecuteExcel4Macro("'C:\Users\JNP\Desktop\[Téléphone.xls]JNP'!R" & i & "C1")
Next i
Bon WE, je dirais "Résolu", mais si quelqu'un a une autre solution, ça m'intéresse :p
PS : Salut Hulk, et merci du coucou :cool:
 

YANN-56

XLDnaute Barbatruc
Re : VBA : obtenir des valeurs de cellules dans des fichiers fermés

Merci JNP pour la Boucle,

(J'ai un peu honte de ne pas l'avoir fait par moi-même!)

Accessoirement; pour ce qui est de la Méthode ADO, voici une adresse utile.
Lire et crire dans les classeurs Excel ferms
Pour ce qui est d'écrire; je vais continuer à chercher.
Le rêve serait un "ExecuteExcel4Macro" à l'envers.

Petite note personnelle:
Ouvrir un Classeur et le refermer est très rapide s'il n'est pas trop lourd.
alors le "Pompage" est extrêmement simple!
Si besoin, je suis disposé à fournir un exemple.

ExecuteExcel4Macro ou ADO sont quasi indispensables uniquement lorsque l'on est en réseau.
Je l'ai connu avec une douzaine de postes........ Bonjour le casse-tête.

Bonne fin de fin de semaine itou.

Amicalement,

Yann
 

david84

XLDnaute Barbatruc
Re : VBA : obtenir des valeurs de cellules dans des fichiers fermés

Re
De la même façon faire l'inverse: Ecrire!
Qu'entends-tu exactement par cela ? Est-ce mettre à jour des données déjà présentes dans le classeur ?
Je n'ai pas eu l'occasion d'utiliser ADO mais les requêtes UPDATE ne pourraient-elles pas répondre à ta demande (p15 du lien que j'ai communiqué dans le message 4) ?
A+
 

YANN-56

XLDnaute Barbatruc
Re : VBA : obtenir des valeurs de cellules dans des fichiers fermés

Re David,

Merci pour ta réponse.

Mais ci-joint: Ce que j'ai vu en suivant ton lien!

Je vais certainement peaufiner et travailler de mon coté, car j'espère trouver...

Plein de bonnes choses à toi,

Amicalement,

Yann
 

Pièces jointes

  • Image1.jpg
    Image1.jpg
    23.3 KB · Affichages: 155
  • Image1.jpg
    Image1.jpg
    23.3 KB · Affichages: 181
  • Image1.jpg
    Image1.jpg
    23.3 KB · Affichages: 176

david84

XLDnaute Barbatruc
Re : VBA : obtenir des valeurs de cellules dans des fichiers fermés

Re Yann
en fait, c'est le même lien que celui de ton message. Ci-joint la version .pdf
A+
 

Pièces jointes

  • LireEcrireClasseursFermes_ADO.pdf
    85.2 KB · Affichages: 166
  • LireEcrireClasseursFermes_ADO.pdf
    85.2 KB · Affichages: 173
  • LireEcrireClasseursFermes_ADO.pdf
    85.2 KB · Affichages: 184

Discussions similaires

Statistiques des forums

Discussions
312 100
Messages
2 085 294
Membres
102 854
dernier inscrit
ADRIENVR