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
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)
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
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)
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) !
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)
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
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
'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)
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
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
'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)
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) !
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
'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)
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
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
'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)
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
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
'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)
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) !
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
'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)
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) !