【问题标题】:Copying dates from CSV into Excel while retaining date formatting在保留日期格式的同时将日期从 CSV 复制到 Excel
【发布时间】:2021-03-13 11:05:01
【问题描述】:

我将各种 CSV 文件中的信息复制到 Excel 工作表中。这些文件是来自 Symantec 的报告,其中包括上次扫描日期、定义日期等。

当我在 Excel 中查看 CSV 时,日期格式为自定义 dd/mm/yyyy hh:mm。

我正在尝试使用 VBA 脚本运行这些文件并列出 30 天内未扫描的系统的信息。

当信息被复制时,一些日期格式变为General,并显示正确的格式dd/mm/yyyy。
其他变为自定义,并将日期值切换为 mm/dd/yyyy,但保持显示相同。因此,不是将 01/12/2020 读取为 12 月 1 日,而是将其读取为 1 月 12 日。任何带有数字 1-12 的日期似乎都被读取为 mm/dd/yyyy,而不是原始配置为的 dd/mm/yyyy 格式。

是否有 VBA 代码可将 CSV 上的日期值转换为长数字,然后再将它们复制到 Excel 工作表中,然后再将该数字转换回日期格式?

我尝试使用 .numberformat "dd/mm/yyyy" 选项和 .numberformat "General"。

要打开每个 CSV 文件,我执行以下操作:

strFile = Dir(strSourcePath & "*.csv")
Cnt = Cnt + 1
    If Cnt = 1 Then
        r=2
    Else
        r = Cells(rows.count, "A").End(xlUp) + 1
    End If

Open strSourcepath & strFile For Input as #1
    inputRow = 1
        Line Input #1, strData
        If inputRow > 1 Then
            inputRow - inputRow +1
                X = Split(strData, ",")
                For c = 0 To UBound(X)
                    Cells(r, c + 1).Value = Trim(X(c))
                Next c
                r = r + 1
            Else
                inputRow = inputRow + 1
            End If
        Loop
    Close #1
    strFile = Dir
    Loop

【问题讨论】:

  • 在单步执行代码时,我还发现它基本上是使用 trim 命令将每个逗号分隔值复制到目标单元格中​​。我发现在 VBA 中,字符串值为 2020 年 1 月 12 日,但一旦将其复制到工作表中,它就会更改为 2020 年 1 月 1 日。我很想知道是什么原因造成的
  • 您能在 CSV 文件中包含几行吗?
  • 这可能需要一段时间,因为我的 Internet PC 和我正在使用的 PC 之间没有直接访问权限。我可能有一些样本数据,以后可以从我其他办公室的测试工作站中包含在内。该文件有 90 多列和 1000 多行,我正在尝试从一个文件夹中导入多个 CSV,因此我不能只手动导入 csv。
  • 我什至无法复制一行,因为它超出了字符数限制。我可以显示我遇到问题的单元格: 12/07/2020 11/08/2020 12:41 19/09/2020 07:26:55 前两个日期将反转为 12 月 7 日和 11 月 8 日,而底部将保持在 9 月 19 日。希望这会有所帮助

标签: excel vba date number-formatting


【解决方案1】:

因此,问题已通过更深入的方式解决。

我现在使用 workbook.open(filename, local:=True) 选项打开 CSV,这样可以保持日期格式正确。

然后我简单地使用 TargetCell("range").value = SourceCell("Range").value 命令来复制数据。

感谢大家的尝试。我在Date formats/values change when file is opened programmatically

偶然发现了同样的问题

这让我的文件正确打开,然后我可以相应地调整我的代码。

【讨论】:

    【解决方案2】:

    我将日期存储为 Long 数据类型。

    想象在单元格 A1 中有:

    1/12/20
    

    这是 [2020 年 12 月 1 日],而不是 1 月 12 日。 所以我的代码是:

    dim MyDate as long
    MyDate = Clng(CDate(Cells(1,1)))
    

    所以,现在我可以将日期作为长数据类型使用,并在 VBA 中执行任何操作。当我需要打印出来时,Excel 肯定会知道是哪个日期。

    【讨论】:

    • 我认为问题在于它读取 CSV 文件的方式。它本质上是读取整行 CSV 数据,然后使用 trim 命令从该行的适当部分获取信息,因此它不会将其作为字符串以外的任何内容读取,然后当信息被添加到单元格中时, excel 将其解释为日期并将其转换为错误的格式。当日期显然是英国格式时,它不会那样做。有没有更好的方法将多个 CSV 文件读入我的项目中的单个工作表?谢谢
    猜你喜欢
    • 2013-01-05
    • 2019-02-23
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2015-05-02
    • 2018-03-03
    • 2016-11-23
    • 2015-09-30
    相关资源
    最近更新 更多