web-dev-qa-db-fra.com

L'événement de changement de feuille de calcul Excel ne se déclenche que si la cellule est modifiée manuellement

J'utilise le code suivant qui fonctionne très bien. Toutefois, les modifications de la cellule devant déclencher cet événement sont effectuées à l'aide d'une formule et non d'une entrée dans la cellule. Si je tape l'entrée, tout fonctionne. Mais si j'utilise une formule pour récupérer les données d'une autre feuille de calcul, ce n'est pas le cas. Par exemple, les cellules dans AD ont des formules telles que =HR!P27.

Qu'est-ce que je rate?

Code:

    Private Sub Worksheet_Change(ByVal Target As Range)
    'Update 20140722
    Dim WorkRng As Range
    Dim Rng As Range
    Dim xOffsetColumn As Integer
    Set WorkRng = Intersect(Application.ActiveSheet.Range("AD:AD"), Target)
    xOffsetColumn = -1
    If Not WorkRng Is Nothing Then
        Application.EnableEvents = False
        For Each Rng In WorkRng
           If Not VBA.IsEmpty(Rng.Value) Then
              Rng.Offset(0, xOffsetColumn).Value = Now
              Rng.Offset(0, xOffsetColumn).NumberFormat = "dd-mm-yyyy, hh:mm:ss"
           Else
             Rng.Offset(0, xOffsetColumn).ClearContents
           End If
        Next
        Application.EnableEvents = True
    End If
    End Sub
4
Terrib

Une formule qui renvoie un résultat différent ne constitue pas un changement de cellule. Selon la description de l'événement Worksheet_Change , il:

Se produit lorsque les cellules de la feuille de calcul sont modifiées par l'utilisateur ou par un lien externe.

Ce comportement est logique lorsque vous constatez que le contenu de la cellule ne change pas réellement. Par exemple, la cellule contenait =HR!P27 avant et après que la formule a renvoyé un résultat différent. Seul le résultat de la formule a changé. Comme cette affaire l’affirme, Excel distingue les modifications qui affectent le contenu d’une cellule par rapport à sa sortie.

Si vous avez besoin que votre code soit exécuté chaque fois que votre formule est mise à jour, envisagez d'utiliser l'événement Worksheet_Calculate . Il se déclenche chaque fois que la feuille de calcul est recalculée.

1
Twisty Impersonator

Considérez la plage ("AD: AD") dans votre code VBA, je voudrais vous suggérer la raison derrière et aussi des solutions pour résoudre le problème

Si la plage est manuellement actualisée (ce que vous avez fait en réalité), l'événement de modification peut être utilisé.

Si la plage contient une formule , l'événement de calcul peut être utilisé.

Si la plage contient une valeur actualisée via une donnée externe ou une formule , dans Range ("AD" AD "), vous entrez = (" AD: AD ") et le Calculate Event peut également être utilisé.

Thaes sont les raisons possibles. Donc, si la plage est actualisée, alors AD: AD sera automatiquement calculé et l'événement sera déclenché.

Je suppose que vous n’avez pas entré le code sous ThisWorkbook. Le code doit obligatoirement être saisi sous Feuille , puis cela fonctionne.

Pour que la conclusion soit utilisée, calculez l'événement.

Vous trouverez ci-dessous deux exemples de méthodes de codage. Ils vous aideront à vous débarrasser de la situation.

Méthode 1:

Private Sub Worksheet_Calculate()
    Dim target As Range
    Set target = Range("AD:AD")

    If Not Intersect(target, Range("AD:AD")) Is Nothing Then

    PASTE YOUR VB CODE HERE.

    End If

End Sub

Méthode 2:

Créez simplement ceci.

Private Sub Worksheet_Calculate()
   Worksheet_Change Range("AD:AD")
End Sub

NB: Ce code traitera de votre exercice actuel "Événement de changement de feuille de calcul".

J'espère que cela vous aidera.

0
Rajesh S