Appeler routine/fonction depuis le tableur

Résolu/Fermé
ezor
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
- Modifié par ezor le 18/08/2014 à 11:23
ezor
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
- 20 août 2014 à 09:51
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

commentcamarcheeay
Messages postés
666
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
18 août 2014 à 10:40
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.
0
ezor
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
11
Modifié par ezor le 18/08/2014 à 11:02
'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
0
commentcamarcheeay
Messages postés
666
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
18 août 2014 à 11:17
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.
0
ezor
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
11
18 août 2014 à 11:41
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


0
commentcamarcheeay
Messages postés
666
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
18 août 2014 à 11:58
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(...)
0
ezor
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
11
Modifié par ezor le 18/08/2014 à 13:55
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
0
commentcamarcheeay
Messages postés
666
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
18 août 2014 à 15:17
Le lien cijoint permet d'attacher des fichiers.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ccm81
Messages postés
10356
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
26 juin 2022
2 298
18 août 2014 à 14:08
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
0
ezor
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
11
Modifié par ezor le 19/08/2014 à 13:19
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
0
ccm81
Messages postés
10356
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
26 juin 2022
2 298
19 août 2014 à 13:41
Quelque chose comme ça? Feuille 2
https://www.cjoint.com/?3HtnPlbeeUo

Cdlmnt
0
ezor
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
11
Modifié par ezor le 19/08/2014 à 15:29
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
0
ccm81
Messages postés
10356
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
26 juin 2022
2 298
Modifié par ccm81 le 19/08/2014 à 17:27
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!
0
ezor
Messages postés
176
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
27 octobre 2016
11
20 août 2014 à 09:51
ah d'accord, j'avais pas compris l'idée de la feuille 1. Du coup, problème résolu. encore merci.

0