簡體   English   中英

Excel VBA-僅在更改單元格時插入用戶名

[英]Excel VBA - Insert Username ONLY when cell is changed

這是我的問題:當用戶在一行中的任何位置進行更改時,我都有有效的代碼可以插入用戶名和時間戳。 大! 這樣我的代碼就可以工作了,我回答了自己的問題,對嗎? 不! 有一個很小的問題,盡管它不會破壞代碼,但確實導致用戶輸入用戶名,而未進行更改則進行了更改。

這是我的代碼:

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

它是這樣發生的:用戶決定要更改單元格,因此他們雙擊該單元格。 現在,如果他們按下轉義鍵,則什么也不會發生,並且一切都是笨拙的。 但是,如果他們雙擊該單元格,然后在該單元格之外單擊到另一個單元格以離開該單元格,則即使沒有進行任何更改並且用戶的用戶名已放入第62列,系統也會將其記錄為更改。這不是bueno ,因為如果某個人被錯誤地放為最后一行更改該行中的某些內容,則可能會對另一個人犯的錯誤負責。

相反,在由用戶更改的單元格中創建注釋可能是值得的,但是我認為雙擊單元格會遇到相同的問題,因此我仍然必須考慮它。

思考?

編輯:完全公開,我在其他地方找到了此代碼,並對其進行了修改以適應我的目的。

您可以測試一下舊值和新值是否相同。 我寬松地使用“ new”,意思是擅長編輯單元格,因此就Worksheet_Change事件的理解而言,它是“ new”值。

我也擺脫了您的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM