我经常从客户端接收CSV格式的数据集。我正在尝试创建一组Excel VBA宏以预先清理数据。我特别遇到的一个问题是处理日期。
在我现在正在查看的集合中,一些日期字段包含以这种方式格式化的日期:
2016-03-25 14:18:03
其他格式如下:
2016-03-25 14:18:02.566000
当Excel打开CSV时,第一种格式(不带小数秒的格式)显示为3/25/2016 14:18,并且选中该单元格后,公式栏将包含3/25/2016 2:下午18:03。对于第二种格式,它以mm:ss.0格式(18:02.6)显示,并且如果我在excel中选择该字段,则它在编辑栏中的显示方式与第一种相同。
我正在尝试编写宏以标识该字段是否为日期。 IsDate
函数仅将第一种格式标识为日期。当我查看传递给第二个值的值时,它显然已将日期转换为十进制值(在这种情况下为42454.59586080556
)。当我尝试将其设置为日期格式时,会引发错误。
当前,在Excel VBA中,我循环浏览活动工作表(ActiveSheet.UsedRange.Cells
)中所有使用的单元格。然后使用每个单元格:If IsDate(Cell.Value) Then
,如果将其标识为日期,则将其格式化为我指定的输出格式。但是,当它以小数形式传递时,它不是日期,因此它会跳过格式。
我在数据中还有其他字段,它们是整数和小数,因此如果通过这种方式来处理值,我不能简单地添加另一个if语句。
我现在唯一能想到的就是尝试将小数转换为日期(我已经看到了一种方法,但是目前似乎无法找到它),然后测试看看它是否在预期的范围,如果不是,则保留小数,如果是,则保留日期。但这似乎不可行。
我可以编写它来指定列,但是数据并不总是以相同的顺序(不同的来源,不同的格式)随列输入。
核心问题似乎是Excel在打开文件时试图转换字段中的数据。我找不到能阻止Excel执行此操作的方法。
那么...有人有什么好主意吗?现在,我不得不打开文件并手动重新格式化每个文件上的日期...并且当某些文件具有数百万行数据时,这对于动手过程非常耗时。 / p>
答案 0 :(得分:1)
从您的评论中收集信息,您很可能必须采取比较有技巧的方法来比较整数/小数的转换值,并查看它们是否在以下日期范围内:
If IsDate(Cell.Value) Then
'Do Stuff
ElseIf IsNumeric(Cell.Value) And InStr(1, Cell.Value, ".") > 0 Then
If CDate(Left(Cell.Value, InStr(1, Cell.Value, ".") - 1)) > lowDate And CDate(Left(Cell.Value, InStr(1, Cell.Value, ".") - 1)) < highDate Then
'Do Stuff
End If
End If
lowDate
和highDate
是您要初始化并用作边界的变量。