[VBA EXCEL] Macro qui s'execute automatiqemnt
Boon
-
Boon -
Boon -
Bonjour!
Je voudrais savoir s'il est possible de réaliser une macro qui :
1) S'ouvre en même temps que la feuille excel,
2) Se lance automatiquement lorsque l'utilisateur change la valeur d'une cellule précise.
Exemple (très simple, dans ma macro c'est pas ca!):
A5 = A3 + A6
Si je change la formule de A6 alors automatiquement la valeur de A5 aussi change.
Merci!!
Je voudrais savoir s'il est possible de réaliser une macro qui :
1) S'ouvre en même temps que la feuille excel,
2) Se lance automatiquement lorsque l'utilisateur change la valeur d'une cellule précise.
Exemple (très simple, dans ma macro c'est pas ca!):
A5 = A3 + A6
Si je change la formule de A6 alors automatiquement la valeur de A5 aussi change.
Merci!!
Configuration: Windows XP Firefox 2.0.0.5
12 réponses
-
------------------------------------
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Cells(25, 1).Value = Target.Value
End Sub
-------------------------------------
La feuille Sh ainsi que Target sont passé en paramètres
Sh est la feuille qui détecte le changement
Target est la cellule pointé par le changement ( la sélection )
Ce que tu modifie t'es renvoyé à la cellule A25 selon le format d'affichage qui lui est propre.
disons pour effectuer une demo :
Postulat : Place une valeur numérique en A1 pour 3 feuille :
Option Explicit Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Select Case (Sh.Name) Case "Feuil1": Routine1 Target Case "Feuil2": Routine2 Target Case "Feuil3": Routine3 Target End Select End Sub ' Sub Routine1(ByVal Cible As Range) Cells(5, 1).Value = "Valeur = " & Cible.Value End Sub ' Sub Routine2(ByVal Cible As Range) Cells(5, 1).Value = "Adresse = " & Cible.Address End Sub ' Sub Routine3(ByVal Cible As Range) Cells(5, 1).Value = "Formule = " & Cible.Formula End Sub '
Lupin -
Re!
Je viens d'essayer de mettre les Application.EnableEvents , mais je peux maintenant seulement changer la cellule B16: Si je change la cellule B15, elle reste comme elle est (c'est à dire comme calculée à partir de la cellule 16)
Voilà le code que j'ai mis, en même temps, je suis pas du tout sûr d'avoir bien su utilisé les Application.EnableEvents = True:
----------------
Private Sub Worksheet_Change(ByVal Target As Range)
Dim a As Double
Application.EnableEvents = False
B16 = Target.Address
a = 33
Do While Cells(a, 2).Value <> Cells(16, 2).Value
a = a + 1
Loop
Range("B15").Value = Range("A" & a).Value
B15 = Target.Address
a = 33
Do While Cells(a, 1).Value <> Cells(15, 2).Value
a = a + 1
Loop
Range("B16").Value = Range("B" & a).Value
Application.EnableEvents = True
End Sub
--------------------------- -
Bonjour,
2 possibilités !
soit :
vous declarez une fonction personnalisé !Public Function MaFonction (ByVal Cible As Range) As Variant Application.Volatile MaFonction = Cible.Value + 10 End Function
soit :
vous utlisé l'évènement derrière la feuille :Private Sub Worksheet_SelectionChange(ByVal Target As Range) Range("A2").value = Target.Value + 10 End Sub
Lupin -
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Re Salut!
J'ai mis ce code dans "this Workbook" , mais rien ne se passe!
-----------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
Cells(20, 2) = Target.Address
Range("A25").Value = Target.Value * 10
End Sub
----------------------------
Normalement, avec un code comme ca, la cellule A25 devrait m'afficher 10 fois la cellule B20 quand je change sa valeur, non?
Qu'est ce que je n'ai pas compris? -
re:
en fait, au lieu de placer ce code derrière une feuille, celui-ci a été placé dans le module [ThisWorkbook].
ici, cela ne s'adresse pas à une simple feuille mais à tous le classeur ( toutes les feuilles ), il faut donc
un paramàtre supplémentaire. Les évènements dans le module [ThisWorkbook] sont plutôt :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) ' Code ' ... End Sub ' Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) ' Code '... End Sub
ou la feuille est désigné par [ Sh As Object ].
Lupin -
Arf!
Je débute dans la programmation donc j'ai pas tout capté, dsl!
Voici le code que je viens de rentrer (j'ai remplacé le Private Sub mais je suis pas sur que c'est ca que j'aurai du faire...)
------------------------------------
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Cells(25, 1).Value = Target.Value
End Sub
-------------------------------------
Et maintenant, la cellule A25 me donne...l'heure!!!!!
J'y comprends plus rien!
Dany -
Merci, j'ai enfin compris comment ca marchait!
Mais je me rend compte que je suis confronté à un autre problème:
En fait, je voudrais avoir plusieurs target, et dans mon cas, elles sont dépendantes. Je m'explique:
Si je change B15, je veux que B16 change, mais
si je change B16, je veux que B15 change aussi.
J'ai donc mis ce code: (ne pas se préocupper des boucles, c'est rien du tout)
------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
Dim a As Double
B15 = Target.Address
a = 33
Do While Cells(a, 1).Value <> Cells(15, 2).Value
a = a + 1
Loop
Range("B16").Value = Range("B" & a).Value
B16 = Target.Address
a = 33
Do While Cells(a, 2).Value <> Cells(16, 2).Value
a = a + 1
Loop
Range("B15").Value = Range("A" & a).Value
End Sub
--------------------------------------------------
Mais quand j'execute la macro, mon programme tourne en boucle, car si je change B15, ca change B16 qui change B15 qui change B16, etc...
Comment faire pour contourner ce problème???
Merci encore!!! -
re :
bonne nouvelle, je sais c'est pas toujours évident ! Il m'arrive de chercher aussi des heures !
bon pour le nouveau problème, si on s'en refère à la théorie, les changements que tu dois
détecter doivent provenir de l'extérieur, ceux de l'intérieur étant contrôlé par la routine
elle-même.
Par conséquent, je dirais qu'il ne te suffit que de désactivé les évènements durant le cycle de la routine.Private Sub Worksheet_Change(ByVal Target As Range) Dim a As Double Application.EnableEvents = False ' Code ... ' ... Application.EnableEvents = True End Sub '
Lupin -
-
re salut,
2 choses qui m'apparaissent !
Si tu arrête la macro en cours d'utilisation et que l'instruction de réactivation ne passe
pas, il te faut réactiver les évènements :
Sub ActiveEvenements() Application.EnableEvents = True End Sub '
et pour bien cibler la cellule et le travail a effectuer :
Private Sub Worksheet_Change(ByVal Target As Range) Dim Intersection As Range Set Intersection = Application.Intersect(Target, Range("B15")) If Intersection Is Nothing Then MsgBox "Pas dans la plage de B15" Set Intersection = Application.Intersect(Target, Range("B16")) If Intersection Is Nothing Then MsgBox "Pas dans la plage de B16" Else ' Ici le code pour B16 ' ... End If Else ' Ici le code pour B15 ' ... End If End Sub '
Lupin -