[VBA EXCEL] Macro qui s'execute automatiqemnt

Fermé
Boon - 27 juil. 2007 à 15:45
 Boon - 28 juil. 2007 à 20:15
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!!
A voir également:

12 réponses

Utilisateur anonyme
27 juil. 2007 à 21:20
------------------------------------
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
2
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
---------------------------
1
Utilisateur anonyme
27 juil. 2007 à 16:02
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
0
Merci!

Je vais essayer de ce pas!
0

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?
0
Utilisateur anonyme
27 juil. 2007 à 18:47
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
0
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
0
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!!!
0
Utilisateur anonyme
28 juil. 2007 à 16:33
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
0
Merci encore!
Je vais essayer ca!
0
Utilisateur anonyme
28 juil. 2007 à 19:51
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
0
Merci!!!!!

Tout marche parfaitement!!

Merci beaucoup!!
0