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.
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
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
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é.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$2" Then
ActiveSheet.Range("D2").Value = Now()
End If
End Sub