web-dev-qa-db-fra.com

excel VBA exécuter macro automatiquement chaque fois qu'une cellule est modifiée

Existe-t-il un moyen simple de demander à Excel d’exécuter automatiquement une macro chaque fois qu’une cellule est modifiée?

La cellule en question serait en Worksheet("BigBoard").Range("D2")

Ce que je pensais être une simple enquête Google s’avère plus compliqué - chaque échantillon impliqué intersecte (qu’il s’agisse de celui-ci), le formatage des couleurs ou tout autre élément qui semble hors de propos.

19
kamelkid2

Oui, cela est possible en utilisant des événements de feuille de calcul:

Dans Visual Basic Editor, ouvrez la feuille de calcul qui vous intéresse (par exemple, "BigBoard") en double-cliquant sur le nom de la feuille de travail dans l'arborescence en haut à gauche. Placez le code suivant dans le module:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Me.Range("D2")) Is Nothing Then Exit Sub
        Application.EnableEvents = False 'to prevent endless loop
        On Error Goto Finalize 'to re-enable the events      
        MsgBox "You changed THE CELL!"
    End If
Finalize:        
    Application.EnableEvents = True
End Sub
37
Peter Albert

Une autre option est

Private Sub Worksheet_Change(ByVal Target As Range)
    IF Target.Address = "$D$2" Then
        MsgBox("Cell D2 Has Changed.")
    End If
End Sub

Je crois que cela utilise moins de ressources que Intersect, ce qui sera utile si votre feuille de calcul change beaucoup.

17
user2140261

Dans une tentative de trouver un moyen de transformer la cellule cible pour la méthode d'intersection en un tableau de table de noms, je suis tombé sur un moyen simple d'exécuter quelque chose lorsque TOUTE cellule ou ensemble de cellules d'une feuille particulière change. Ce code est également placé dans le module de feuille de calcul:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 0 Then
'mycode here
end if
end sub
4
Zediiiii

Pour tenter de repérer un changement quelque part dans une colonne particulière (ici dans "W", c'est-à-dire "23"), j'ai modifié la réponse de Peter Alberts à:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Target.Column = 23 Then Exit Sub
    Application.EnableEvents = False             'to prevent endless loop
    On Error GoTo Finalize                       'to re-enable the events
    MsgBox "You changed a cell in column W, row " & Target.Row
    MsgBox "You changed it to: " & Target.Value
Finalize:
    Application.EnableEvents = True
End Sub
0
Bendaua