Appeler une procédure depuis une fonction !

Appeler une procédure depuis une fonction ! - VB/VBA/VBS - Programmation

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 !

Reply

Marsh Posté le 24-02-2010 à 11:07:03   

Reply

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 :(


Message édité par pepito_mi_corazon le 24-02-2010 à 13:27:17
Reply

Marsh Posté le 24-02-2010 à 15:29:37    

Bonjour
 

pepito_mi_corazon a écrit :

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...
 


 
Quel est le message d'erreur ?
La fonction entiere ressemble a quoi ?
 
Cordialement


---------------
Soyez malin, louez entre voisins !
Reply

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
 
 

Reply

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+

Reply

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 ?

Reply

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...

Reply

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........

Reply

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 !  :D  
Le MsgBox n'étant qu'une exception qui confirme la règle...  :lol:  
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 :
  1. Function CARRE i%)
  2. CARRE = i*i
  3. End Function


 
Appelée depuis une cellule Excel celle-ci plante inévitablement si tu essaies de lui faire appeler une Sub :

Code :
  1. Function CARRE(i%)
  2. test
  3. CARRE = i * i
  4. End Function
  5. Sub test()
  6. Range("A4" ) = 10
  7. End Sub


 
En revanche il est parfaitement possible d'appeler la fonction depuis une autre Sub

Code :
  1. Sub Autre()
  2. Range("A5" ) = CARRE(2)
  3. End Sub


... 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+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed