Appeler routine/fonction depuis le tableur [Résolu/Fermé]

Signaler
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
-
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
-
Bonjour tout le monde,

J'ai créé un petit programme, et j'aimerai pouvoir lancer la routine global (une sorte de main) depuis le tableur excel lui même.
Mais la macro n'apparaît (alt+F8) que si la routine ne prend aucun argument.

Hors justement, j'aimerai que l'utilisateur puisse choisir de lancer cette routine sur la plage de donnée qu'il veut.

en somme, je voudrais pouvoir rentrer dans excel
=ma_procedure(A1:A12) (par exemple)
et que le programme correspondant se lance avec cet argument A1:A12

La procédure en question fonctionne très bien si je lui rentre directement dans le code la plage à utiliser, mais c'est pas pratique de demander à quelqu'un d'ouvrir la bonne page VBA à chaque fois qu'il veut changer sa sélection.

Voilà, j'espère que c'est à peu près clair, et merci d'avance à tous ceux qui essayeront de m'aider

PS : si je pouvais rentrer cette plage de cellule directement depuis une boite de dialogue ça serait encore mieux, mais j'ai vais faire par étape ^^





ezor

10 réponses

Messages postés
666
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
75
Bonjour,

Essayez de rentrez une instance
range
à votre procédure.
Si vous utilisez votre procédure sur une cellule Excel,
=ma_procedure(A1:A12)
consiste à entrer l'argument
sheet.range("A1:A12")
. Tenez en compte dans le code de votre procédure.
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
4
'abord merci de ton aide.
Par contre, je ne sais pas si j'ai bien compris la réponse. Mon code actuelle ressemble à ça
Sub ma_procedure(donnees As Range)

Dim mon_tableau() As Double

....

mon_tableau = remplir_tab(donnees)

....

End Sub

où remplir_tab est une fonction (function) qui prend un Range en argument.

Quelle est la différence avec ce que vous me proposez? je comprend pas bien

(j'ai oublié de dire que je ne me suis mis au vba qu'au début du mois, donc même pas 20 jours d'expérience, ceci expliquant surement cela)

ezor
Messages postés
666
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
75
Bonjour,

L'utilisation que vous faites de
ma_procédure
nécessite qu'elle soit une fonction, pas une procédure. Si vous voulez connaitre la différence regardez ce lien ...

=ma_procedure(A1:A12)
signifie que ta cellule contiendra le résultat de votre fonction
ma_procedure
. Or, votre fonction est une procédure qui ne retourne rien. Ainsi, ta cellule ne contiendra pas de résultat.

Ta procédure peut être utilisée avec un bouton de lancement sur la feuille, mais n'a pas de sens à être utilisée dans une cellule. Pour qu'elle fonctionne, vous devez l'utilisez comme suit :

Function ma_procedure(donnees As Range)
Dim mon_tableau() As Double
....
ma_procedure = remplir_tab(donnees)
End Function


ça peut ne pas avoir de sens dans votre programme si remplir_tab ne retourne pas de valeur scalaire telle qu'un nombre ou une chaîne de caractères. Mais la syntaxe
=ma_procedure(A1:A12)
suppose que vous utilisez une fonction qui retourne quelque chose.
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
4
j'ai déjà essayé avec une routine et une fonction.

Je comprend le problème de mettre =fonction(...) dans une cellule, qui ne reverra qu'une valeur, mais c'est vrai que je n'y avais pas pensé

En réalité, le vrai problème est que dès que mon programme, que ce soit une fonction ou une routine, demande en entrée des arguments, je ne peux pas la lancer autrement que depuis l'éditeur vba.
Autrement dit, je ne peux pas lui associer un bouton (car à aucun moment je ne rentrerai l'argument nécessaire) car elle n'apparaît pas dans le menu avec les autres routine déjà présente

Ce que je souhaite faire c'est donner la possibilité à tout utilisateur de :
-----rentrer ses données dans la ligne qu'il veut (mettons entre A1 et A12 comme plus haut)
-----cliquer sur un bouton (ou autre, peu importe)
-----sélectionner l'endroit où il a rentrée ses données (A1:A12)
-----le programme se lance en utilisant les valeurs contenues dans cette ligne pour


Messages postés
666
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
75
Si vous avez la possibilité de m'envoyer un exemple sur lequel est expliqué ce que vous cherchez à faire et ce que vous voulez obtenir, ça aidera à mieux comprendre la problématique. Parfois, il faut changer la logique du programme pour qu'il tienne.
Le fait de ne pas voir la procédure signifie qu'elle n'est pas définie en public dans le bon module. Vous devez définir cette procédure dans la feuille de code qui correspond à la feuille qui en fait usage, sinon, en public dans un module :
Public Function ma_fonction(...)
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
4
Je ne sais pas comment vous envoyer ça.
La routine est en public, dans le code de la feuille correspondante, et dans un module (sous un autre nom, pour tester les deux)

Non, le vrai problème c'est qu'elle prend en entrée un argument.
Si je fais la même routine sans argument (en remplaçant "donnees" par un
Range("A1:A12")
directement dans le code, tout se passe bien, j'y ai accès depuis la feuille excel en faisant Alt+F8, je peux mettre un bouton etc....

Je veux savoir si on peut lancer, depuis la feuille excel, une routine qui demande un argument en entrée.

C'est vraiment la chronologie que j'ai indiqué dans mon message précédent en fait
Messages postés
666
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
75
Le lien cijoint permet d'attacher des fichiers.
Messages postés
9578
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
12 octobre 2020
1 921
Bonjour à tous

Je ne sais pas si j'ai bien compris
Un exemple ou les macros s'exécutent sur la plage selectionnée au moment du lancement
https://www.cjoint.com/?3Hsog21WhSW

Cdlmt
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
4
Bonjour ccm81,

Ce n'est pas exactement ça que je cherche, mais merci de ton aide.

Je cherche en réalité à pouvoir lancer ma routine quand je le souhaite, sur la plage de donnée (qui est l'argument que reçoit la routine) que je souhaite

Exemple :
Supposons que ma routine remplissent un tableau de double avec les valeurs qui sont entrées sur une feuille excel
Je vais donc entrer mes données n'importe où sur la feuille excel (en ligne quand même^^), disons entre B1 et B4
et je décide de lancer ma routine sur la plage B1:B4

Je voudrais donc pouvoir
---cliquer sur un bouton
---entrer (B1:B4)
====>la routine se lance en traitant les données contenues dans B1:B4

Voilà, j'espère que c'est plus clair comme explication comme ça.
Encore merci pour ton aide,

ezor
Messages postés
9578
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
12 octobre 2020
1 921
Quelque chose comme ça? Feuille 2
https://www.cjoint.com/?3HtnPlbeeUo

Cdlmnt
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
4
oui, c'est exactement ça! merci beaucoup
je vais essayer de regarder le code de près pour comprend comment ça marche.

Est-ce qu'il y a un moyen de rentrer la plage en la sélectionnant à la souris (un peu comme quand on utilise une fonction excel)? si non c'est pas grave, la boite de dialogue c'est déjà très bien

ezor
Messages postés
9578
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
12 octobre 2020
1 921
Est-ce qu'il y a un moyen de rentrer la plage en la sélectionnant à la souris (un peu comme quand on utilise une fonction excel)
c'est ce que je t'ai proposé en feuille 1
Tu sélectionnes ta plage puis Ctrl+r pour lancer la macro sur la plage sélectionnée et tu n'as plus besoin de bouton!
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
4
ah d'accord, j'avais pas compris l'idée de la feuille 1. Du coup, problème résolu. encore merci.