基于时间在Excel行中填入A/B/C值的VBA代码调试问题
修正后的VBA代码实现需求
原代码存在三个核心问题:
- 跨天时间范围判断逻辑错误:VBA中
TimeValue返回0~1的小数(0代表00:00,1代表24:00),22:00的数值远大于05:00,Time >= TimeValue("22:00:01") And Time <= TimeValue("05:00:00 AM")的条件永远无法成立。 - 嵌套If结构逻辑颠倒:三个时间区间互斥,嵌套结构导致只有第一个条件满足时才会检查后续条件,完全不符合需求。
- 单元格引用语法错误:
Range("G", Target.Row)应为Range("G" & Target.Row)。
以下是修正后的代码,假设时间数据存储在当前行的A列(可根据实际情况修改单元格引用):
Sub FillTimeCategory(ByVal Target As Range, ByVal wksCurSheet As Worksheet) Dim cellTime As Date ' 获取当前行的时间值(假设时间在A列,可修改为实际列) cellTime = TimeValue(wksCurSheet.Range("A" & Target.Row).Value) Select Case cellTime Case TimeValue("14:00") To TimeValue("22:00") wksCurSheet.Range("G" & Target.Row).Value = "A" Case TimeValue("05:00") To TimeValue("14:00") wksCurSheet.Range("G" & Target.Row).Value = "B" Case Else ' 覆盖22:00至次日05:00的区间 wksCurSheet.Range("G" & Target.Row).Value = "C" End Select End Sub
若偏好使用If-ElseIf结构,可改用以下代码:
Sub FillTimeCategory(ByVal Target As Range, ByVal wksCurSheet As Worksheet) Dim cellTime As Date cellTime = TimeValue(wksCurSheet.Range("A" & Target.Row).Value) If cellTime >= TimeValue("14:00") And cellTime <= TimeValue("22:00") Then wksCurSheet.Range("G" & Target.Row).Value = "A" ElseIf cellTime >= TimeValue("05:00") And cellTime <= TimeValue("14:00") Then wksCurSheet.Range("G" & Target.Row).Value = "B" Else ' 处理22:00到次日05:00的跨天情况 wksCurSheet.Range("G" & Target.Row).Value = "C" End If End Sub
关键说明
- 时间提取:通过
TimeValue提取单元格的时间部分,忽略日期,确保仅判断时间区间。 - 跨天区间处理:用
Case Else或Else覆盖22:00至次日05:00的区间,避免因数值逻辑矛盾导致的判断失效。 - 灵活适配:若时间数据不在A列,只需修改
Range("A" & Target.Row)为实际存储时间的列即可。
内容的提问来源于stack exchange,提问作者Nahuel Diaz
相关产品推荐
相关产品推荐

