You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多用户Excel中用VBA记录单元格设为Complete的操作人问题

解决方案:用工作表Change事件静态写入用户名

你的问题根源在于使用了易失性自定义函数+公式:每次工作表重新计算(比如打开工作簿、编辑任意单元格),所有B列的公式都会重新调用LastModifiedByUser函数,返回当前登录的用户名,导致旧记录被覆盖。正确的做法是在状态改为"Complete"时,一次性将用户名写入B列单元格(静态值),而非依赖动态公式。

实现步骤:

  1. 按Alt+F11打开VBA编辑器
  2. 在左侧「工程资源管理器」中找到目标工作表(比如Sheet1),双击打开其代码窗口
  3. 粘贴以下代码:
Private Sub Worksheet_Change(ByVal Target As Range)
    ' 仅处理A列的单元格修改
    If Not Application.Intersect(Target, Me.Columns("A")) Is Nothing Then
        ' 关闭事件触发,防止写入B列时再次触发Change事件
        Application.EnableEvents = False
        
        ' 处理用户选中多个单元格修改的情况
        Dim cell As Range
        For Each cell In Application.Intersect(Target, Me.Columns("A"))
            ' 当单元格值改为"Complete"时,写入当前用户名到对应B列
            If UCase(cell.Value) = "COMPLETE" Then
                cell.Offset(0, 1).Value = Application.UserName
            ' 可选:如果状态从"Complete"改为其他值,清空B列对应单元格
            ElseIf UCase(cell.Value) <> "COMPLETE" And cell.Offset(0, 1).Value <> "" Then
                cell.Offset(0, 1).Value = ""
            End If
        Next cell
        
        ' 重新启用事件触发
        Application.EnableEvents = True
    End If
End Sub

关键说明:

  • 代码会监听A列的所有手动修改,当单元格被改为"Complete"时,直接把当前用户名写入右侧B列单元格(静态文本,不会随后续操作改变)
  • 加入了多单元格修改的处理逻辑,支持用户批量修改A列状态
  • 可选逻辑:如果状态从"Complete"改为其他值,自动清空对应B列的用户名(不需要可以删除这段ElseIf代码)
  • 工作簿需要保存为.xlsm格式(启用宏的工作簿),打开时需启用宏才能生效

额外优化(可选):

如果要防止用户修改B列的用户名记录,可以:

  1. 选中B列,右键选择「设置单元格格式」→「保护」,勾选「锁定」
  2. 点击菜单栏「审阅」→「保护工作表」,在设置中允许用户编辑A列,这样B列的记录就无法被手动修改

内容的提问来源于stack exchange,提问作者user2664961

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 10:20:43