2012-02-16 10 views
5

C2の式があるとします(=A2+B2)。 C2が値(実際の値ではなく数式)を変更するときはいつでも、現在の日付と時刻をD2で更新したいと思う。別のセルの値が変更されたとき(式によって計算される)のセルの自動日付更新

私は多くのVBAコードとトリックを試していますが、C2に式を入力するとそのどれも機能しません。しかし、C2に手動で値を入力すると、必要に応じて日付と時刻が更新されます。これは当然のことながら、実際の値が入力/変更されるためです。

質問: C2の式の結果が変更されたときにD2を更新するVBAコード(または他のもの)を作成することはできますか? C30(+ D2:D30日付+時間)あなたはdependendセルを埋めることができエクセル2010

+1

「私はVBAコードをたくさん試しました」私たちはあなたに何を試してみたのですか?(http://mattgemmell.com/2008/12/08/what-have-you-tried/) –

答えて

10

を使用して

(D2可能であれば

、私は、これはセルC2のためにアクティブにする必要があります)を入力パラメータとしてC2-Cellの値をとるユーザー定義関数(VBAマクロ関数)によって出力し、現在の日付を出力として返します。

D2のUDFの入力パラメータとしてC2を使用すると、C2が変更されるたびにD2を再評価する必要があることがExcelに通知されます(つまり、ブックの式の自動計算がオンになっている場合)。

編集:ここでは

はいくつかのコードです:

UDFの場合:D2での式のよう

Public Function UDF_Date(ByVal data) As Date 

     UDF_Date = Now() 

    End Function 

=UDF_Date(C2) 

あなたが与える必要がありますD2-Cellに日付/時刻形式を入力するか、または数字のrepresenを表示します日付値の表現。

C2式をD2式のままにしておくと、式を展開することができます。

注:たびExcelはD2で日付が現在の値にリセットされますワークブックを再計算しているため これはまだ理想的なソリューションではないかもしれません。 C2が最後に変更された時刻のみをD2に反映させるには、C2の過去の値を何らかの形で追跡する必要があります。 これは、例えば、入力パラメーターの値をアドレスにも提供し、入力パラメーターを隠しシートに保管し、UDFが呼び出されるたびに以前の値と比較することで、UDFに実装できます。

補遺:ここ

は、セル値の変化を追跡し、最後の変更が検出された日時を返すUDFの実装例です。それを使用する場合 、ことに注意してください。

  • UDFの使用上記と同様です。

  • UDFは、単一セル入力範囲でのみ機能します。

  • ブックのドキュメントプロパティに変更が検出されたときのセルの最終値と の日時を格納することによって、セル値が追跡されます。計算式が大規模なデータセットで使用されている場合、 によって追跡されるすべてのセルで、ファイルのサイズがかなり大きくなる可能性があります(セルの最終値最終変更日)。 非常に大量のドキュメントプロパティを処理できず、コードは にある点でブレーキをかけることがあります。

  • ワークシートの名前が変更されると、その中に含まれるセルのすべてのトラッキング情報が失われます。

  • 文字列への変換が非決定的であるセル値の場合、コードが制動することがあります。

  • 以下のコードは、をテストしていないであり、 という概念の証明とみなされるべきです。 自己責任で使用してください

    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これは良い方法です。すべての時間関連関数が揮発性であり、帽子のドロップで再計算するために、実際に数式を使用することはできません。 –

+0

こんにちは、素早く答えていただきありがとうございます。私はあなたが投稿したものを試しましたが、#NAMEを取得しましたか?セルが日付を表示するように書式設定されていても表示されます。 – AlienHand

+0

#名前? ExcelがUDFを見つけられない可能性があります。どこでVBA関数を保存しましたか、それはPublicと宣言されていますか?その名前はD2で書いたものに対応していますか? – Roman

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と@Paul 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 
+0

これは非常にエレガントなようです。試してみる。ありがとう! ; o) – AlienHand

+0

これをテストします... – AlienHand

+0

これは、範囲内のデータを手動で変更する場合にのみ有効です(それには最適です)。しかし、セルに数式がある場合(私のように)、変更が行われたときに日付を更新/変更しません。エルゴ、私はそれを使用することはできません。ごめんなさい。 – AlienHand

-1

から適応

最も簡単な方法は、=IF(B3="","Not Allocated",Now())を追加し、必要な日付と時刻の形式に列の書式を変更することです。しかし、ここでB列が編集されると、更新を必要とするそれぞれの列の日付と時刻は、古い値をチェックしていないため、すべての列に対して自動的に更新されます。しかし、現在の時間を取得するのがうまくいけば、これは簡単に使用できます。

関連する問題