excel - 我需要识别 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 这样做,我可以找到。
那么......有人有什么好主意吗?现在,我必须打开文件并手动重新格式化每个文件的日期......当一些文件有数百万行数据时,这对于动手过程来说非常耗时。
解决方案
从您的评论中收集,您很可能不得不采用比较您的整数/小数的转换值并查看它们是否属于以下日期范围的 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
您将在哪里初始化lowDate
并highDate
用作边界的变量。
推荐阅读
- c++ - 基数转换器的编译问题
- html - 无法获取第一个嵌套订单列表 html
- swift - Swift AVQueuePlayer 完成播放视频
- node.js - 禁用或删除 npm 包中的某些功能
- shake-build-system - 如何在 Shake 中获取控制台输入?
- python - 气流:无法使用 Bigquery 挂钩创建视图
- sql-server - SSRS 2008 查询:来自所选参数的表名
- go - 是否可以使用 Bazel 构建 Go 库而不是二进制文件?
- javascript - 裁剪图像时出错
- asp.net - 从 Ajax 响应中的 WebSerice 返回 json 对象