需求:编写VBA固定到期日,停止TODAY函数动态更新
实现指定单元格填充后将到期日转为静态值的VBA方案
需求说明
当P列对应单元格填入"Yes"时,把AN列同行的数值转为静态值写入U列,替代U列原本的=MAX(T1-TODAY(),0)动态公式,让U列不再随日期变动。
现有代码问题
你提供的代码仅会清空U列单元格,未实现核心的"复制AN列值到U列"逻辑,以下是修正后的完整代码:
Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) ' 仅响应P列的单元格变更 If Not Intersect(Target, Me.Range("P:P")) Is Nothing Then ' 关闭事件触发,避免赋值U列时循环触发本事件 Application.EnableEvents = False ' 处理批量粘贴到P列的情况,遍历所有变更的单元格 Dim cell As Range For Each cell In Intersect(Target, Me.Range("P:P")) ' 不区分大小写匹配"Yes"输入 If UCase(cell.Value) = "YES" Then ' 将AN列对应行的静态值直接赋值给U列,替代动态公式 Me.Range("U" & cell.Row).Value = Me.Range("AN" & cell.Row).Value End If Next cell ' 恢复事件触发 Application.EnableEvents = True End If End Sub
关键细节说明
- 关闭事件触发:修改U列值时会再次触发
Worksheet_Change,加入Application.EnableEvents = False能避免无限循环,操作完成后记得恢复。 - 支持批量操作:遍历
Target中的每个单元格,即使批量粘贴多个"Yes"到P列,每一行都能正确处理。 - 不区分大小写:用
UCase()转换输入值,不管填"Yes""YES""yes"都能触发逻辑。 - 直接赋值静态值:通过
.Value赋值相当于"复制粘贴值",彻底替换U列的动态公式,确保数值不再变动。
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

