如何在更新单元格时自动填充用户名和更新时间?

时间:2014-12-18 17:24:04

标签: excel vba excel-vba

假设我有一张包含4列的工作表,如下所示:

value1 | value2 | updated by | update time
abc    |        | Employee1  | 18/12/2014 18:13
       | xyz    | Employee2  | 18/12/2014 18:13

我希望列"由"更新和"更新时间"如果Value1或Value2中的任何单元格已更新,则自动更新。

更新的列采用进行更改的用户的名称,可以是Windows用户名或Excel用户名。

列更新时间采用任何单元格value1或value2更新的时间。

我没有VBA知识;有没有办法如何实现这个结果?我一直在网上搜索,我发现如何通过VBA程序填充更新时间列,但结果并不完全符合预期,并且无法找到如何填充更新的列。

我在网上找到的VBA代码填充时间如下:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range("A2:A100")) Is Nothing Then 
        Target(1, 4) = Now 
        Target(1, 4).EntireColumn.AutoFit 
    End If 
End Sub 

来源:http://www.ozgrid.com/forum/showthread.php?t=24219

3 个答案:

答案 0 :(得分:1)

以下是您的问题可能的VBA解决方案:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Target.Column = 1 Or Target.Column = 2 Then
        ThisRow = Target.Row
        If (ThisRow = 1) Then Exit Sub
        ' time stamp corresponding to cell's last update
        Range("D" & ThisRow).Value = Now
        ' Windows level UserName | Application level UserName
        Range("C" & ThisRow).Value = Environ("username") & "|" & Application.UserName
        Range("C:D").EntireColumn.AutoFit
    End If
End Sub

为了保护Header Row免受更改,您可以添加如下所示的代码段:

    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
                 If Target.Column = 1 Or Target.Column = 2 Then
                        ' time stamp corresponding to cell's last update
                        Range("D" & ThisRow).Value = Now
                        ' Windows level UserName | Application level UserName
                        Range("C" & ThisRow).Value = Environ("username") & "|" & Application.UserName
                    Range("C:D").EntireColumn.AutoFit
                 End If
End Sub

希望这会有所帮助。最好的问候,

答案 1 :(得分:0)

对于Windows用户名,您可以使用

ActiveCell.Value = Environ("username")

什么没有用于时间戳?

答案 2 :(得分:0)

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("A:B")) Is Nothing Then

    Cells(Target.Row, 3) = Now                   'Current time
    Cells(Target.Row, 4) = Application.UserName  'Excel User Name
    Cells(Target.Row, 5) = Environ("UserName")   'Windows User Name

    Range("C:E").EntireColumn.AutoFit
End If

End Sub