我的工作单位有一份 CSR 表,我们用它来自助服务。我们的想法是,每天接听电话时填写每一行,然后通过电子邮件发送给我们的老板。我在底部放了一张表格示例。
然而,我遇到的问题是我们填写这些行非常快(大约每分钟一次),而对于我和其他用户来说,继续输入时间和日期感觉是多余的(因为日期值当然是全天相同的)。
所以我尝试使用Now()
工作表函数,但时间是动态的,所以每次我开始新的一行时,所有时间都会更新。我尝试在这里阅读有关 VBA 的内容,但我就是不明白。
我的问题是:当我将数据放入 E、F 和 G 列时,如何让此电子表格输入日期和时间并使其在 C 和 D 列中保持静态?这样我们就不必自己手动输入了?
这是示例:
A | 乙 | C | 德 | 埃 | F | G | H | |
---|---|---|---|---|---|---|---|---|
1 | 代理名称 | 导师 | 日期 | 时间 | 您收到回拨了吗? | 您是否已验证 HIPPA ? | 你们提供自助服务吗? | |
2 | 亚历克斯 | 丽贝卡 | 2022 年 12 月 14 日 | 下午 4:34 | 是的 | 是的 | 是的 | |
︙ | ︙ | ︙ |
[转录自这个图片]
我正在尝试找到一种方法来尽可能优化流程!手动输入日期和时间会导致生产速度变慢并出现错误。许多用户受教育程度不高或年事已高,可能难以掌握Ctrl+; 和 Ctrl++Shift;。
答案1
无意冒犯,但:你有多懒?如果你输入Ctrl+;(在 C 列中),Excel 将插入当前日期作为静态值。 键入Tab(或 →)(移至 D 列),然后Ctrl+ Shift+;插入当前时间。
答案2
创建此 VBA 例程:
Private Sub Worksheet_Change(ByVal Target As Range)
Static recursive As Integer
Dim cur_row As Integer
Dim cur_time
Const date_col As Integer = 3
Const time_col As Integer = 4
cur_row = Target.Row
If recursive = 0 And Cells(cur_row, date_col) = "" And Cells(cur_row, time_col) = "" Then
recursive = 1
cur_time = Now()
Cells(cur_row, date_col) = Int(cur_time)
Cells(cur_row, time_col) = cur_time - Int(cur_time)
Cells(cur_row, date_col).NumberFormat = "m/d/yyyy"
Cells(cur_row, time_col).NumberFormat = "h:mm AM/PM"
recursive = 0
End If
End Sub
每次更改任何单元格时都会调用它。
- 例程中的赋值语句
Worksheet_Change
会更改工作表,因此会触发对例程的递归调用。我们使用recursive
变量来检测这种情况并防止递归执行。 - 声明当前行和当前日期/时间的变量。
- 声明整型常量来指定日期列(
C
)和时间列(D
)。 - 设置
cur_row
为包含已更改单元格的行。 - 如果不是递归调用,并且当前行中的日期和时间为空,则
- 获取当前日期/时间(Excel 日期/时间值,即整数日期加上天数的分数)。
- 将日期单元格(在当前行)设置为今天的日期(的整数部分
cur_time
)。 - 将时间列设置为小数残差(时间;0 = 午夜,0.25 = 早上 6 点,0.5 = 中午,0.75 = 下午 6 点,等等)。一旦输入这些值,它们就是静态的。
- 设置单元格的格式。
请注意,这只会在第一次修改行时执行该操作(除非用户清除 C
和 D
列)。如果用户同时更改多行中的单元格,则只会处理第一个单元格。
您可能需要考虑隐藏列C
和 D
,以便用户不会对它们感到困惑,并且不需要明确跳过它们。
如何在 MS Office 中添加 VBA?是开始使用 VBA 机制的有用参考。