appeler une macro située dans un module

appeler une macro située dans un module - VB/VBA/VBS - Programmation

Marsh Posté le 08-06-2006 à 11:19:35    

Bonjour,
J'ai un problème dans une macro attachée à une feuille je veux faire appel à une macro situé dans un module (module 1)
Si je me contente de faire Call macro du module 1
ça ne marche pas. Faut il déclarer la macro autrement qu'avec Sub pour qu'elle puisse être appelée dans une autre feuille?
merci d'avance

Reply

Marsh Posté le 08-06-2006 à 11:19:35   

Reply

Marsh Posté le 08-06-2006 à 13:01:42    

Cela devrait marcher si la "macro" est déclarée en

Sub macro1(...)
ou Function macro1(...) As ..
ou Public Sub macro1(...)
ou Public Function macro1(..) As ...

Mais bien sûr, il ne faut pas écrire

Private Sub macro1(...)
ou Private Function macro1(...) As ...

Et je crois pas qu'il ne faut pas mettre des espaces dans les noms des functions ou des subroutines, mais peut-être que l'espace dans "macro 1" n'existe pas dans la véritable routine ou fonction.

Reply

Marsh Posté le 08-06-2006 à 13:40:27    

J'aimerais voir rayé des forums ce genre d'expression : « ça ne marche pas »
Car cela ne veut strictement rien dire.
Si une erreur apparaît, il FAUT nous dire laquelle (n° + libellé).
Si le résultat du traitement n'est pas celui attendu; il FAUT nous dire quel résultat est obtenu ET celui qui aurait dû être obtenu.
 
Désolé de prendre ton post comme « cible » elgobi, car c'est en fait une omission courante qui fait tatonner pour rien ceux qui veulent aider.  
Typiquement dans ton cas tu nous donnes un exemple déconnecté de la réalité « Call macro du module 1 » où olivthill en est réduit à se demander si ton nom de fonction est conforme au standard VBA/VB6. Alors que si tu nous donnes le vrai nom de fonction, on écarte d'emblée cet aspect du problème ou on le cible tout de suite plus précisemment.
L'exemple n'est évidemment pas bon puisque un nom de fonction avec des espaces ne peut pas être créé en VBA sans que la ligne devienne toute rouge (et j'espère que tu l'aurais vu) et inopérante, mais le principe reste le même.
 
Sinon, si les conseils d'olivthill ne suffisent pas, essaye de préfixer ta fonction par le nom du module, genre « module1.fonction() »
Désolé pour la digression

Reply

Marsh Posté le 08-06-2006 à 15:10:17    

Désolée, j'imagine que ce n'était pas très clair mais justement je n'ai pas de message d'erreur c'est juste que dans ma macro ça  ne passe pas par RemplissageYprim (cf. bout de code à suivre)  
 
Voilà la macro qui se trouve dans la feuille1

Code :
  1. Private Sub calculs_Click()
  2. Dim Rtmax As Double
  3. Dim Tab_Y_top() As Double
  4. Dim Tab_Rt() As Double
  5. Dim D As Integer
  6. Dim Cell_result As Range
  7. Dim Cell_Rt As Range
  8. Dim Nb As Integer 'nbre de points de calcul
  9. '''''''''''''''''''''''RESET (pour repartir d'une déflexion nulle )
  10.    
  11.     Cells(ShCalcul.Range("Rt_c" ).Row, ShCalcul.Range("Rt_c" ).Column).Value = 0 'remet l'effort latéral à 0
  12.     Cells(ShCalcul.Range("Ra_c" ).Row, ShCalcul.Range("Ra_c" ).Column).Value = 0 'remet l'effort axial à 0
  13.     Cells(ShCalcul.Range("M_c" ).Row, ShCalcul.Range("M_c" ).Column).Value = 0 'remet l'effort axial à 0
  14.     Counter = 0
  15.     Y_top = ShCalcul.Range("Y_top" ).Value
  16.     Y_top_prim = ShCalcul.Range("Y_top_prim" ).Value
  17.         Do Until Abs(Y_top - Y_top_prim) < 0.0001
  18.         Call Module1.RemplissageYprim
  19.         Counter = Counter + 1
  20.         If Counter = 10 Then
  21.         Exit Do
  22.         Else
  23.         End If
  24.     Loop
  25.    
  26.   End Sub


 
et voilà RemplissageYprim qui se trouve dans le module 1

Code :
  1. Sub RemplissageYprim()
  2. MsgBox "ok"
  3.   Application.Calculation = xlCalculationManual
  4.   For K = 48 To 652
  5.     X = Cells(K, 15).Value
  6.     Cells(K, 16) = X
  7.   Next K
  8.   Application.Calculation = xlCalculationAutomatic
  9.   End Sub


 
Comme j'ai besoin de RemplissageYprim dans plusieurs macros je l'ai mis dans le module1 mais même en essayant  

Code :
  1. Call Module1.RemplissageYprim


La macro calculs_clic ne va pas chercher RemplissageYprim

Reply

Marsh Posté le 08-06-2006 à 15:24:59    

Peux-tu mettre un point d'arrêt sur la ligne Call..., histoire de savoir si c'est l'appel qui débloque où si c'est ta boucle qui est mal ficelée ?

Reply

Marsh Posté le 08-06-2006 à 15:31:46    

La boucle marche quand je la lance avec outil=> macro=>RemplissageYprim=>executer
J'ai bien la boîte "ok" qui s'affiche donc ça doit être l'appel qui ne marche pas.
Ps: je vais paraître bête mais je ne sais pas ce que c'est un point d'arrêt...

Reply

Marsh Posté le 08-06-2006 à 15:37:12    

Le point d'arrêt : élément important de la partie debogage d'un programme qui ne fait pas ce qu'on veut !
Tu cliques sur la ligne de code que tu veux tester et tu fais F9 (ou menu debogage/Basculer point d'arrêt). Ça change la ligne de couleur et l'exécution de ton programme s'arrêtera sur la ligne marron (mais avant son exécution).
Avec les touches de fonction F8, SHIFT+F8 et F5 (ou la barre d'outils dédiée au debogage) tu contrôles alors l'exécution de ton programme ligne par ligne.
Tu peux ainsi scruter toutes tes variables (fenêtre d'exécution/fenêtre espions/fenêtre variables locales) à tout moment de l'execution du code VBA et repérer le problème.


Message édité par tegu le 08-06-2006 à 15:42:27
Reply

Marsh Posté le 08-06-2006 à 16:14:23    

bonjour,
le call ne peut pas marcher si et uniquement si
Y_top Et Y_top_prim = 0
Avec une condition Until Abs(x) < 0 c'est la seule explication possible.
 
Pour reformuler la réponse : ce call ne peut que marcher, il faut et il suffit qu'une des 2 valeurs (Y_top ou Y_top_prim) soit différente de 0
A+


Message édité par galopin01 le 08-06-2006 à 16:52:19

---------------
roger
Reply

Marsh Posté le 08-06-2006 à 18:58:57    

tu fais
Run "mamacro"  
Et c'est tout.

Reply

Marsh Posté le 08-06-2006 à 20:47:06    

http://perso.orange.fr/galopin01/images/zero.gif


---------------
roger
Reply

Sujets relatifs:

Leave a Replay

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