Thomeux
Messages postés58Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention14 janvier 2010
-
27 mars 2006 à 12:06
Thomeux
Messages postés58Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention14 janvier 2010
-
29 mars 2006 à 10:55
Bonjour,
J'ai créé une sub dans une macro Excel. Cette sub va chercher des valeurs dans certaines cellules Excel, puis les traitent et affecte le résultat à d'autres cellules.
Je voudrais savoir comment faire pour lance cette sub lorsque la valeur d'une cellule Excel change et ne plus être obligé de la lancer manuellement.
D'avance merci.
Thomeux
Messages postés58Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention14 janvier 2010 27 mars 2006 à 12:45
Bonjour Mortalino,
Je me suis sans doute mal exprimé dans ma question. D'après ton commentaire, la sub ne s'execute que pour une certaine valeur de la cellule. Or dans mon cas, la sub doit s'executer des que la valeur de la cellule change. De plus, plusieurs cellule peuvent être à l'origine du lancement de la sub.
Merci tout de même.
@+
Thomas
Thomeux
Messages postés58Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention14 janvier 2010 27 mars 2006 à 14:06
Bonjour Mortalino,
J'ai essayé ce que tu m'as dis, mais cela ne fonctionne pas.
Je pense que l'erreur provient des variables placées en paramètre à "Private Sub Workbook_SheetChange". L'appel doit pouvoir se faire à partir de n'importe quelle feuille de mon classeur.
Je te remercie par avance.
@+
Thomas
PS:J'ai joint à ce mail une partie de mon code.
'***********************************
'Définition nouveau type de Varaible
'Créer par MERRE Thomas le 27/03/06
'Nom du type: Mon Type
'Variable: Min, Max, Xmax, Xmin
'***********************************
Private Type MonType
Min As Double
Max As Double
Xmax As Double
Xmin As Double
End Type
'***********************************
'*Fin de définition du nouveau type*
'***********************************
Private Sub Workbook_SheetChange(ByVal Sh As Object)
Call involute_vis_sans_fin
End Sub
'***********************************
'*******Fonction principale*********
'Créer par MERRE Thomas le 27/03/06
'Nom: involute_vis_sans_fin
'Variables paramètres: aucune
'Variables retournées: aucune
'Fonction: Ordonnancement des
' différentes tâches
'***********************************
Sub involute_vis_sans_fin()
'****************************
'Déclaration des variables
'****************************
Dim pi As Double
pi = 4 * Atn(1)
'****************************
' Fin de déclaration Variable
'****************************
'Sélection des tâches à effectuer
'en fonction de la feuille Excel
'active
Select Case ActiveSheet.Name
Case "Can5480_1966", "Can5480_1974", "Can5480_1986"
'Calcul et affichage des Angles par appel de la fonction "Angle"
Range("G35") = angle(Range("G34")) * 180 / pi
Range("G42") = angle(Range("G41")) * 180 / pi
Case "Can5482_1973"
'Déclaration variable a pour appel fonction "cotepige"
Dim a As MonType
'Calcul et affichage des Angles par appel de la fonction "Angle"
Range("H19") = angle(Range("H18")) * 180 / pi
Range("h23") = angle(Range("h22")) * 180 / pi
'Calcul de cotes sur pige par appel de la fonction "cotepige"
a = cotepige(Range("D8"), Range("C9"), Range("J43"), Range("C25"), Range("J44"), Range("J41"), Range("J42"), "Exterieur")
'affichage des cotes sur pige
Range("J47") = a.Max
Range("J48") = a.Min
Range("J45") = a.Xmax
Range("J46") = a.Xmin
'Calcul de cotes sur pige par appel de la fonction "cotepige"
a = cotepige(Range("D8"), Range("C9"), Range("J43"), Range("C46"), Range("M44"), Range("M41"), Range("M42"), "Interieur")
'affichage des cotes sur pige
Range("M47") = a.Max
Range("M48") = a.Min
Range("M45") = a.Xmax
Range("M46") = a.Xmin
Case "Can22-141"
'Calcul et affichage des Angles par appel de la fonction "Angle"
Range("L40") = angle(Range("J40")) * 180 / pi
Range("L65") = angle(Range("J65")) * 180 / pi
Case Else
'sortir
GoTo H
End Select
H:
End Sub
'****************************
'fin de fonction principale**
'****************************
Vous n’avez pas trouvé la réponse que vous recherchez ?
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 28 mars 2006 à 08:28
Salut Thomeux,
Ben là je viens de tester :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
(attention, il n'apparait pas dans ton code)
Call NomProcédure
End Sub
De plus, ce code ne doit pas être placé dans le Module mais dans l'objet workbook (sous tes feuilles dans le projet VBA, là où il y a Open)
Ensuite j'ai créé un Module avec une Sub NomProcédure
et dedans j'ai mis MsgBox "Test" :
A chaque fois que je rentre une valeur dans n'importe quel cellules d'une feuille, mon message s'affiche bien.
Donc voit cette histoire de ByVal Target As Range, qui devrait apparaitre automatiquement lorsque tu le selectionnes dans la liste, ta procédure n'étant pas "Private", ça devrait fonctionner
Thomeux
Messages postés58Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention14 janvier 2010 29 mars 2006 à 10:36
Bonjour Mortalino,
J'ai effectué les modification que tu as suggérés.
Toutefois j'ai encore un problème.
Si j'appelle une sub qui affiche un message test (msgbox"test"), ca fonctionne dèsque je change une valeur, le message s'affiche. mais lorsque j'appelle ma sub, le message d'erreur 28(pile insuffisante) apparait.
Ce message d'erreur m'étonne car si j'appelle ma sub par execusion normale, elle fonctionne correctement.
Le programme rentre bien dans la sub car si j'affiche un message "test " au début de ma sub, le message apparait, mais ne s'efface pas même quand je clique sur "ok" ou "fermer", Excel est planté (obligation de killer l'application).
Pourtant si je laisse le message dans la sub, mais que j'execute la sub normalement, tout ce pas bien encore une fois.
En résumé: ma sub fonctionne bien quand je la lance normalement
("executer sub"), mais plante quand je la lance par changement de valeur
d'une cellule.
Thomeux
Messages postés58Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention14 janvier 2010 29 mars 2006 à 10:55
(Re)bonjour Mortalino,
J'ai essauyé de voir où se situait le problème dans l'execusion de ma sub, donc j'ai mis des affichages numérotés (test1, test2,...) pour localiser le bug.
En fait Excel plante car le programme rentre dans une sorte de boucle infinieµ.
Je m'explique:
Il affiche test 1, test2, test3 , test4 en boucle. Le message "test5" n'apparait pas . il me semble donc que le problème se situe au niveau de l'appel de ma fonction "Angle".
C'est donc le phénomène de boucle infinie me saturait ma pile.
La question est donc pouquoi une boucle infinie quand la sub est appellée d'une certaine façon(changement de valeur d'une cellule) et pas de boucle infinie lorsque la sub est appellée de façon traditionnelle("executer sub")
Merci d'avance
Thomas
PS:Je joint une partie de mon code pour localiser les message test
Sub main()
MsgBox "test1"
'****************************
'Déclaration des variables
'****************************
Dim pi As Double
pi = 4 * Atn(1)
MsgBox "test2"
'****************************
' Fin de déclaration Variable
'****************************
'Sélection des tâches à effectuer
'en fonction de la feuille Excel
'active
Select Case ActiveSheet.Name
Case "Can5480_1966", "Can5480_1974", "Can5480_1986"
'Calcul et affichage des Angles par appel de la fonction "Angle"
Range("G35") = angle(Range("G34")) * 180 / pi
Range("G42") = angle(Range("G41")) * 180 / pi
Case "Can5482_1973"
MsgBox "test3"
'Déclaration variable a pour appel fonction "cotepige"
Dim a As MonType
MsgBox "test4"
'Calcul et affichage des Angles par appel de la fonction "Angle"
Range("H19") = angle(Range("H18")) * 180 / pi
MsgBox "test5"
Range("h23") = angle(Range("h22")) * 180 / pi
MsgBox "test6"
'Calcul de cotes sur pige par appel de la fonction "cotepige"
a = cotepige(Range("D8"), Range("C9"), Range("J43"), Range("C25"), Range("J44"), Range("J41"), Range("J42"), "Exterieur")
'affichage des cotes sur pige
MsgBox "test7"
Range("J47") = a.Max
Range("J48") = a.Min
Range("J45") = a.Xmax
Range("J46") = a.Xmin
'Calcul de cotes sur pige par appel de la fonction "cotepige"
a = cotepige(Range("D8"), Range("C9"), Range("J43"), Range("C46"), Range("M44"), Range("M41"), Range("M42"), "Interieur")
'affichage des cotes sur pige
Range("M47") = a.Max
Range("M48") = a.Min
Range("M45") = a.Xmax
Range("M46") = a.Xmin
Case "Can22-141"
'Calcul et affichage des Angles par appel de la fonction "Angle"
Range("L40") = angle(Range("J40")) * 180 / pi
Range("L65") = angle(Range("J65")) * 180 / pi
Case Else
'sortir
GoTo H
End Select
H:
MsgBox "test"
End Sub
'****************************
'fin de fonction principale**
'****************************