Lancement fonction par cellule Excel

Messages postés
58
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
14 janvier 2010
- - Dernière réponse : Thomeux
Messages postés
58
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
14 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.
Afficher la suite 

7 réponses

Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
0
Merci
Salut,

place ton code dans :


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Mets :
If Range("XX").Text = "tel ou tel valeur" then Call NomProcédure


End Sub

En gros, si dans tel cellule il y a une certaine valeur, ta procédure s'exécute

@ +

Mortalino
Messages postés
58
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
14 janvier 2010
0
Merci
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
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
0
Merci
Alors dans ce cas là, ne met que l'appel de procédure :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Call NomProcédure


End Sub

Dès qu'une valeur est rentrée dans ta feuille, ta procédure se lancera



Mortalino
Messages postés
58
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
14 janvier 2010
0
Merci
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**
'****************************
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
0
Merci
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

Mortalino
Messages postés
58
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
14 janvier 2010
0
Merci
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.

Merci par avance


@+


Thomas
Messages postés
58
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
14 janvier 2010
0
Merci
(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**
'****************************