繁体   English   中英

Private Sub Worksheet_Change(ByVal Target As Range)并不总是有效

[英]Private Sub Worksheet_Change(ByVal Target As Range) not working always

我是 VBA 的初学者,我对 Private Sub Worksheet_Change 代码有疑问 - 它并不总是有效。 我希望当 A 列中的单元格更改其值时,将其值写入 B 列中的同一行,进行更改的 Windows 用户。

请看下面我的代码,用 Sheet1 编写,而不是在模块中:

Private Sub Worksheet_Change(ByVal Target As Range)

    Worksheets("Sheet1").Unprotect Password:=Password

    x = Target.Row         

    If Not Intersect(Target, Range("A" & x)) Is Nothing Then
        Range("B" & x).Value = Environ("USERNAME")
    End If

    Worksheets("Sheet1").Protect Password:=Password

End Sub
  1. 首先确保A列中的单元格未锁定。 (编码器)
  2. 创建密码字符串变量。 (代码)
  3. 允许更改多个单元格(代码)
  4. 防止事件重新进入(代码)

第一步应该由编码人员完成。


Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim x As Long, pswrd As String, cell As Range, inter As Range

    pswrd = "secret"
    Set inter = Intersect(Range("A:A"), Target)
    If inter Is Nothing Then Exit Sub
    
    Worksheets("Sheet1").Unprotect Password:=pswrd
    Application.EnableEvents = False
        For Each cell In inter
            x = cell.Row
            Range("B" & x).Value = Environ("USERNAME")
        Next cell
    Application.EnableEvents = True
    Worksheets("Sheet1").Protect Password:=pswrd

End Sub

编辑#1:

根据 Darren Bartrup-Cook 的建议,我们可以放弃循环

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim x As Long, pswrd As String, cell As Range, inter As Range

    pswrd = "secret"
    Set inter = Intersect(Range("A:A"), Target)
    If inter Is Nothing Then Exit Sub
    
    Worksheets("Sheet1").Unprotect Password:=pswrd
        Application.EnableEvents = False
            inter.Offset(0, 1).Value = Environ("USERNAME")
        Application.EnableEvents = True
    Worksheets("Sheet1").Protect Password:=pswrd

End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM