当另一个单元格的值发生更改时(通过公式计算),在单元格中自动更新date

我有一个C2的公式,比如=A2+B2 。 每当C2改变值(实际值,而不是公式),我想在D2中更新当前的date和时间。

我已经尝试了很多VBA代码和技巧,如果在C2中input公式,它们都不起作用。 但是,如果我在C2中手动键入一个值,date和时间根据需要更新。 这当然是因为真正的价值被input/变化 – 可以说公式保持不变。

问题:当C2中的公式结果发生变化时,是否可以创build一个更新D2的VBA代码(或其他)?

如果可能的话,我需要这个对于单元格C2:C30(+date+时间的D2:D30)

使用Excel 2010。

您可以通过用户定义函数(VBAmacros函数)填充依赖单元(D2),该函数将C2-Cell的值作为input参数,将当前date返回为输出。

将D2作为D2中UDF的input参数,告诉Excel每次C2更改时(即如果为工作簿打开公式的自动计算),都需要重新评估D2。

编辑:

这里是一些代码:

对于UDF:

  Public Function UDF_Date(ByVal data) As Date UDF_Date = Now() End Function 

如D2中的公式:

 =UDF_Date(C2) 

您必须为D2-Cell提供date时间格式,否则将显示date值的数字表示forms。

如果将C2参考保留在D2公式相对中,则可以通过拖动公式将其展开到所需的范围。

注意:这仍然不是理想的解决scheme,因为每次Excel重新计算工作簿时,D2中的date将重置为当前值。 为了使D2仅反映C2最后一次改变,就必须对C2的过去值进行某种跟踪。 例如,这可以通过在input参数的值处提供地址alonside,将input参数存储在隐藏表格中,并且在每次UDF被调用时将它们与先前的值进行比较来实现在UDF中。

附录:

下面是一个UDF的示例实现,跟踪单元格值的更改并返回检测到上次更改时的date时间。 使用时请注意:

  • UDF的用法与上述相同。

  • UDF仅适用于单个单元格input范围。

  • 通过存储单元格的最后一个值以及在工作簿的文档属性中检测到更改的date – 时间来跟踪单元格值。 如果公式用于大型数据集,那么文件大小可能会随着存储需求增加(单元格的上一个值+上次更改的date)由公式跟踪的每个单元格大幅增加。另外,也许Excel不能处理非常大量的文档属性,代码可能会在某个时刻刹车。

  • 如果工作表的名字被改变,其中包含的单元格的所有跟踪信息都将丢失。

  • 该代码可能会制止转换为string的单元格值不确定。

  • 以下代码未经testing ,应仅作为概念certificate。 使用它需要您自担风险

     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 

在范围内插入date条件。

这有一个优点,就是不改变date,除非单元格的内容被改变,并且它在C2:C2的范围内,即使closures并保存表格,除非相邻单元格改变,否则不重新计算。

从这个提示和@保罗S答案

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

最简单的方法是添加=IF(B3="","Not Allocated",Now())并将列的格式更改为所需的date和时间格式。 但是,如果编辑B列,那么需要更新的相应列的date和时间将自动更新为所有列,因为不检查旧值。 但是,如果现在可以很容易地使用这个时间。