2016-07-12 14 views
1

ここに問題があります。ユーザーが行のどこでも変更を加えたときにユーザー名とタイムスタンプを挿入する作業コードがあります。すばらしいです!だから、私のコードが動いて、自分の質問に答えましたよね?いいえ!コードを壊すことはありませんが、が作成されていないときにユーザー名の入力を変更したユーザーにつながる小さな問題はです。ここではそれが起こる方法ですExcel VBA - セルが変更されたときにのみユーザー名を挿入

Private Sub Worksheet_Change(ByVal Target As Excel.Range) 
    ThisRow = Target.Row 
    'protect Header row from any changes 
    If (ThisRow = 1) Then 
      Application.EnableEvents = False 
      Application.Undo 
      Application.EnableEvents = True 
      MsgBox "Header Row is Protected." 
      Exit Sub 
    End If 
    For i = 1 To 61 
     If Target.Column = i Then 
       ' time stamp corresponding to cell's last update 
       Range("BK" & ThisRow).Value = Now 
       ' Windows level UserName | Application level UserName 
       Range("BJ" & ThisRow).Value = Environ("username") 
      Range("BJ:BK").EntireColumn.AutoFit 
     End If 
    Next i 
End Sub 

は、ここに私のコードだユーザーは、彼らがセルに変更を加えることを決定したいので、彼らは、セルをダブルクリックします。今、彼らがエスケープキーを押すと、何も起こりません、すべてが大胆なdoryです。しかし、もし彼らがセルをダブルクリックして、へのセルの外にあるセルをクリックすると、のセルが残っていれば、システムは変更を加えずにユーザーのユーザー名を列62に入れても変更を記録します。誰もその行の何かを変更する最後の人として間違って置かれている場合、別の個人が作った間違いの責任を誰かが負う可能性があります。

逆に、ユーザーによって変更されたセルにコメントを作成する価値はあるかもしれませんが、セルをダブルクリックすると同じ問題が発生すると思いますので、それ。

思考?

編集:完全な開示、私はこのコードを他の場所で見つけ、自分の目的に合わせました。

答えて

2

古い値と新しい値が同じかどうかをテストすることができます。私は、新しいものをゆるやかに使用しています。つまり、セルが編集されたことを秀でているので、Worksheet_Changeイベントの理解の点で「新しい」値です。

私はまたあなたのForループを取り除いてしまったので、非常に不必要に思えました。私が間違っていると、私は謝罪します。

Private Sub Worksheet_Change(ByVal Target As Excel.Range) 

    Dim ThisRow As Long ' make sure to declare all the variables and appropiate types 
    ThisRow = Target.Row 

    'protect Header row from any changes 
    If (ThisRow = 1) Then 

      Application.EnableEvents = False 
      Application.Undo 
      Application.EnableEvents = True 
      MsgBox "Header Row is Protected." 
      Exit Sub 

    End If 

    If Target.Column >= 1 And Target.Column <= 61 Then 

     Dim sOld As String, sNew As String 
     sNew = Target.Value 'capture new value 

     With Application 
      .EnableEvents = False 
      .Undo 
     End With 

     sOld = Target.Value 'capture old value 
     Target.Value = sNew 'reset new value 

     If sOld <> sNew Then 

      ' time stamp corresponding to cell's last update 
      Range("BK" & ThisRow).Value = Now 
      ' Windows level UserName | Application level UserName 
      Range("BJ" & ThisRow).Value = Environ("username") 
      Range("BJ:BK").EntireColumn.AutoFit 

     End If 

     Application.EnableEvents = True 

    End If 

End Sub 
+0

ブリリアント。ありがとう。私はあなたがここで何をしているのかを見ていると思う。新しい値をsNewにコピーしてから、変更のアクションを元に戻し、古い値をsOldにコピーして比較します。 「元に戻す」は、「Application.EnableEvents = False」のために発生しません。私は正しいですか? – jtrousd

+0

@jtrousd - 実際の取り消し*は実行されますが、この 'Target.Value = sNew'で元に戻す前に値を設定します。 'EnableEvents = False'は、シートが変更されるたびにマクロが起動するのを止めます。 –

+0

Aha。私は今参照してください!ありがとう、スコット。 – jtrousd

関連する問題