Excel工作表C/D列互锁编辑需求及VBA代码完善求助
实现C/D列互锁不可编辑的VBA代码完善方案
核心逻辑
某行C列先输入内容时,锁定对应行D列;若D列先输入,则锁定对应行C列。删除对应列内容后,自动解锁另一列。
完整代码
Private Sub Worksheet_Change(ByVal Target As Range) Dim targetRow As Long Dim cell As Range ' 防止事件循环触发 Application.EnableEvents = False ' 仅处理C、D列的单元格变化 If Not Intersect(Target, Columns("C:D")) Is Nothing Then ' 遍历所有触发变化的单元格(支持批量操作) For Each cell In Target targetRow = cell.Row ' 只处理第2行及以下的数据行 If targetRow >= 2 Then ' 取消工作表保护才能修改单元格锁定状态 Me.Unprotect Password:="yourPassword" ' 替换为你的工作表保护密码,无密码则留空 ' 根据C列内容状态设置D列锁定 Cells(targetRow, "D").Locked = (Cells(targetRow, "C").Value <> "") ' 根据D列内容状态设置C列锁定 Cells(targetRow, "C").Locked = (Cells(targetRow, "D").Value <> "") ' 重新保护工作表,UserInterfaceOnly确保VBA可修改锁定单元格 Me.Protect Password:="yourPassword", UserInterfaceOnly:=True End If Next cell End If ' 恢复事件触发 Application.EnableEvents = True End Sub
关键说明
- 事件循环防护:通过
Application.EnableEvents = False避免修改锁定状态时重复触发Worksheet_Change事件。 - 工作表保护机制:修改单元格
Locked属性前必须取消保护,重新保护时添加UserInterfaceOnly:=True,后续VBA操作无需反复取消保护。 - 批量操作兼容:遍历
Target中的每个单元格,支持批量粘贴、删除等多单元格同时变化的场景。 - 行范围控制:仅处理第2行及以下的数据行,避免误操作表头区域。
内容的提问来源于stack exchange,提问作者Ranger
相关产品推荐
相关产品推荐

