OVH Cloud OVH Cloud

Liaison avec fichier fermé

13 réponses
Avatar
Philippe
Bonjour à tous,

A partir de l'exemple trouvé sur Excelabo (fcgd-lireferme.xls), j'ai
essayé de bâtir une fonction me permettant de récupérer dans une série
de fichiers où se trouve un onglet "standardisé", les valeurs de celui-ci.

Or la fonction donne comme résultat non pas le résultat mais la chaîne
correspondant à la formule du lien (lorsque je fais un copier-valeur, je
vois une simple quote de la formule dans la barre de formule).

L'un d'entre vous pourrait-il me dire se qui "cloche" dans mon script ?

Merci d'avance

Philippe

ps : pour comprendre l'esprit de cette fonction, je peux préciser que la
variable "Code" me permet de rechercher tel ou tel fichier selon ce dernier.

'Source : Fichier fcgd-lireferme.xls de Excelabo
'Sub recupuneseule()
' Flo
' Dim Chemin As String, NomFic As String, Onglet As String, Ref As String
' Dim A
' Chemin = InputBox("Chemin du fichier à lire :", "lire fichier
Fermé", "C:\Mes Documents")
' NomFic = InputBox("Nom du fichier EXCEL à lire :", "lire fichier
Fermé", "MonFichier.xls")
' Onglet = InputBox("nom de la feuille :", "lire fichier fermé",
"Feuil1")
' Ref = InputBox("adresse de la cellule à lire :", "lire fichier
fermé", "A1")
' ActiveCell.Value = "='" & Chemin & "\[" & NomFic & "]" & Onglet &
"'!" & Range(Ref).Range("A1").Address(, , xlR1C1)
'End Sub



Function ValeurFichierFerme(Cellule As Range, Code As Integer)
CodeSociete = Code
NomFichier =
Application.WorksheetFunction.Lookup(CodeSociete,_ Range("Code"),
Range("Nom_Fichier"))
NomFichierComplet = Range("NomChemin") & "\[" & NomFichier &
"]" &_ Range("NomOnglet")
ValeurFichierFerme = "='" & NomFichierComplet & "'!" &_
Cellule.Address(, , xlR1C1)
End Function

3 réponses

1 2
Avatar
Philippe
Bonsoir,

J'ai avancé dans la "customisation" de la fonction proposée par Frédéric.
Je souhaiterais maintenant que celle-ci me retourne la valeur 0, lorsque
l'onglet avec lequel le lien doit se faire n'existe pas !
Dans la version qui suit un message d'erreur est retourné ce qui "met en
vrille" les totalisations.

Merci pour votre aide

Philippe

Function GetValue(Code, Feuille$, Cell As Range)
'D'après une fonction de F. Sigonneau
'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

CodeSociete = Code

NomFichier = Application.WorksheetFunction.Lookup(CodeSociete,
Range("Code"), Range("Nom_Fichier"))
Classeur = Range("NomChemin") & "" & NomFichier
'Feuille = Range("NomOnglet")
'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

On Error GoTo Err:
GetValue = Application.Clean(RcdSet(0)) * 1
'autre syntaxe possible
' GetValueWithADO =Application.Clean(RcdSet.GetString(NumRows:=1))

'nettoyage
Set RcdSet = Nothing
Exit Function

Err:
GetValue = 0
Set RcdSet = Nothing
End Function

Eurêka,

Cela fonctionne (je m'était trompé dans la référence...), mais
bizarrement la valeur renvoyée est du texte (cadrée à gauche) alors que
si je la multiplie x 1, elle devient un nombre (cadrée à droite) !

Merci encore

Philippe




Avatar
Frédéric Sigonneau
Bonsoir,

Si la feuille demandée n'existe pas, c'est plutôt la commande d'ouverture du
Recordset qui va provoquer une erreur. Essaye avec cette modif :

'====================== Function GetValue(Code, Feuille$, Cell As Range)
'D'après une fonction de F. Sigonneau
'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

Classeur = Code

' CodeSociete = Code
'
' NomFichier = Application.WorksheetFunction.Lookup(CodeSociete,
Range("Code"), Range("Nom_Fichier"))
' Classeur = Range("NomChemin") & "" & NomFichier
' Feuille = Range("NomOnglet")

'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
On Error GoTo Fin
RcdSet.Open strCmd, strConn, 0, 1, 1

'et la renvoie
GetValue = Application.Clean(RcdSet(0)) * 1

'nettoyage
Set RcdSet = Nothing
Exit Function

Fin:
GetValue = 0
Set RcdSet = Nothing
End Function
'======================
Note : Err est un mot clé du langage Visual Basic (c'est l'objet qui permet de
gérer les erreurs de VB, ou des erreurs personnalisées). Il est déconseillé
d'utiliser les mots clés du langage pour nommer ses propres variables.

FS
---
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://frederic.sigonneau.free.fr
Si votre question sur Excel est urgente, évitez ma bal !

Bonsoir,

J'ai avancé dans la "customisation" de la fonction proposée par Frédéric.
Je souhaiterais maintenant que celle-ci me retourne la valeur 0, lorsque
l'onglet avec lequel le lien doit se faire n'existe pas !
Dans la version qui suit un message d'erreur est retourné ce qui "met en
vrille" les totalisations.

Merci pour votre aide

Philippe

Function GetValue(Code, Feuille$, Cell As Range)
'D'après une fonction de F. Sigonneau
'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

CodeSociete = Code

NomFichier = Application.WorksheetFunction.Lookup(CodeSociete,
Range("Code"), Range("Nom_Fichier"))
Classeur = Range("NomChemin") & "" & NomFichier
'Feuille = Range("NomOnglet")
'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

On Error GoTo Err:
GetValue = Application.Clean(RcdSet(0)) * 1
'autre syntaxe possible
' GetValueWithADO =Application.Clean(RcdSet.GetString(NumRows:=1))

'nettoyage
Set RcdSet = Nothing
Exit Function

Err:
GetValue = 0
Set RcdSet = Nothing
End Function


Eurêka,

Cela fonctionne (je m'était trompé dans la référence...), mais
bizarrement la valeur renvoyée est du texte (cadrée à gauche) alors
que si je la multiplie x 1, elle devient un nombre (cadrée à droite) !

Merci encore

Philippe






Avatar
Philippe
Grand merci Frédéric,

La fonction marche désormais telle que je la "rêvais".

Cordialement

Philippe



Bonsoir,

Si la feuille demandée n'existe pas, c'est plutôt la commande
d'ouverture du Recordset qui va provoquer une erreur. Essaye avec cette
modif :

'====================== > Function GetValue(Code, Feuille$, Cell As Range)
'D'après une fonction de F. Sigonneau
'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

Classeur = Code

' CodeSociete = Code
'
' NomFichier = Application.WorksheetFunction.Lookup(CodeSociete,
Range("Code"), Range("Nom_Fichier"))
' Classeur = Range("NomChemin") & "" & NomFichier
' Feuille = Range("NomOnglet")

'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
On Error GoTo Fin
RcdSet.Open strCmd, strConn, 0, 1, 1

'et la renvoie
GetValue = Application.Clean(RcdSet(0)) * 1

'nettoyage
Set RcdSet = Nothing
Exit Function

Fin:
GetValue = 0
Set RcdSet = Nothing
End Function
'====================== >
Note : Err est un mot clé du langage Visual Basic (c'est l'objet qui
permet de gérer les erreurs de VB, ou des erreurs personnalisées). Il
est déconseillé d'utiliser les mots clés du langage pour nommer ses
propres variables.

FS
---
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://frederic.sigonneau.free.fr
Si votre question sur Excel est urgente, évitez ma bal !


Bonsoir,

J'ai avancé dans la "customisation" de la fonction proposée par Frédéric.
Je souhaiterais maintenant que celle-ci me retourne la valeur 0,
lorsque l'onglet avec lequel le lien doit se faire n'existe pas !
Dans la version qui suit un message d'erreur est retourné ce qui "met
en vrille" les totalisations.

Merci pour votre aide

Philippe

Function GetValue(Code, Feuille$, Cell As Range)
'D'après une fonction de F. Sigonneau
'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

CodeSociete = Code

NomFichier = Application.WorksheetFunction.Lookup(CodeSociete,
Range("Code"), Range("Nom_Fichier"))
Classeur = Range("NomChemin") & "" & NomFichier
'Feuille = Range("NomOnglet")
'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

On Error GoTo Err:
GetValue = Application.Clean(RcdSet(0)) * 1
'autre syntaxe possible
' GetValueWithADO =Application.Clean(RcdSet.GetString(NumRows:=1))

'nettoyage
Set RcdSet = Nothing
Exit Function

Err:
GetValue = 0
Set RcdSet = Nothing
End Function


Eurêka,

Cela fonctionne (je m'était trompé dans la référence...), mais
bizarrement la valeur renvoyée est du texte (cadrée à gauche) alors
que si je la multiplie x 1, elle devient un nombre (cadrée à droite) !

Merci encore

Philippe








1 2