Excel 中如何在填写买家后自动记录并固定当天日期?
填写买家后,如果要保留录入当天的销售日期,需要将日期写成固定值。TODAY() 在工作表重新计算时会返回当前日期,普通的 IF 嵌套无法记住首次录入的日期。要自动记录,可以在支持 VBA 的桌面版 Excel 中使用 Worksheet_Change 事件。
为什么已有日期会变成今天?
你的工作表用 A 列记录销售日期,B 列记录买家。从贴出的公式来看,比较运算符带有反斜杠,B24<>"" 和 TODAY() 之间也缺少参数分隔符。如果单元格中的公式也是这样,需要改为:
=IF(B24<>"",TODAY(),"")
这个公式表示:B24 不为空时,显示当前日期;否则显示空字符串。部分区域设置使用分号作为参数分隔符,需要按本机设置调整。
即使公式语法正确,它也只判断 B24 当前是否有内容,无法保存首次录入买家的时间。第二天打开工作簿并触发重新计算后,TODAY() 可能更新为当天日期;它也可能在不重新打开文件的情况下更新。
少量记录:直接输入固定日期
如果手动录入,在 Windows 版 Excel 中选中 A 列对应的单元格,按 Ctrl + ; 即可插入当天的固定日期。
这个日期没有公式,不会因重新计算而改变,适合记录量较少时使用。
自动记录:用 VBA 在 B 列变更时写入日期
以下示例假设第 1 行为表头,销售记录从第 2 行开始。在 B 列输入买家时,如果对应的 A 列单元格为空,代码会写入电脑当前日期;已有日期会保留。
- 在支持 VBA 的桌面版 Excel 中,右键单击目标工作表的标签,选择“查看代码”。
- 将以下代码放入该工作表的代码模块。
- 将工作簿保存为
.xlsm,并在允许宏运行的环境中使用。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim changedBuyers As Range
Dim buyerCell As Range
Set changedBuyers = Intersect(Target, Me.Range("B2:B" & Me.Rows.Count))
If changedBuyers Is Nothing Then Exit Sub
On Error GoTo HandleError
Application.EnableEvents = False
For Each buyerCell In changedBuyers.Cells
If Not IsError(buyerCell.Value2) Then
If Len(Trim$(CStr(buyerCell.Value2))) > 0 Then
With Me.Cells(buyerCell.Row, "A")
If IsEmpty(.Value2) Then
.Value = Date
.NumberFormat = "yyyy-mm-dd"
End If
End With
End If
End If
Next buyerCell
Application.EnableEvents = True
Exit Sub
HandleError:
Application.EnableEvents = True
MsgBox "日期写入失败:" & Err.Description, vbExclamation
End Sub
事件触发时,Date 取得系统日期,代码将其作为值写入 A 列。重新打开工作簿后,这个日期不会自动更新。
代码会逐个处理一次粘贴到 B 列的多个单元格。修改已有买家名称时,如果 A 列已有日期,代码不会覆盖;删除买家信息时,代码也不会自动清除日期。
使用前需要处理已有公式
A 列中已有的 TODAY() 公式需要先处理,否则它们仍会继续更新,而且代码会将这些单元格视为已有内容。
- 对于日期仍然正确的记录,可以复制 A 列相应区域,再使用“选择性粘贴 → 值”固定当前结果。
- 对于尚未录入买家的空白记录行,应清除 A 列预填的公式,让代码有空白单元格可写入。
- 如果历史日期已经变成今天,粘贴为值只能固定现在显示的日期。真实销售日期需要从备份、订单记录等已有资料中恢复。
该方案适用于直接编辑或粘贴 B 列的操作。如果 B 列的内容因公式重新计算而变化,Worksheet_Change 不会触发。Excel 网页版也不能运行这段 VBA。
不建议用引用自身的嵌套 IF 配合迭代计算来保存销售日期:这种做法依赖循环引用和工作簿设置,维护时容易出错。使用明确写入的日期值更容易核对销售记录。
备注:内容仅供参考。
