多用户Excel中用VBA记录单元格设为Complete的操作人问题
解决方案:用工作表Change事件静态写入用户名
你的问题根源在于使用了易失性自定义函数+公式:每次工作表重新计算(比如打开工作簿、编辑任意单元格),所有B列的公式都会重新调用LastModifiedByUser函数,返回当前登录的用户名,导致旧记录被覆盖。正确的做法是在状态改为"Complete"时,一次性将用户名写入B列单元格(静态值),而非依赖动态公式。
实现步骤:
- 按
Alt+F11打开VBA编辑器 - 在左侧「工程资源管理器」中找到目标工作表(比如
Sheet1),双击打开其代码窗口 - 粘贴以下代码:
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列的用户名记录,可以:
- 选中B列,右键选择「设置单元格格式」→「保护」,勾选「锁定」
- 点击菜单栏「审阅」→「保护工作表」,在设置中允许用户编辑A列,这样B列的记录就无法被手动修改
内容的提问来源于stack exchange,提问作者user2664961
相关产品推荐
相关产品推荐

