2012-02-16 84 views
5

我在C2中有一個公式,比如=A2+B2。每當C2更改值(實際值,而不是公式)時,我希望在D2中更新當前日期和時間。當另一個單元格的值發生變化(通過公式計算)時,單元格中的自動日期更新

我已經嘗試了很多VBA代碼和技巧,如果在C2中輸入公式,它們都不起作用。但如果我在C2中手動鍵入一個值,日期和時間根據需要更新。這當然是因爲真正的價值被輸入/變化 - 可以說公式保持不變。

問: 是否有可能創建一個可以更新D2一VBA代碼(或別的東西)當C2的變化公式的結果?

如果可能的話,我想這能爲小區C2被激活:C30(+ D2:D30的日期+時間)

使用Excel 2010中

+1

「我嘗試了很多VBA代碼」小心向我們展示[你試過了什麼?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – 2012-02-17 02:34:40

回答

10

您可以填寫dependend細胞(D2 )通過用戶定義函數(VBA宏函數)將C2-Cell的值作爲輸入參數,將當前日期作爲輸出返回。

將C2作爲D2中UDF的輸入參數告訴Excel,每次C2更改時(即如果爲工作簿打開公式的自動計算),都需要重新評估D2。

編輯:

下面是一些代碼:

對於UDF:

Public Function UDF_Date(ByVal data) As Date 

     UDF_Date = Now() 

    End Function 

如公式在D2:

=UDF_Date(C2) 

你得給D2-Cell是日期時間格式,或者它將顯示數字表示日期值。

如果將C2參考保留在D2公式的相對位置,則可以通過拖動公式將其展開爲所需的範圍。

注: 這仍然可能不是理想的解決方案,因爲每次重新計算的Excel工作簿中的D2的日期將被重置爲當前值。 爲了使D2僅反映C2最後一次改變,必須對C2的過去值進行某種跟蹤。 例如,這可以通過在UDF中提供地址alonside輸入參數的值,將輸入參數存儲在隱藏表中並在每次調用UDF時將它們與先前的值進行比較來實現。

附錄:

這裏是跟蹤的單元值的變化和被檢測的最後一個發生變化時返回的日期時間的UDF的樣本實現。 當使用它時,請注意的是:

  • 的UDF的使用是相同的,如上所述。

  • 的UDF僅適用於單細胞輸入範圍。

  • 單元格值通過存儲單元格的最後一個值以及在 工作簿的文檔屬性中檢測到更改時的日期時間進行跟蹤。如果公式中使用了大型數據集的 文件的大小可能會顯着增加,因爲對於每一個被 公式的存儲需求的增長追蹤細胞(上次更改的細胞+ 日期的最後一個值。)此外,也許Excel是無法處理大量的文檔屬性,並且代碼可能會在 的某個點上制動。

  • 如果工作表的名稱被改變了其中的所有跟蹤信息包含細胞丟失。

  • 細胞值的代碼可能制動器針對轉換到串是非確定性的。

  • 下面的代碼是未測試並應被視爲僅作爲 概念的證明。 使用它需自擔風險

    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 
    
+0

+ 1這是一個很好的方法,你真的不能使用公式,因爲所有與時間有關的函數都是不穩定的,並且在帽子下面重新計算。 – 2012-02-16 13:34:51

+0

嗨,謝謝你的快速回答。我嘗試了您發佈的內容,但獲得了#NAME?即使該單元格已被格式化以顯示日期。 – AlienHand 2012-02-16 13:53:22

+0

#姓名?可能意味着Excel沒有找到UDF。你在哪裏存儲VBA函數,是否聲明爲Public,並且名稱是否與你在D2中編寫的內容相對應? – Roman 2012-02-16 14:01:19

0
Private Sub Worksheet_Change(ByVal Target As Range) 

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

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

    End If 

End Sub 
4

導致日期在範圍條件的插入。

這樣做的好處是不會更改日期,除非單元格的內容發生更改,並且它位於C2:C2範圍內,即使關閉並保存表格,也不會重新計算,除非相鄰單元格變化。

this tip改編和@保羅的回答

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 
+0

這似乎很優雅。將嘗試一下。謝謝! ; o) – AlienHand 2012-03-12 07:20:38

+0

測試這個... – AlienHand 2012-03-12 07:39:49

+0

這隻有在你手動更改範圍內的數據時纔有效(對此非常適用)。但是如果你在單元格中有一個公式(與我一樣),它不會更新/更改進行更改時的日期。 Ergo,我無法使用它。抱歉。 – AlienHand 2012-03-15 07:15:22

-1

最簡單的方法是添加=IF(B3="","Not Allocated",Now())和更改列的格式要求的日期和時間格式。但是,如果B列被編輯,那麼需要更新的相應列的日期和時間將自動更新爲所有列,因爲不檢查舊值。但如果可以很容易地使用當前時間。

相關問題