首页 > 解决方案 > 我需要识别 Excel VBA 中各种格式的日期并将其转换为标准输出格式

问题描述

我经常从客户那里收到 CSV 格式的数据集。我正在尝试创建一组 Excel VBA 宏来预清理数据。我特别遇到的一个问题是处理日期。

在我现在正在查看的一组日期中,一些日期字段包含以这种方式格式化的日期:

2016-03-25 14:18:03

而其他的格式如下:

2016-03-25 14:18:02.566000

When Excel opens the CSV, the first format, the one without fractions of a second, displays as 3/25/2016 14:18, and when that cell is selected, the formula bar contains 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 这样做,我可以找到。

那么......有人有什么好主意吗?现在,我必须打开文件并手动重新格式化每个文件的日期......当一些文件有数百万行数据时,这对于动手过程来说非常耗时。

标签: excelvbadate

解决方案


从您的评论中收集,您很可能不得不采用比较您的整数/小数的转换值并查看它们是否属于以下日期范围的 hacky 方法:

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用作边界的变量。


推荐阅读