我需要确定Excel VBA中的各种格式的日期并将其转换为标准输出格式

时间:2019-01-21 21:01:17

标签: excel vba date

我经常从客户端接收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>

1 个答案:

答案 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

lowDatehighDate是您要初始化并用作边界的变量。