Appeler une procédure depuis une fonction ! - VB/VBA/VBS - Programmation
Marsh Posté le 24-02-2010 à 13:27:01
Un petit UP ^^
C'est surement tout bête mais je vois pas.... Et j'ai cherché sur google rien non plus
Marsh Posté le 24-02-2010 à 15:29:37
Bonjour
pepito_mi_corazon a écrit : Bonjour à tous, |
Quel est le message d'erreur ?
La fonction entiere ressemble a quoi ?
Cordialement
Marsh Posté le 24-02-2010 à 16:31:16
A la base la fonction est plus complexe, mais j'en ai créé une 2ème plus simple, qui est celle que j'ai copié plus haut, afin de bien mettre en évidence le problème...
J'ai donc juste écrit ceci dans un module :
Public Sub remplissage()
ActiveWorkbook.Worksheets("Feuil1" ).Range("A5" ).Value = 200000
End Sub
Public Function test(t As Double) As Double
Call remplissage
test = t
End Function
Je me mets ensuite dans une cellule excel, je tape :test(10), et je devrai avoir cellule concernée=10 et cellule A5=200000....mais j'ai un #VALEUR
Aucun message d'erreur...
En "étape par étape", tout se déroule bien jusqu'à ce que :
ActiveWorkbook.Worksheets("Feuil1" ).Range("A5" ).Value = 200000
soit surligné en jaune, à la suite de quoi la fenêtre "Variables locales" se vide, et plus rien ne se passe... sans aucun message d'erreur
Marsh Posté le 24-02-2010 à 20:31:20
bonjour,
Les fonctions ne sont pas faites pour appeler des Sub ni faire quoi que ce soit mais pour renvoyer une valeur...
A+
Marsh Posté le 25-02-2010 à 01:05:02
Donc si on veut remplir une feuille Excel depuis VBA, c'est forcément à travers une procédure SUB ?
En fait je fais ça car les cellules Excel que je souhaiterais remplir depuis VBA vont me servir de RANGE pour une fonction suivante qui prend seulement des range en paramètres... A moins que l'on puisse créer directement des tableau Range intrinsèquement à VBA ?
Marsh Posté le 25-02-2010 à 10:07:02
D'ailleurs galoping01 je suis pas d'accord avec toi, car si ma procédure est une MSGBOX, ça marche, donc une fonction peut appeler un SUB...le problème vient bien de l'appel Worksheets.range...
Marsh Posté le 25-02-2010 à 14:34:36
Quelqu'un peut me dire comme on obtient l'indice de la dernière colonne d'un tableau VBA ?
Impossible avec UBound(tableau,2) par exemple car j'ai un tableau intrinsèque à VBA et pas un tableau provenant de Excel.....
Ca serait tellement plus simple si toutes les fonctions permettant d'agir sur les tableaux excel marchaient également pour les tableaux VBA........
Marsh Posté le 26-02-2010 à 08:07:47
bonjour,
Tu n'es peut-être pas d'accord mais c'est comme ça quand même !
Le MsgBox n'étant qu'une exception qui confirme la règle...
D'ailleurs tu n'as pas besoin d'une Sub pour envoyer le MsgBox
A noter que ce que je dis est vrai pour les Function appelée par une formule Excel. Ce qui était explicite dans ta question.
Il n'en est pas de même pour une Function qui serait appelé par une Sub...
Si l'on prend l'exemple de
Code :
|
Appelée depuis une cellule Excel celle-ci plante inévitablement si tu essaies de lui faire appeler une Sub :
Code :
|
En revanche il est parfaitement possible d'appeler la fonction depuis une autre Sub
Code :
|
... mais elle ne fonctionnera pas en tant que fonction dans une cellule Excel !
Pour la deuxième question, je ne comprend pas : reformuler la question explicitement !
A+
Marsh Posté le 24-02-2010 à 11:07:03
Bonjour à tous,
Je débute en VBA. J'ai créé une fonction VBA qui plante au moment où j'essaie de remplir une cellule Excel, avec la commande exemple ActiveWorkbook.Worksheets("Feuil1" ).Range("A5" ).Value = 200000...
J'ai donc essayé de contourner le problème en appelant une procédure, et je me suis rendu compte qu'un programme tout basique tel que celui-ci ne marche pas :
Public Sub remplissage()
ActiveWorkbook.Worksheets("Feuil1" ).Range("A5" ).Value = 200000
End Sub
Public Function test(t As Double) As Double
Call remplissage
test = t
End Function
Ma worksheets se nomme bien "Feuil1", et lorque je contrôle mon programme pas à pas, la fonction appelle bien la procédure remplissage, mais dès qu'elle passe la ligne : ActiveWorkbook.Worksheets("Feuil1" ).Range("A5" ).Value = 200000, tout s'arrête sans message d'erreur.... D'ou vient l'erreur ?
Merci !