bastien7506
-
28 nov. 2012 à 15:33
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018
-
29 nov. 2012 à 11:37
Bonjour,
J'ai créée une fonction sous VBA Excel qui me permet d'aller chercher une valeur souhaitée, dans une certaine plage de données. Je donne aussi la possibilité à l'utilisateur de renvoyer la valeur se trouvant dans une colonne décallée à gauche ou à droite (offset)
C'est un peut une variante de la rechercheV
Voici juste le début du code:
Public Function FetchThisValue(strValue As Variant, strWhichRange As Range, strWhichColonne As Variant) As Variant
Donc première variable je choisis ma valeur à chercher
Deuxieme variable je choisis dans quelle plage chercher
troisième variable je choisis si je veux ou pas, qu'on me renvoie un offset du resultat
Le but est que cette fonction puisse être utilisée depuis n'importe quelle feuille de mon classeur, et puisse aller chercher la valeur dans n'importe quelle autre feuille.
Mon problème est le suivant:
Dans la deuxième variable Range, la valeur renvoyée par
strWhichRange.address
est toujours du type $A$1 sans tenir compte du nom de la feuille.
or si j'execute ma fonction depuis la feuille 1 et que ma plage de donnée est dans la feuille 2, ce que j'aimerai avoir cest: Sheet2!$A$1
Comment est-ce que je peux faire pour récupérer cette notion de feuille, aléatoire, dans mon code?
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018219 29 nov. 2012 à 11:37
Bien.
Alors ===>> discussion à libérer (un clic sur te tag "réponse acceptée").
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018219 28 nov. 2012 à 15:59
Bonjour,
Essaye d'appeler les choses par leur nom. Ce que tu passes à ta fonctions sont ses paramètres. Utiliser la bonne terminologie est une chose quasi-indispensable et permet la meilleure compréhension partagée.
Comment passes-tu ton second paramètre ?
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Par exemple je suis dans mon classeur Excel, feuille 1 (Sheet1)
Dans la cellule A1 j'ai une valeur disons "Bénéfice"
Dans la Sheet2 de mon classeur j'ai tout un tas de données. Je veux avec ma fonction aller localiser dans cette Sheet2, dans la première colonne, le mot "Bénéfice" et renvoyer la valeur qui se trouve dans colonne directement à sa droite.
l'utilisateur va dans Sheet1 cellule A2 écrire "=FetchThisValue(A1,Sheet2!$A$1:$A$30,1)"
or VBA, dans mon code, dans ma variable strWhichRange il ne voit pas "Sheet2!$A$1:$A$30" mais "$A$1:$A$30"
Je n'ai pas réussi à faire comprendre à mon code que la où il devait chercher c'était la plage "$A$1:$A$30" de ma Sheet2, car du coup par defaut il reste dans Sheet1, la feuille active.
Désolé c'est pas évident à expliquer..
Vous n’avez pas trouvé la réponse que vous recherchez ?
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018219 28 nov. 2012 à 18:26
Voyons voyons !
Vite fait d'accuser VBA de maux qu'il n'a pas !
Quand on passe une plage à une fonction, Ce sont les données de la plage, qui sont passées. Et si la plage est sur une autre feuille, pareil !
Je ne veux (préfère pas) par contre pas critiquer tes "syntaxes"
Je vais me contenter de ce petit test et t'inviter à le faire sur un classeur neuf :
Sur feuil1 : un bouton de commande et ce code
Private Sub CommandButton1_Click()
toto = FetchThisValue(Sheets("Feuil1").Range("A1"), Sheets("Feuil2").Range("A1:A30"), 1)
MsgBox toto
End Sub
en public dans un module standard
Public Function FetchThisValue(strValue As Variant, strWhichRange As Range, strWhichColonne As Variant) As Variant
FetchThisValue = strWhichRange.Cells(1, 1)
End Function
censé te retourner la valeur de la cellule A1 de Feuil2. Ecris-y donc "vu ?"
Retourne en feuille 1 et clique sur le bouton ===>>
Il ne se trompe pas de feuille, hein !!
Alors ? ===>> réfléchis, maintenant.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018219 28 nov. 2012 à 18:35
Allez, va ...
On va te l'écrire, la formule à mettre dans ta cellule :
=FetchThisValue(Feuil1!A1;Feuil2!$A$1:$A$30;1)
Te fait ce que faisait le bouton de commande, sans se tromper, hein ...
Ce n'est donc pas du tout VBA, le fautif, mais ... toi
Attention : moi, je suis en version française, d'où les point-virgule.
Si tu es en version anglaise ===>> remplace-les par des points, hein !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018219 28 nov. 2012 à 18:59
Ah oui ...
Je vois maintenant de quoi tu voulais parler.
Ben ... Une plage a une propriété WorkSheet.
Elle est la Feuille à laquelle appartient la plage concernée ...
Dans le code de ta fonction, donc :
strWhichRange.Worksheet.Name
te retournerait précisément Sheet2
A toi de jouer, donc
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ