編集- row = ActiveCell.row を row = Target.row に変更しました (同じ行にいない場合に使用できます)
このようなものがうまくいくはずです。明らかに、特定のフィールドが変更された場合などにのみ更新を行いたい場合は、いくつかのエラー処理とおそらくさらに検証を追加することを検討したいかもしれませんが、これは確かに基本をカバーしています:
Private Sub Worksheet_Change(ByVal Target As Range)
' declare constants and variables
Const owner_col As String = "I"
Const date_col As String = "J"
Dim row As Double
Dim owner_addr As Range
Dim date_addr As Range
' initialise
row = Target.row
Set owner_addr = Range(owner_col & row)
Set date_addr = Range(date_col & row)
' check that the update is not to the fields you want to update to avoid infinite loop
If Target.Address <> owner_addr.Address And Target.Address <> date_addr.Address Then
' set values
owner_addr.Value = Environ("username")
date_addr.Value = Now()
End If
' free up the memory
Set owner_addr = Nothing
Set date_addr = Nothing
End Sub
これは、変更を追跡するシートに追加する必要があります (つまり、モジュールまたはワークブック全体ではありません)。ご不明な点がございましたら、お知らせください。
Environ("username") は、Windows 環境変数からユーザー名を取得します。