2016-04-10 40 views
0

私の翻訳クラスで使用するExcelファイルで作業しています。プログラミングスキルはありません。私はあなたの学業目的のサポートが必要です。このExcelでは、学生がセルを2番目に編集するために費やした時間を測定したいと考えています。確かに私は私が文を編集する時間をログに記録可能性式が見つかりました:Excelでセルを編集する時間を記録する方法

Private Sub Worksheet_Change(ByVal Target As Range) 
'Update 20140722 
Dim WorkRng As Range 
Dim Rng As Range 
Dim xOffsetColumn As Integer 
Set WorkRng = Intersect(Application.ActiveSheet.Range("C:C"), Target) 
xOffsetColumn = 1 
If Not WorkRng Is Nothing Then 
    Application.EnableEvents = False 
    For Each Rng In WorkRng 
     If Not VBA.IsEmpty(Rng.Value) Then 
      Rng.Offset(0, xOffsetColumn).Value = Now 
      Rng.Offset(0, xOffsetColumn).NumberFormat = "dd-mm-yyyy, hh:mm:ss" 
     Else 
      Rng.Offset(0, xOffsetColumn).ClearContents 
     End If 
    Next 
    Application.EnableEvents = True 
End If 
End Sub 

は、今私は、セルを編集するために、セル内のセルを入力して編集を完了するとの違いを見つけたいです。

ありがとうございます!

+0

ありがとう@ john-coleman! –

答えて

0

少し異なるアプローチ。

enter image description here

その後、あなたは時間を記録したい任意のシートに、次のコードを置く:次に

Private Sub Worksheet_Activate() 
    Dim R As Range 
    Set R = Sheets("EditLog").Cells(Rows.Count, 1).End(xlUp) 
    R.Offset(1, 0).Value = Selection.Parent.Name 
    R.Offset(1, 1).Value = Selection.Address 
    R.Offset(1, 2).Value = Now 
End Sub 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Dim R As Range 
    Set R = Sheets("EditLog").Cells(Rows.Count, 1).End(xlUp) 
    R.Offset(1, 0).Value = Target.Parent.Name 
    R.Offset(1, 1).Value = Target.Address 
    R.Offset(1, 2).Value = Now 
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim R As Range, seconds As Long 
    Set R = Sheets("EditLog").Cells(Rows.Count, 1).End(xlUp) 
    R.Offset(0, 3).Value = Now 
    seconds = DateDiff("s", R.Offset(0, 2).Value, R.Offset(0, 3).Value) 
    R.Offset(0, 4).Value = seconds 
End Sub 

を、それは最初に次のようになりますように、新しいシートを作成し、EditLog言います

enter image description here

:あなたはシートを編集するときに(私の実験では、私はシート1を編集した)、しばらく EditLogは次のようになります

シートを最初にアクティブにしたときにアクティブセルが入力されたときに記録されるようにしました。これは、ユーザーが初めてセルに切り替えることなくセルの編集を開始すると、同期が外れるのを防ぐためです。しかし、アーティファクトとして最初のセルを変更せずに残しておくと空白行が発生します。

+0

ありがとう。さらに一歩進んでください。 :)それは私の学生が生産性を理解するのに非常に役立ちます。 –

2

が、これは、関連するシートペインのコードに配置する

Dim startTime As Single 

Private Sub Worksheet_Change(ByVal Target As Range) 
Application.EnableEvents = False 
Cells(Target.row, 1) = Timer - startTime 
Application.EnableEvents = true 
End Sub 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
startTime = Timer 
End Sub 

行う必要があります

edited2 OPの質問洗練

後ヘルパー細胞の使用を避けるためにを編集し

このコードはを保存しますユーザーがその内容を変更するセルを離れると、ユーザは、

、新しいセルを選択する3210関数値は、それはあなたがそれを適応したい場合があり

編集したセルの行の最初の列に経過時間を書き込み、特定のセルが編集中である場合にのみタイマー管理を実行すること。

+0

モジュールレベルの変数を使うのは良い考えだと思います。 –

+0

ありがとうございました。私はテストしました。実際、メッセージボックスに表示される時間は私が正確に必要なものです。しかし、関連する行の最初のセルに印刷する必要があります。これは可能ですか? –

+0

もちろん:Range( "An")を使用してください。value = Timer - startTime'ここで 'n'は関連する行インデックスを表します(そして、最初の列が列1であると仮定して) – user3598756

関連する問題