如何修改Excel VBA代码,适配新增行的行锁定/解锁需求?
解决VBA代码无法适配新增行的方案
修改后的代码
Private Sub Worksheet_Change(ByVal Target As Range) Dim rng As Range Dim targetColC As Range ' 动态获取C列从第3行开始到最后一行的范围 Set targetColC = Me.Range("C3:C" & Me.Rows.Count) If Not Intersect(targetColC, Target) Is Nothing Then ' 遍历所有触发变更的C列单元格(从第3行开始) For Each rng In Intersect(targetColC, Target) ' 仅锁定该行的D-K列,匹配需求逻辑 Me.Range(Me.Cells(rng.Row, "D"), Me.Cells(rng.Row, "K")).Locked = (rng.Value = "") Next rng End If End Sub
关键修改说明
- 替换固定范围为动态范围:把原代码中固定的
Range("C3:C1000")改成Me.Range("C3:C" & Me.Rows.Count),这样不管用户在表格底部新增多少行,C列第3行及以下的所有单元格都会被监听,完美适配新增行场景。 - 精准锁定目标列:原代码用
rng.EntireRow.Locked会锁定整行,调整为仅锁定该行的D到K列,完全贴合需求描述的「C列非空则D-K可编辑,为空则不可编辑」逻辑。
注意事项
- 单元格锁定功能仅在工作表处于保护状态时生效,保护工作表时需勾选「允许用户编辑未锁定的单元格」选项。
- 如果担心C列空白行过多影响性能,可改用
Range("C3", Me.Cells(Me.Rows.Count, "C").End(xlUp))监听C列已使用的范围,但这种方式无法监听刚新增还未输入数据的行,可根据实际需求选择。
内容的提问来源于stack exchange,提问作者TheAdmin
相关产品推荐
相关产品推荐

