web-dev-qa-db-fra.com

Mise à jour automatique de la date dans une cellule lorsque la valeur d'une autre cellule change (calculée par une formule)

J'ai une formule en C2, disons =A2+B2. Chaque fois que C2 change de valeur (valeur réelle, pas de formule), je souhaite que la date et l'heure actuelles soient mises à jour dans D2.

J'ai essayé beaucoup de codes et astuces VBA et aucun d'entre eux ne fonctionne si une formule est entrée dans C2. MAIS si je tape une valeur manuellement dans C2, la date et l'heure sont mises à jour si nécessaire. C’est bien sûr parce qu’une valeur réelle est entrée/modifiée - là où la formule reste la même, pour ainsi dire.

Question: Est-il possible de créer un code VBA (ou autre chose) qui met à jour D2 lorsque le résultat de la formule dans C2 change?

Si possible, il faut que cela soit actif pour les cellules C2: C30 (+ D2: D30 pour la date + l'heure)

Utiliser Excel 2010.

5
AlienHand

Vous pouvez remplir la cellule dépendante (D2) à l'aide d'une fonction définie par l'utilisateur (fonction macro VBA) qui prend la valeur de la cellule C2 en tant que paramètre d'entrée et renvoie la date actuelle en tant que sortie.

Le fait d'avoir C2 comme paramètre d'entrée pour la fonction utilisateur dans D2 indique à Excel qu'il doit réévaluer D2 chaque fois que C2 change (c'est-à-dire si le calcul automatique des formules est activé pour le classeur).

MODIFIER:

Voici du code:

Pour l'UDF:

    Public Function UDF_Date(ByVal data) As Date

        UDF_Date = Now()

    End Function

En formule dans D2:

=UDF_Date(C2)

Vous devrez donner à la cellule D2 un format date-heure ou une représentation numérique de la date-valeur.

Et vous pouvez étendre la formule sur la plage souhaitée en la glissant si vous conservez la référence C2 dans le relatif D2-formule.

Remarque: Cela n’est peut-être pas la solution idéale, car chaque fois que Excel recalcule le classeur, la date dans D2 est réinitialisée à la valeur actuelle . Pour que D2 ne reflète que la dernière fois que C2 a été modifié il devrait exister une sorte de suivi de la ou des valeurs passées de C2 ..__, ce qui pourrait par exemple être implémenté dans la fonction définie par l'utilisateur en fournissant également l'adresse au-delà de la valeur du paramètre d'entrée, en enregistrant les paramètres d'entrée dans un fichier. feuille cachée et les comparer aux valeurs précédentes à chaque appel de la fonction UDF.

Addenda:

Voici un exemple d'implémentation d'une fonction utilisateur qui suit les modifications des valeurs de cellules et renvoie la date et l'heure de la détection des dernières modifications . Lors de son utilisation, veuillez noter que:

  • L'utilisation de la fonction UDF est la même que celle décrite ci-dessus.

  • La fonction UDF ne fonctionne que pour les plages d'entrée d'une cellule.

  • Les valeurs de cellule sont suivies en stockant la dernière valeur de cellule et la date-heure où le changement a été détecté dans les propriétés de document du classeur Si la formule est utilisée sur de grands ensembles de données, la taille du fichier Peut augmenter considérablement, de même que pour chaque cellule suivie par , La formule augmente les exigences de stockage (dernière valeur de cellule + Date de la dernière modification. ) De plus, Excel n’est peut-être pas capable de gérer De très grandes quantités de propriétés de document et le code pourrait freiner à Un certain point.

  • Si le nom d'une feuille de calcul est modifié, toutes les informations de suivi des cellules qu'il contient sont perdues.

  • Le code pourrait freiner les valeurs de cellules pour lesquelles la conversion en chaîne n'est pas déterministe.

  • Le code ci-dessous est non testé et ne doit être considéré que comme une preuve du concept Utilisez à vos risques et périls .

    Public Function UDF_Date(ByVal inData As Range) As Date
    
        Dim wb As Workbook
        Dim dProps As DocumentProperties
        Dim pValue As DocumentProperty
        Dim pDate As DocumentProperty
        Dim sName As String
        Dim sNameDate As String
    
        Dim bDate As Boolean
        Dim bValue As Boolean
        Dim bChanged As Boolean
    
        bDate = True
        bValue = True
    
        bChanged = False
    
    
        Dim sVal As String
        Dim dDate As Date
    
        sName = inData.Address & "_" & inData.Worksheet.Name
        sNameDate = sName & "_dat"
    
        sVal = CStr(inData.Value)
        dDate = Now()
    
        Set wb = inData.Worksheet.Parent
    
        Set dProps = wb.CustomDocumentProperties
    
    On Error Resume Next
    
        Set pValue = dProps.Item(sName)
    
        If Err.Number <> 0 Then
            bValue = False
            Err.Clear
        End If
    
    On Error GoTo 0
    
        If Not bValue Then
            bChanged = True
            Set pValue = dProps.Add(sName, False, msoPropertyTypeString, sVal)
        Else
            bChanged = pValue.Value <> sVal
            If bChanged Then
                pValue.Value = sVal
            End If
        End If
    
    On Error Resume Next
    
        Set pDate = dProps.Item(sNameDate)
    
        If Err.Number <> 0 Then
            bDate = False
            Err.Clear
        End If
    
    On Error GoTo 0
    
        If Not bDate Then
            Set pDate = dProps.Add(sNameDate, False, msoPropertyTypeDate, dDate)
        End If
    
        If bChanged Then
            pDate.Value = dDate
        Else
            dDate = pDate.Value
        End If
    
    
        UDF_Date = dDate
     End Function
    
10
Roman

Faites l'insertion de la date conditionnel sur la plage.

Cela présente l’avantage de ne pas modifier les dates à moins que le contenu de la cellule ne soit modifié. Si la feuille est fermée et enregistrée, elle se situe dans la plage C2: C2. Elle ne recalcule que si la cellule adjacente est modifiée.

Adapté de ce conseil et @Paul S answer

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim R1 As Range
 Dim R2 As Range
 Dim InRange As Boolean
    Set R1 = Range(Target.Address)
    Set R2 = Range("C2:C20")
    Set InterSectRange = Application.Intersect(R1, R2)

  InRange = Not InterSectRange Is Nothing
     Set InterSectRange = Nothing
   If InRange = True Then
     R1.Offset(0, 1).Value = Now()
   End If
     Set R1 = Nothing
     Set R2 = Nothing
 End Sub
4
datatoo

Le moyen le plus simple consiste à ajouter =IF(B3="","Not Allocated",Now()) et à changer le format de la colonne en format de date et heure requis. Mais ici si la colonne B est modifiée, la date et l’heure de la colonne respective nécessitant la mise à jour seront automatiquement mises à jour pour toutes les colonnes, car l’ancienne valeur n’a pas été vérifiée. Mais s’il est bon d’obtenir l’heure actuelle, cela peut être facilement utilisé.

0
Arun Chettoor
Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = "$C$2" Then

        ActiveSheet.Range("D2").Value = Now()

    End If

End Sub
0
Paul S